gpt4 book ai didi

c++ - 简单仿射密码加密解密

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:56 27 4
gpt4 key购买 nike

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

Cleopatra 应该加密为 whkcjilxi,

MZDVEZC 应解密为 anthony

但是,我得到了

埃及艳后 = 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;
}

最佳答案

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

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

如果您使用大写字母,则应使用“A”。通常,将它们全部转换为 upper 是个好主意。或 lower案件。通常在经典密码学中大写是首选。

检查解密就交给你了。

更新:解密中的陷阱:

您忘记从 message[i]

中减去 'A'

当您对 message[i] - 'A' - 26 进行子结构化时,结果可能为负。你必须确保它是正的。

这个内联函数

inline int positive_modulo(int i, int n) {
return (i % n + n) % n;
}

来自 this answer帮助您始终从模数中获得积极的结果。

另外,从编程的方式来说,首先尝试解密你加密的内容。

关于c++ - 简单仿射密码加密解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com