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<e<φ),并且e和φ互质(互质:公约数只有1的两个整数)
取e的模反数d,计算方法为:e * d ≡ 1 (mod φ) (模反元素:如果两个正整数e和n互质,那么一定可以找到整数d,使得 e * d - 1 被n整除,或者说e * d被n除的余数是1。这时,d就叫做e的“模反元素”。欧拉定理可以用来证明模反元素必然存在。两个整数a,b,它们除以整数M所得的余数相等:a ≡ b(mod m),比如说5除3余数为2,11除3余数也为2,于是可写成11 ≡ 5(mod 3)。)
对明文m进行加密:c = pow(m, e, N),可以得到密文c。
对密文c进行解密:m = pow(c, d, N),可以得到明文m。
整理:
p 和 q:两个大的质数,是另一个参数N的的两个因子。
N:大整数,可以称之为模数
e 和 d:互为无反数的两个指数
c 和 m:密文和明文
(N, e):公钥
(N, d):私钥
pow(x, y, z):效果等效pow(x, y)1 % z, 先计算x的y次方,如果存在另一个参数z,需要再对结果进行取模。
密钥长度:n以二进制表示的的位数,例如密钥长度为512代表n用二进制表示的长度为512bit。
Crypto 算法库在 python 中最初叫 pycrypto。
a = [2,22,222]
Sn = reduce(lambda x,y:x+y,a)
print "计算和为:",Sn
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
其中reduce函数是python中的一个二元内建函数,它可以通过传给reduce中的函数(必须是二元函数)依次对数据集中的数据进行操作。例如上述代码传给reduce的函数是做加法,数据集是a,那么reduce函数的作用就是将数据集中的数据依次相加,最后打印出的结果就是246。
函数语法:
reduce(function, iterable[,initializer])
函数参数含义如下:
1、function 需要带两个参数,1个是用于保存操作的结果,另一个是每次迭代的元素。
2、iterable 待迭代处理的集合
3、initializer 初始值,可以没有。
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() 是一个将长整数转换为字节串的函数。它通常用于将整数类型的数据转换为可以存储或传输的字节串。
最终的flag为:
HSCTF{@Tv0_br3ad5_c1ip_cHe3se_!@}