替换加密不返回字符

时间:2016-11-15 05:08:00

标签: c++ encryption

我目前正在尝试制作替代加密/解密程序。该程序从文件读取并基于用户给定的密钥逐个字符地加密。例如,如果文件显示“ATTACK AT DAWN”并且给出的密钥是“LEMON”,则生成的密文将为“LXFOPV EF RNHR”。

我已经创建了加密功能,但是,它会将值更改为字母数字以外的字符。任何帮助,将不胜感激。我已粘贴以下功能:

void encrypt(ifstream& in_s, ofstream& out_s, char next, char& cypher, int& i, char key[])
{

    in_s.get(next); // get character from file
    while (!in_s.eof())
    {
            check_i(i); // check i value is within the constraint for key[4]

            if(isupper(next)) // if uppercase run cypher
            {
                    cypher = ((next - 65) + (key[i] - 65) % 26) + 65;
            }
            else if (islower(next))
            {
                    next = toupper(next); // change to upper
                    cypher = ((next - 65) + (key[i] - 65) % 26) + 65;
                    cypher = tolower(cypher); // change to lower
            }
            else // if blank do nothing
            {
                    cypher = next;
            }
            cout << cypher;


            in_s.get(next); // get next char
            i++; // add 1 to i for key[i]
    }
}

2 个答案:

答案 0 :(得分:0)

operator precedence出现问题。模运算符%的优先级高于加法。所以,让我们分解你的总和:

cypher = ((next - 65) + (key[i] - 65) % 26) + 65;

这将按照以下方式处理:

cypher = ( next - 65 )
       + ( (key[i] - 65) % 26 )
       + 65;

你真正想要的是模数在整个事情中采取行动:

cypher = ( (next - 65 + key[i] - 65) % 26 ) + 65;

你实际上并不需要那套外围的括号,但它会使它更容易阅读。

答案 1 :(得分:0)

问题是我如何获取数组的输入。 我试图做这样的事情:

cout << "Please enter a 5 character key: ";
cin >> key[5];

当我应该像这样存储数组时:

cout << "Please enter a 5 character key: ";
cin >> key;