Я написал этот код для Vigenere Cipher на C ++ (при условии, что текст и ключ в нижнем регистре).
void encrypt(string& plaintext , string key){
int j = 0;
for(int i=0; i<plaintext.length(); i++){
//cout<<"value of key["<<j<<"] = "<<int(key[j])<<endl;
plaintext[i] -= 97;
key[j] -= 97;
plaintext[i] = ((plaintext[i] + key[j])%26)+97;
j = (j+1)%key.length();
}
}
Проблема в том, что когда j сбрасывается до 0, ключ [j] оказывается равным NULL (0).
Например, Если я предполагаю открытый текст, чтобы быть «человеком» а также ключ, чтобы быть ‘abcd’ первые 4 символа открытого текста зашифрованы правильно, но для последнего символа значение ключа [j] оказывается равным 0 или нулю вместо возврата к «а».
Я не уверен, почему это происходит. Я предполагаю, что строковый класс неявно обрабатывает нулевые значения, что делает его еще более запутанным для меня.
key[j] -= 97;
При первом прохождении ключа этот кусок кода будет набрасываться по всему нему.
Если key
был «abcd», на втором проходе теперь будет 0.
Не модифицируйте key
в вашей функции. Поскольку этот параметр не должен изменяться, он должен быть объявлен как const std::string key
или, еще лучше, const std::string &key
, Если бы это было сделано таким образом, компилятор поймал бы эту ошибку для вас.
Других решений пока нет …