攻防世界-baigeiRSA2
⭕ 考察内容
1、非标准RSA加密算法
2、逆元求解
3、因式分解(yafu)
一、题目
给出一串代码,大概看一眼是类似RSA的加密算法,但是其n的选取并非2个素数的乘积,而是5个素数的乘积,所以并不是标准的RSA加密。
再看一眼文件,发现给出了n和e
二、解题
1、因数分解
由于n仅有96位,所以尝试使用yafu进行因式分解
得到了5个素数
2、仔细阅读代码
顺便学习一下语法,发现加密算法是类似RSA的非标准加密算法
while True:
##这是定义n为一个数组并且使用循环重复调用getPrime()来生成5个元素
ps = [number.getPrime(size) for _ in range(n)]
##使用set()把列表转化为集合来进行去重,也就是保证列表中没有相同的素数
if len(set(ps)) == n:
break
##这是一段reduce()和lambda表达式联用的代码,功能在于实现求取ps中所有元素的乘积并赋值给n
n = reduce(lambda x, y: x*y, ps)
- reduce()函数
- lambda表达式联用
3、编写解密脚本
查了一下,解密算法与RSA解密类似,只是phi要变为多个(素数-1)的乘积,再利用e和phi求解逆元d即可,最后解密即可
三、脚本代码与答案
from Crypto.Util.number import long_to_bytes,bytes_to_long,inverse
c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921
e = 65537
p1 = 9401433281508038261
p2 = 11855687732085186571
p3 = 13716847112310466417
p4 = 11215197893925590897
p5 = 10252499084912054759
phi = (p1-1)*(p2-1)*(p3-1)*(p4-1)*(p5-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
HSCTF{@Tv0_br3ad5_c1ip_cHe3se_!@}