CTF密码rsa加密
rsa加密原理
- 明文为m,密文为c
- 找两个质数p、q
- 计算n=p*q
- 计算n的欧拉函数φ(n)=(p-1)*(q-1)
- 公钥e,要求1<e<φ(n),且e为整数,还需要e、φ(n)互质
- 确定私钥d,d要满足e*d除以φ(n)余数为1
- 加密
- 解密
解密rsa关键
-
公开传播的是:n、e、c
-
解密要用到:n、d、c
-
所以rsa解密的关键就是要得到私钥d
-
要得到d,需要通过e*d除以φ(n)余数为1
-
在求d之前就需要求φ(n)
-
而φ(n)=(p-1)*(q-1)
-
所以解密rsa的关键需要求p、q
-
n = p*q,可以通过分解质因素来对p、q进行爆破(当p、q比较小或者p、q比较接近的时候是可以分解的)
rsa题型大全
基础题型
直接套公式
题目1
1 | p = 1325465431 |
- exp:
1 | import gmpy2 |
题目2
1 | p=0x928fb6aa9d813b6c3270131818a7c54edb18e3806942b88670106c1821e0326364194a8c49392849432b37632f0abe3f3c52e909b939c91c50e41a7b8cd00c67d6743b4f |
- exp
1 | import libnum |
题目3:逐个字符加密
- 题目来源:[HUBUCTF 2022 新生赛]RSAaaa | NSSCTF
- 逐个字符加密,没啥好说的基础题
1 | 就你小子是黑客? |
- exp:
1 | import libnum |
p、q可爆破
- p、q由于位数太小,可以爆破出来。
- 在线爆破网站:factordb.com
- yafu爆破程序
题目1 (n较小)
- 题目来源:
1 | from Crypto.Util.number import bytes_to_long, getPrime |
- exp
1 | from Crypto.Util.number import * |
题目2(n较小)
1 | from Crypto.Util.number import * |
- 分解
- exp:
1 | from Crypto.Util.number import * |
题目3(n较小)
1 | from Crypto.Util.number import * |
- exp:
1 | import libnum |
题目4(n较小)
1 | e = 65537 |
- exp:
1 | import libnum |
题目5(n较小)
- 题目来源:[黑盾杯 2020]Factor | NSSCTF
- 题目:
1 | n = 3454083680130687060405946528826790951695785465926614724373 |
题目6(p可由n开根)
1 | from Crypto.Util.number import * |
- 分解n
- 利用欧拉公式的求法,得到phi_n
- exp:
1 | from Crypto.Util.number import * |
题目7 (n比较小)
1 | c = 28767758880940662779934612526152562406674613203406706867456395986985664083182 |
- 分解
- exp:
1 | from Crypto.Util.number import * |
题目8(p、q解方程)
1 | from Crypto.Util.number import bytes_to_long, getPrime |
- 思路
1 | gift = 2022*p + 9*q + 28*e |
- 用sage解方程
1 | # 导入需要的库 |
- exp:
1 | import libnum |
题目9(p、q未知,但p-q很小)在线分解
1 | from gmpy2 import * |
- 分解p、q
- exp:
1 | import libnum |
题目10(p、q未知,但p-q很小)yafu分解
1 | from Crypto.Util.number import * |
- 分解,这题在线网站分解不了,使用工具分解
- 命令分解
.\yafu-x64.exe "factor(6)"
参考博客:[Yafu、gmpy2安装及使用 | YLCao’s Blog](https://ylcao.top/2021/06/05/yafu、gmpy2安装及使用/#:~:text=yafu 用于自动整数因式分解, 在 RSA 中,当 p、q 的取值差异过大或过于相近的时候,使用 yafu,processing batchfile 。 运行命令: .\yafu-x64.exe “factor(@)” -batchfile data.txt)
- 由于该数过大,需要线创建文本,将要分解的n写入文本中,结尾要换行否则分解不了
- 然后在目录里面进入终端
- 然后输入指令
.\yafu-x64.exe "factor(@)" -batchfile data.txt
分解得到
- exp:
1 | import libnum |
共享素数
题目1
1 | from Crypto.Util.number import * |
- 思路:
1 | 目标就是求p,利用gcd(n1,n2) |
- exp:
1 | import libnum |
题目2
1 | from Crypto.Util.number import * |
- exp:
1 | import libnum |
不互素
多个n,当n之间不互素
- 当题目给多个n的时候,需要去求一下多个n之间的最大公因数,看看是否有不互素的情况
- 如果出现不互素的情况那么其中的n=p*q,中的p就已经给泄露出来了
- 剩下的就是正常的RSA解密过程了
题目1
- 题目
1 | from Crypto.Util.number import * |
- exp:
1 | import gmpy2 |
e很小
直接开平方
广播攻击
- 广播攻击涉及到的是中国剩余定理
题目1
[鹤城杯 2021]Crazy_Rsa_Tech | NSSCTF
1 | from Crypto.Util.number import * |
- 题目还给了一个文件,记录了每次rsa加密所使用的n和所得到的c
- 多组加密直接sage用CRT跑出
m**e
,并不需要9组都上,三四组即可
1 | # 定义模数和余数 |
- 然后得到
m**e
最后在开方得到flag
1 | import libnum |
rsa变式
泄露之方程
- 已知一种p、q关系
- p-q泄露
- dp、dq泄露
- p^n-q^m泄露
题目1:p-q泄露
1 | n = 24585768801100871989460458412563674690545986652089097718040761783186739174559136657307807040444318337561194142282186006216583089898423180103199568738639814413601595196467099996734334212909157604318709957690532885862891927163713619932622153281344607898846228206181834468325246573910857887714824338949742479585089251882243488454602710292507668577598274622372304293403731722318890268908300308478539449464617438721833942643889296634768118375076052778833640986893990732882252524850152650060780854621796349622086656401914022236044924841914313726991826438982902866584892213702893596657746111940812657202364588469026832387629 |
- p-q泄露直接推phi_n
1 | n = p*q |
- exp:
1 | import libnum |
题目2:p^m-q^n泄露
1 | from Crypto.Util.number import * |
- 思路
- sage脚本
1 | # 导入需要的库 |
题目3:p+p×q^3和p×q+p×q^2泄露
- 题目来源:[SWPU 2020]happy | NSSCTF
1 | ('c=', '0x7a7e031f14f6b6c3292d11a41161d2491ce8bcdc67ef1baa9eL') |
- 一眼就是解方程
- 利用在线sage解方程
1 | # 定义变量 |
- exp:
1 | import libnum |
出现公倍数的情况
题目1:lcm(p - 1 , q - 1)
1 | from gmpy2 import lcm |
费马小定理与rsa
题目1 GHCTF
[GHCTF 2024 新生赛]2023四省联考 | NSSCTF
1 | from Crypto.Util.number import * |
- exp:
1 | import gmpy2 |
题目2 KPCTF
- 费马小定理要考察灵活的还是非常灵活的,就像我们校赛这一题这样,太灵活了QAQ,虽然exp就短短几行
维纳攻击
- 维纳攻击(Wiener’s Attack)是一种针对RSA加密算法的密码攻击方法,尤其适用于私钥
d
较小的情况。它基于一种数学技术——连分数(continued fractions)——来破译RSA加密。 - 适用条件:
题目1 HGAME 2022 week3
1 | from Crypto.Util.number import getPrime |
- exp:
1 | import gmpy2 |
题目2 XYCTF Factor1
- 题目
1 | import gmpy2 |
- 思路:
1 | phi_n**3 = (p**3-1) * (q**3-1) |
- exp
- 求d
1 | import gmpy2 |
- 分解p、q(用Sage)
1 | n=99075185389443078008327214328328747792385153883836599753096971412377366865826254033534293886034828804219037466246175526347014045811852531994537520303063113985486063022444972761276531422538694915030159420989401280012025249129111871649831185047820236417385693285461420040134313833571949090757635806658958193793 |
- 得到flag
1 | import gmpy2 |
泄露之位数
- 做到这里也只能做脚本小子了。原本还想着理解之后做的,太花时间收益太少,先积累脚本等学到密码学的时候再理解吧
题型1p高位泄露
题型2p高位、q低位泄露
-
这题是BaseCTF新生赛的一题
-
题目附件
1 | from Crypto.Util.number import getPrime, bytes_to_long |
- exp:
- 先使用sage求出p的值
1 | from Crypto.Util.number import long_to_bytes |
- 然后再使用Python写出解密脚本
1 | import libnum |
RSA与离散对数
- RSA与离散对数
1 | from Crypto.Util.number import bytes_to_long as b2l, long_to_bytes as l2b, getPrime |
- exp:
1 | from Crypto.Util.number import bytes_to_long as b2l, long_to_bytes as l2b, getPrime |
共模攻击
题型一e1、e2互素
题型二e1、e2不互素
-
题目来源:BaseCTF[week3] exgcd
-
题目附件
1 | from Crypto.Util.number import * |
-
解法与题型基本上相同,就是要有限域开方,开方次数为e1,e2的最大公因数
-
exp:
1 | import gmpy2 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!
评论