攻防世界-baigeiRSA2

1.下载附件,得到压缩包,解压得到两个文件,内容分别是。

import libnum
from Crypto.Util import number
from functools import reduce
from secret import flag

n = 5
size = 64
while True:
    ps = [number.getPrime(size) for _ in range(n)]
    if len(set(ps)) == n:
        break

e = 65537
n = reduce(lambda x, y: x*y, ps)
m = libnum.s2n(flag)
c = pow(m, e, n)

print('n = %d' % n)
print('c = %d' % c)
n = 175797137276517400024170861198192089021253920489351812147043687817076482376379806063372376015921
c = 144009221781172353636339988896910912047726260759108847257566019412382083853598735817869933202168

2.首先,需要对代码中的使用库的方法进行了解。

libnum库 是一个关于各种数学运算的函数库。

libnum.s2n:数字转化为字符串。
number.getPrime():判断一个数是否为质数。

为了方便理解,先对RSA密钥体制做个简略的介绍。

选择两个大的参数,计算出模数 N = p * q
计算欧拉函数 φ = (p-1) * (q-1),然后选择一个e(1

3.解题:

对N进行分解,使用yafu工具。

P19 = 9401433281508038261
P20 = 11215197893925590897
P20 = 11855687732085186571
P20 = 10252499084912054759
P20 = 13716847112310466417

 

gmpy2 是一个用于进行高精度整数计算的 Python 库。它是 gmpy 的一个更新版本,具有更快的计算速度和更丰富的功能。gmpy2 可以帮助您在 Python 程序中进行复杂的整数运算,比如求逆元、求模、求最大公约数、求最小公倍数等。它的用法类似于 Python 内置的数学库 math,但提供了更高精度的整数运算能力。

gmpy2.invert() 是一个函数,它返回一个整数的乘法逆元。乘法逆元是一个数,它乘上原来的数后等于 1。例如,3 的乘法逆元是 5,因为 5 x 3 = 15。


long_to_bytes() 是一个将长整数转换为字节串的函数。它通常用于将整数类型的数据转换为可以存储或传输的字节串。

攻防世界-baigeiRSA2_第1张图片

 最终的flag为:

HSCTF{@Tv0_br3ad5_c1ip_cHe3se_!@}

你可能感兴趣的:(CTF,python,开发语言)