Данный код шифрует шифром Виженера. Подключаю в основную программу из 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
не меняет значение переменной с
и оно остаётся равным значению с предыдущей итерации.
Чтобы этот шифр работал, на вход должны подаваться только известные символы. Поэтому тебе или надо добавить пробел, или убирать его из текста перед шифровкой. Лучше всего, думаю, добавить +
в словарь, менять пробел на плюс перед шифрованием и обратно после шифрования. В этом случае зашифрованная строка не будет разрываться пробелами
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется объект, который живёт в другом потоке и выполняет различные задачи по запросам или выполняет повторяющиеся задачи
Как называется элемент интерфейса пользователя, который позволяет выбрать путь к файлу или директорию? Такой же элемент, который при установке...
Нужно проверить на четность строку типа wchar_t и добавить в конце символ если она не четнаяНо при работе выдает, что размерность буферного массива...
класс TreeNode наследуется от CalcTree, в классе CalcTree создается указатель на TreeNode => вызывается конструктор TreeNode, который рекурсивно вызывает конструктор...