此代码使用 Vigenère 密码加密。我从 dll 库连接到主程序。
String symbols="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i,j,c,sum;
void Keycode(String s){
for(int i=1;i<=symbols.Length();i++)
if (s==symbols[i])
c=i;
}
extern "C" char* __declspec(dllexport) Viziner_shif(String key, String text)
{
String result;
for(i=1;i<=text.Length();i++){
if(j>=key.Length())
j=0;
j++;
Keycode(text[i]);
sum=c;
Keycode(key[j]);
sum=sum+c;
if(sum>118)
sum=sum-118;
result+=symbols[sum];
}
j=0;
return AnsiString(result).c_str();
}
extern "C" char* __declspec(dllexport) Viziner_deshif(String key, String text)
{
String result;
for(i=1;i<=text.Length();i++)
{
if(j>=key.Length())
j=0;
j++;
Keycode(text[i]);
sum=c;
Keycode(key[j]);
sum=sum-c;
if(sum<1)
sum=sum+118;
result+=symbols[sum];
}
j=0;
return AnsiString(result).c_str();
}
像这样传递变量key并text从主程序开始......
// ENCRYPTION
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HINSTANCE DLL = LoadLibrary(_T("Dll.dll"));
// исходный текст
AnsiString textl = Edit3->Text;
String text = System::String(textl.c_str());
//ключ
AnsiString keyl= Edit1->Text;
String key = System::String(keyl.c_str());
// Проверяем наличие DLL
if (DLL)
{
// Обращаемся к функции
Viziner_SH = (Viziner_shif *) GetProcAddress(DLL,"_Viziner_shif");
if (Viziner_SH)
{
string abc = Viziner_SH(key, text);
Memo1->Lines->Add(abc.c_str());
}
else ShowMessage("DLL not found!");
}
else
{
ShowMessage(SysErrorMessage(GetLastError()));
ShowMessage("Unable to load the DLL");
}
FreeLibrary(DLL); // выгружаем DLL библиотеку
}
正在进行加密:"Stack Overflow"c key = П->ИрYазHЕтвогилу
进一步解密:"ИрYазHЕтвогилу"c key = П->StackПOverflow
为什么插入字符而不是空格???
您的字典不以任何方式支持空格,因此该函数
Keycode不会更改变量的值,с并且它保持等于上一次迭代的值。要使此密码起作用,只能使用已知字符作为输入。因此,您要么需要添加一个空格,要么在加密之前将其从文本中删除。我认为最好的方法是添加
+到字典中,在加密之前将空格更改为加号,然后在加密后更改回空格。在这种情况下,加密的字符串不会被空格打断。