【发布时间】:2020-02-03 12:44:00
【问题描述】:
我在使用仿射密码解密明文时遇到问题。 加密工作正常,但对小写/大写字符的解密应用相同的逻辑会返回不同的输出。
这是输出:
加密消息是:ulctkbsjarizqhypgxofwnevmd ULCTKBSJARIZQHYPGXOFWNEVMD
解密消息为:opqrstuvwxyzabcdefghijklmn ABCDEFGHIJKLMNOPQRSTUVWXYZ
我怀疑这与检索 ASCII 值有关,有人可以纠正我吗?
这是我的代码:
#include<bits/stdc++.h>
using namespace std;
//Key values of a and b
const int a = 17;
const int b = 20;
string encryptMessage(string plainText)
{
string cipher = "";
for (int i = 0; i < plainText.length(); i++)
{
if(plainText[i]!=' ')
{
if ((plainText[i] >= 'a' && plainText[i] <= 'z') || (plainText[i] >= 'A' && plainText[i] <= 'Z'))
{
if (plainText[i] >= 'a' && plainText[i] <= 'z')
{
cipher = cipher + (char) ((((a * (plainText[i]-'a') ) + b) % 26) + 'a');
}
else if (plainText[i] >= 'A' && plainText[i] <= 'Z')
{
cipher = cipher + (char) ((((a * (plainText[i]-'A') ) + b) % 26) + 'A');
}
}
else
{
cipher += plainText[i];
}
}
else
{
cipher += plainText[i];
}
}
return cipher;
}
string decryptCipher(string cipher)
{
string plainText = "";
int aInverse = 0;
int flag = 0;
for (int i = 0; i < 26; i++)
{
flag = (a * i) % 26;
if (flag == 1)
{
aInverse = i;
}
}
for (int i = 0; i < cipher.length(); i++)
{
if(cipher[i] != ' ')
{
if ((cipher[i] >= 'a' && cipher[i] <= 'z') || (cipher[i] >= 'A' && cipher[i] <= 'Z'))
{
if (cipher[i] >= 'a' && cipher[i] <= 'z')
{
plainText = plainText + (char) ((((aInverse * (cipher[i]+ 'a') ) - b) % 26) + 'a');
}
else if (cipher[i] >= 'A' && cipher[i] <= 'Z')
{
plainText = plainText + (char) (((aInverse * ((cipher[i]+'A' - b)) % 26)) + 'A');
}
}
else
{
plainText += cipher[i];
}
}
else
plainText += cipher[i];
}
return plainText;
}
//Driver Program
int main(void)
{
string msg = "abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//Calling encryption function
string cipherText = encryptMessage(msg);
cout << "Encrypted Message is : " << cipherText<<endl;
//Calling Decryption function
cout << "Decrypted Message is: " << decryptCipher(cipherText);
return 0;
}
【问题讨论】:
-
将
((((a * (plainText[i]-'a') ) + b) % 26) + 'a')更改为(((((a * (plainText[i]-'a') ) + b) % 26) + 'a') % 26) -
每次出现
a和b变量都是编译器错误。你的意思是'a'和'b'? -
... 例如,在这一行中:
cipher = cipher + (char) ((((a * (plainText[i]-'A') ) + b) % 26) + 'A');您使用a和b- 但这些声明和/或定义在哪里? -
@AdrianMole a 和 b 是仿射密码的密钥。以下公式 E ( x ) = ( a x + b ) mod m 和 D ( x ) = a^-1 ( x - b ) mod m
-
然后请在您发布的代码中包含这些定义! (我试图编译您的代码以查看问题出在哪里,但由于错误而无法编译 - 这就是为什么我们要求一个最小的 reproducible 示例!!)
标签: c++ encryption ascii