我正在尝试基于此页面实现字符串的编码和解码
http://www.thecrazyprogrammer.com/2016/11/caesar-cipher-c-c-encryption-decryption.html
这是代码,
string encryptString(string message){
int i, key=95828205;
char ch;
for(i = 0; message[i] != '\0'; ++i){
ch = message[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch + key;
if(ch > 'z'){
ch = ch - 'z' + 'a' - 1;
}
message[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
ch = ch + key;
if(ch > 'Z'){
ch = ch - 'Z' + 'A' - 1;
}
message[i] = ch;
}
}
printf("Encrypted message: %s", message);
return message;
}
string decryptString(string message){
int i, key=95828205;
char ch;
for(i = 0; message[i] != '\0'; ++i){
ch = message[i];
if(ch >= 'a' && ch <= 'z'){
ch = ch - key;
if(ch < 'a'){
ch = ch + 'z' - 'a' + 1;
}
message[i] = ch;
}
else if(ch >= 'A' && ch <= 'Z'){
ch = ch - key;
if(ch < 'A'){
ch = ch + 'Z' - 'A' + 1;
}
message[i] = ch;
}
}
printf("Decrypted message: %s", message);
return message;
}
并调用函数,
string msg="test.com",msg1,msg2;
msg1 = encryptString(msg);
msg2 = decryptString(msg1);
但我在解密数据时会得到一些随机字符
答案 0 :(得分:3)
您已定义
key=95828205;
然后将它添加到数组中的字符并将其存储到数组
if(ch >= 'a' && ch <= 'z'){
ch = ch + key;
message[i] = ch;
...
这意味着角色已经溢出并且有一些随机数。
然后,如果您尝试检查(在加密中)
if(ch >= 'a' && ch <= 'z'){
ch = ch - key;
该值在该时间间隔内没有很高的变化。
待办事项
你应该交换这些行(首先得到真实的字母,然后比较它)
ch = ch - key;
if(ch >= 'a' && ch <= 'z'){
...
并使用不会导致key
溢出的char
(例如5)
修改强>
更改后测试
<强>输入强>
Message: test
Key: 5
来自加密的输出
yjxy
解密输出
test
答案 1 :(得分:1)
只有127个有效的ascii字符(7位)。如果你添加更多并转换回&#39; char&#39;你会得到不正确的结果。
您可以使用简单的代码
进行测试int main()
{
char c = 'u';
char n = c+10;
printf("0x%x 0x%x\n",c,n);
return 0;
}
设置&#39; c&#39;的值除了字母u,你将得到不正确的结果。示例c =&#39; v&#39;给出:
kmukadam@4W28N62: ./a.out
0x76 0xffffff80