我在C ++中为Vigenere Cipher编写了这段代码(假设明文和密钥是小写的)。
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时,key [j]变为NULL(0)。例如。如果我假设明文为'人'并且键为'abcd',则明文的前4个字符被正确加密,但对于最后一个字符,键[j]值变为0或Null而不是返回到'a'。
我不确定为什么会这样。我猜字符串类隐式处理Null值,这让我更加困惑。
key[j] -= 97;
在第一次通过密钥时,这段代码将遍布它。
如果key
是“abcd”,则在第二次传球时它将为0。
不要在函数中修改key
。由于该参数不应更改,因此应将其声明为const std::string key
,或者更好的是,const std::string &key
。如果以这种方式完成,编译器将为您捕获此错误。