学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1171

主题
发表于 2020-5-28 10:31:47 | 查看: 8328| 回复: 0
                                                                                        [GKCTF2020]小学生的密码学

GKCTF_2020_crypto小学生的密码学

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[100];
int x[100];
char ex[100], y[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;
cout << dx<<endl;
for (i = 0; i < l; i++)
{
y[i] = (dx * int(x[i]) - dx * b) % 26;
y[i] = (y[i] + 26) % 26;//+26取正
cout << char(y[i]+ 'a' );
}
break;
}
}
  运行

GKCTF_2020_crypto小学生的密码学

GKCTF_2020_crypto小学生的密码学

  base64 加密得flag

GKCTF_2020_crypto小学生的密码学

GKCTF_2020_crypto小学生的密码学



温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-12-26 23:20 , Processed in 0.200582 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表