简单的仿射密码加密

时间:2019-10-01 16:43:17

标签: c++ encryption cryptography

我正在编写两个使用仿射密码对消息进行加密和解密的函数。出于某种原因,我的加密和解密过程差几个字母。我觉得问题与ASCII数字不匹配a = 0,z = 25格式有关。有人可以帮我弄清楚发生了什么吗?

Cleopatra应该加密为whkcjilxi

MZDVEZC应该解密为anthony

但是,我得到了

Cleopatra = ZKNFMLOAL

MZDVEZC = NAGUBAL

主要功能:

int main() {
    plaintext = "cleopatra";
    ciphertext = affine_encrypt(plaintext, 7, 8);

    cout << "4. Encryption of the plaintext: " << plaintext << endl;
    cout << "   Key: 7x+8" << endl;
    cout << "   Ciphertext: " << ciphertext;
    cout << endl << endl;

    ciphertext = "MZDVEZC";
    plaintext = affine_decrypt(ciphertext, 5, 12);

    cout << "5. Decryption of the ciphertext: " << ciphertext << endl;
    cout << "   Key: 5x+12" << endl;
    cout << "   Inverse of 5 is " << affineInverse(5) << endl;
    cout << "   Plaintext: " << plaintext << endl << endl;
    return 0;
}
string affine_decrypt(string message, int a, int b)
{
    string dtxt;
    for (int i = 0; i < message.length(); i++)
    {
        dtxt = dtxt + (char)(((affineInverse(a)*(message[i] - b) % 26)) + 65);
    }

    return dtxt;
}

string affine_encrypt(string message, int a, int b)
{
    string ctext = "";

    for (int i = 0; i < message.length(); i++)
    {
        ctext = ctext + (char)((((a * message[i]) + b) % 26) + 65);
    }

    return ctext;
}

int affineInverse(int input)
{
    int check = 0;

    for (int i = 0; i < 26; i++)
    {
        check = (input * i) % 26;

        if (check == 1)
        {
            check = i;
        }
    }

    return check;
}

1 个答案:

答案 0 :(得分:1)

您忘记在应用仿射加密之前从字符中减去a

ctext = ctext + (char)((((a * ( message[i] - 'a' ) ) + b) % 26) + 65);

如果使用大写字母,则应使用'A'。通常,将它们全部转换为upperlower大小写是一个好主意。通常在经典密码学中,大写是首选。

您需要检查解密。

更新:解密中的陷阱

您忘记从'A'取代message[i]

当构造message[i] - 'A' - 26时,结果可能为负。您必须确保它是肯定的。

此内联函数

inline int positive_modulo(int i, int n) {
    return (i % n + n) % n;
}
this answer中的

可以帮助您始终从模数中获得正结果。

此外,从编程的角度来看,首先尝试解密您加密的内容。