为什么这不是解密?

时间:2018-11-01 10:04:59

标签: c++ arrays encryption char

我正在编写一个程序,用特定的密钥和一半缩减算法对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;
}

感谢您的任何建议或告诉我在哪里出现语义错误

2 个答案:

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