Caesar Cipher的问题在C ++中无法正确解密

问题描述 投票:0回答:1

我知道这个问题已经问过几次了,我可能错过了可以回答我的特定问题的问题,但是我似乎找不到能给我一个适合我的答案的问题。

[当我解密凯撒密码时,它似乎不能正确环绕,我的代码似乎遵循了凯撒密码的特定数学原理,但是当它应该环绕时,它似乎返回了垃圾输出。我的代码如下,包括我用来测试问题的系统。

#include "main.h"
#include <QCoreApplication>
#include <QDebug>
String caesarCipher(QString in, int shift, bool decrypt)
/*
 * Caesar shift is mathmatically represented as e = (q + s) mod 26
 * Decryption is represented as d = (q - s) mod 26
 * ROT13 is a caesar shift with 13 shift
*/
{
    QString out;
    if (!decrypt)
    {
        for (int i = 0; i < in.length(); ++i)
        {
            if (in[i] >= 'a' && in[i] <= 'z')
            {
                int q = (in[i].unicode() - 'a');
                int e = (q + shift) % 26;

                out += e + 'a';
            }
            else if (in[i] >= 'A' && in[i] <= 'Z')
            {
                int q = (in[i].unicode() - 'A');
                int e = (q + shift) % 26;
                out += e + 'A';
            }
            else
                out += in[i];
        }
        return out;
    }
    else
    {
        for (int i = 0; i < in.length(); ++i)
        {
            if (in[i] >= 'a' && in[i] <= 'z')
            {
                int q = (in[i].unicode() - 'a');
                int d = (q - shift) % 26;
                int r = d + 'a';
                out += r;
            }
            else if (in[i] >= 'A' && in[i] <= 'Z')
            {
                int q = (in[i].unicode() - 'A');
                int d = (q - shift) % 26;
                int r = d + 'A';
                out += r;
            }
            else
                out += in[i];
        }
        return out;
    }
}

int main() // Testing
{
    QString testString = "abcdefghijklmnopqrstuvwxyz";
    QString upperTest = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const int shifting = 3;


    qDebug() << "Test String: " << testString;
    qDebug() << "Test String (Upper): " << upperTest;
    {
    QString e = caesarCipher(testString, shifting, false);
    QString E = caesarCipher(upperTest, shifting, false);
    QString d = caesarCipher(e, shifting, true);
    QString D = caesarCipher(E, shifting, true);
    qDebug() << "Shift amount: " << shifting;
    qDebug() << "Encrypt (Lower): " << e;
    qDebug() << "Encrypt (Upper): " << E;
    qDebug() << "Decrypt (Lower): " << d;
    qDebug() << "Decrypt (Upper): " << D;
    }
    return 0;
}

预期结果是

Test String:  "abcdefghijklmnopqrstuvwxyz"
Test String (Upper):  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Shift amount:  3
Encrypt (Lower):  "defghijklmnopqrstuvwxyzabc"
Encrypt (Upper):  "DEFGHIJKLMNOPQRSTUVWXYZABC"
Decrypt (Lower):  "abcdefghijklmnopqrstuvwxyz"
Decrypt (Upper):  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Press <RETURN> to close this window...

我得到的结果:

Test String:  "abcdefghijklmnopqrstuvwxyz"
Test String (Upper):  "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Shift amount:  3
Encrypt (Lower):  "defghijklmnopqrstuvwxyzabc"
Encrypt (Upper):  "DEFGHIJKLMNOPQRSTUVWXYZABC"
Decrypt (Lower):  "abcdefghijklmnopqrstuvw^_`"
Decrypt (Upper):  "ABCDEFGHIJKLMNOPQRSTUVW>?@"
Press <RETURN> to close this window...

我已经尝试过移动代码,更改移出的位置,完成取模的位置以及添加'a'字符的位置

供参考,代码最初是在我出于可读性而对其进行更改之前:

for (int i = 0; i < in.length(); ++i)
{
    if (in[i] >= 'a' && in[i] <= 'z')
        out.resultString += (((in[i].unicode() - 'a') - shift) % m) + 'a';
    else if (in[i] >= 'A' && in[i] <= 'Z')
        out.resultString += (((in[i].unicode() - 'A') - shift) % m) + 'A';
    else
        out.resultString += in[i];
}
c++ caesar-cipher
1个回答
0
投票
%运算符与负数一起使用时可以返回负结果。在您的情况下,解密“ a”时,q将为0,d将为(-3%26),可以为-3。

解决方案是在计算余数之前确保数字为正:

int d = (q - shift + 26) % 26;

或者,如果移位量未知,或者可以大于25,请检查d是否为负,并在初始计算后再加26。
© www.soinside.com 2019 - 2024. All rights reserved.