我正在编写两个使用仿射密码对消息进行加密和解密的函数。出于某种原因,我的加密和解密过程差几个字母。我觉得问题与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;
}
答案 0 :(得分:1)
您忘记在应用仿射加密之前从字符中减去a
ctext = ctext + (char)((((a * ( message[i] - 'a' ) ) + b) % 26) + 65);
如果使用大写字母,则应使用'A'。通常,将它们全部转换为upper或lower大小写是一个好主意。通常在经典密码学中,大写是首选。
您需要检查解密。
更新:解密中的陷阱:
您忘记从'A'
取代message[i]
当构造message[i] - 'A' - 26
时,结果可能为负。您必须确保它是肯定的。
此内联函数
inline int positive_modulo(int i, int n) {
return (i % n + n) % n;
}
this answer中的可以帮助您始终从模数中获得正结果。
此外,从编程的角度来看,首先尝试解密您加密的内容。