c加密解密不按预期工作

时间:2017-08-15 07:55:56

标签: c++

我正在尝试基于此页面实现字符串的编码和解码

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);

但我在解密数据时会得到一些随机字符

2 个答案:

答案 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