roger 发表于 2020-5-28 10:31:47

GKCTF_2020_crypto小学生的密码学

                                                                                        小学生的密码学仿射密码的代码实现破解代码#include <iostream>
#include<math.h>
#include<string.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;
int x;
char ex, y;

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 = c - 'a';
ex = (a * x + b) % 26;//数字
}
cout << "加密后的字母为:";

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

while (YN == 1)
{
extend_Eulid(a, 26);//取逆
dx = (dx + 26) % 26;
cout << dx<<endl;
for (i = 0; i < l; i++)
{
y = (dx * int(x) - dx * b) % 26;
y = (y + 26) % 26;//+26取正
cout << char(y+ 'a' );
}
break;
}
}
  运行

  base64 加密得flag


页: [1]
查看完整版本: GKCTF_2020_crypto小学生的密码学