Вместо пробела, вставляет другой символ

376
21 ноября 2021, 22:40

Данный код шифрует шифром Виженера. Подключаю в основную программу из 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

Почему вместо пробела вставляется символ???

Answer 1

В твоём словаре пробел никак не поддерживается, поэтому функция Keycode не меняет значение переменной с и оно остаётся равным значению с предыдущей итерации.

Чтобы этот шифр работал, на вход должны подаваться только известные символы. Поэтому тебе или надо добавить пробел, или убирать его из текста перед шифровкой. Лучше всего, думаю, добавить +в словарь, менять пробел на плюс перед шифрованием и обратно после шифрования. В этом случае зашифрованная строка не будет разрываться пробелами

READ ALSO
Как сделать вторичный поток с постоянный жизненным циклом и управлением

Как сделать вторичный поток с постоянный жизненным циклом и управлением

Имеется объект, который живёт в другом потоке и выполняет различные задачи по запросам или выполняет повторяющиеся задачи

179
GUI WinAPI Directory

GUI WinAPI Directory

Как называется элемент интерфейса пользователя, который позволяет выбрать путь к файлу или директорию? Такой же элемент, который при установке...

105
Проверка на четность строки типа wchar_t

Проверка на четность строки типа wchar_t

Нужно проверить на четность строку типа wchar_t и добавить в конце символ если она не четнаяНо при работе выдает, что размерность буферного массива...

84
Рекурсивный конструктор

Рекурсивный конструктор

класс TreeNode наследуется от CalcTree, в классе CalcTree создается указатель на TreeNode => вызывается конструктор TreeNode, который рекурсивно вызывает конструктор...

166