下载看到附件:
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
分析:
import libnum # 导入libnum库,该库提供了一些数学和加密相关的功能
from Crypto.Util import number # 从Crypto.Util模块中导入number,该模块提供了与数字相关的实用功能
from functools import reduce # 导入reduce函数,该函数用于对序列进行归约操作
from secret import flag # 从secret模块中导入flag,flag是待加密的明文
n = 5 # 初始化变量n,表示需要生成的质数的数量
size = 64 # 初始化变量size,表示每个质数的位数
while True: # 开始一个无限循环
ps = [number.getPrime(size) for _ in range(n)] # 生成n个size位的质数,并将它们存储在列表ps中
if len(set(ps)) == n: # 检查列表ps中是否真的有n个不同的质数
break # 如果确实有n个不同的质数,则跳出循环
e = 65537 # 初始化变量e,这是RSA加密中的公钥指数,通常选择65537
n = reduce(lambda x, y: x*y, ps) # 使用reduce函数计算列表ps中所有质数的乘积,结果赋值给n
# 这是RSA加密中的模数,它由多个质数的乘积组成
m = libnum.s2n(flag) # 使用libnum库的s2n函数将明文flag转换为数字形式,结果赋值给m
c = pow(m, e, n) # 使用pow函数计算m的e次方模n的结果,这是RSA加密的密文,结果赋值给c
print('n = %d' % n) # 打印模数n的值
print('c = %d' % c) # 打印密文c的值
exp:
yafu分解n
flag:
HSCTF{@Tv0_br3ad5_c1ip_cHe3se_!@}