我正在编写一个程序,用特定的密钥和一半缩减算法对C ++中的文本进行加密。它可以正常工作,但是当我想解密相同的文本并且想要将密文返回为纯文本时,会给我错误的字符。这是一个加密功能:
int encryption()
{
cout << "please enter the plain text" << endl;
char LUT[] = "opqrstuvwxyzabcdefghijklmn";
char message[100];
char ch;
int i;
cin.getline(message, 100);
for (i = 0; message[i] != '\0'; ++i) {
ch = message[i];
if (isupper(ch))
message[i] = toupper(LUT[ch - 'A']);
else
message[i] = LUT[ch - 'a'];
}
cout << "the cipher text is equal to" << message << endl;
return 0;
}
按
是正常的a
我会得到
o
也
b是p
但是当我想为相同的东西编写反向函数时,它不起作用。我的意思是,当我想将按下的字符添加到“ a”索引时,它给了我错误的字符。实际上,它应该返回
a
当我按下
o
这是我的功能:
int decryption()
{
cout << "please enter the cipher text" << endl;
char LUT[] = "opqrstuvwxyzabcdefghijklmn";
char message[100];
char ch;
int i;
cin.getline(message , 100);
for (i = 0; message[i] != '\0'; ++i) {
ch = message[i];
if (isupper(ch))
message[i] = toupper(LUT[ch + 'A']);
else
message[i] = LUT[ch + 'a'];
}
cout << "the plain text is equal to" << message << endl;
return 0;
}
感谢您的任何建议或告诉我在哪里出现语义错误
答案 0 :(得分:4)
您的代码采用ASCII编码。
使用ASCII时,'o'
的值为111
,而'a'
的值为97
。因此,当您执行ch + 'a'
时,实际上就是111 + 97
等于208
。您的LUT
数组的索引无效。
您应该继续以使用ch - 'a'
,并将LUT
数组修改为相反的翻译,因此'o'
映射到'a'
而不是相反。
答案 1 :(得分:2)
你说一半减少算法。基本上,您的编码字符串应该是
char LUT [] = "nopqrstuvwxyzabcdefghijklm";
在这种情况下,应用相同的编码算法将使您返回原始字符串。它必须在末尾是前13个字符,在末尾是最后13个字符(将字母旋转13次)
但是,如果您想保留编码字符串(向左旋转12圈),则解码字符串应为
mnopqrstuvwxyzabcdefghijkl
(向右旋转12圈)。除了必须使用完全相同的算法。
({ch-'a'
和ch-'A'
)