我写了一个简单的程序,它应该加密和解密消息XOR密码。 我将范围限制在字母表中的字符(小字符)。 加密工作正常,但解密后的消息不匹配。 如果我在不受限制的情况下运行程序(没有这个%26 + 97),它就可以了。
#include <iostream>
using namespace std;
int main(){
char message[7] = "string";
char key[5] = "abcd";
char encrypted[7];
size_t sizeTab = strlen(message);
cout << sizeTab << endl;
cout << "ENCRYPTION" << endl;
int i = 0;
do{
encrypted[i] = ((message[i] ^ key[i%4])%26 + 97);
}while(i++ < sizeTab - 1);
encrypted[sizeTab] = '\0';
cout << encrypted << endl;
cout << "DECRYPTION" << endl;
i = 0;
do{
encrypted[i] = ((encrypted[i] ^ key[i%4])%26 + 97);
}while(i++ < sizeTab - 1);
cout << encrypted << endl;
return 0;
}
例如,如果我在条目上有消息:字符串 加密后: swrnpf 解密后: svrkre
我做错了什么,我应该纠正什么? 谢谢你的帮助。
答案 0 :(得分:2)
如果我在没有限制字母的情况下运行程序(没有这个%26 + 97),它就可以了。
那是因为%26 + 97
部分是错误的。模运算会丢失信息,这使得无法再次正确解密消息。
也许您正在寻找的是Vigenère cipher?有了它,您可以将密文保持在与明文相同的字母表中(这似乎是您尝试实现的目标),并且仍然与您的方法非常相似。