您的位置:首页 > 编程语言

信息安全 - 任意单表代替密码之仿射密码的代码实现和破解 e(x)=ax+b (mod 26)

2017-03-23 00:26 295 查看
仿射密码算法

加密函数形式:e(x)=ax+b (mod 26), a,b∈Z/(26)

具有唯一解的充要条件:gcd( a,26)=1 n

算法描述:设P=C=Z/(26),K={(a,b) ∈Z/(26)×Z/(26)| gcd(a,26)=1}

对k=(a,b) ∈K,定义ek (x)=ax+b (mod 26),dk (y)=a-1 (yb)(mod 26),x,y ∈Z/(26)

加法与乘法互不相关,可能的密钥是26+11个(a可取值a=3,5,7,9,11,15,17,19,21,23,25)

代码实现:

#include <iostream>
#include<math.h>
using namespace std;

//模的取逆
int dx, y, q;
void extend_Eulid(int aa, int bb)
{
if (bb == 0) {
dx = 1;y = 0;q = aa;
}
else {
extend_Eulid(bb, aa%bb);
int temp = dx;
dx = y;
y = temp - aa / bb*y;
}
}
//

int main()
{
int a, b, YN, i, l;
char c[100];
int x[100], y[100];
char ex[100];

cout << "请依次输入k =( a, b )的a, b值,其中 a,b ∈ Z/(26),gcd( a,26) = 1 :" << endl;
cin >> a >> b;
cout << "那么你的加密函数就是 ex = " << a << "*x + " << b << endl;
cout << endl <<"接下来输入你要加密的明文(小写字母):" << endl;
cin >> c;//明文
l = strlen(c);

for (i = 0; i < l; i++)
{
x[i] = c[i] - 'a';
ex[i] = (a * x[i] + b) % 26;//数字
}
cout << "加密后的字母为:";

for (i = 0; i < l; i++)
{
cout << char(ex[i] + 'a');//转字符
}
cout << endl << endl;
cout << "是否要解密原文(输入1则确定,输入其他则取消):";
cin >> YN;

while (YN == 1)
{
extend_Eulid(a, 26);//取逆
dx = (dx+26) % 26;
for (i = 0; i < l; i++)
{
y[i] = (dx*int(ex[i]) - dx*b) % 26;
y[i] = (y[i] + 26) % 26;//+26取正
cout << char(y[i] + 'a');
}
break;
}
system("pause");
}


Visual Studio 2015 编译测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  信息安全
相关文章推荐