下载看到附件:
encrypt.py
import hashlib
import sympy
from Crypto.Util.number import *
flag = 'GWHT{******}'
secret = '******'
assert(len(flag) == 38)
half = len(flag) / 2
flag1 = flag[:half]
flag2 = flag[half:]
secret_num = getPrime(1024) * bytes_to_long(secret)
p = sympy.nextprime(secret_num)
q = sympy.nextprime(p)
N = p * q
e = 0x10001
F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)
c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
assert(c2 < N)
m1 = pow(c1, e, N)
m2 = pow(c2, e, N)
output = open('secret', 'w')
output.write('N=' + str(N) + '\n')
output.write('m1=' + str(m1) + '\n')
output.write('m2=' + str(m2) + '\n')
output.close()
secret
N=636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1=90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2=487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
认识RSA:
https://blog.csdn.net/dbs1215/article/details/48953589
简单分析:
# 导入hashlib库
import hashlib
# 导入sympy库,用于进行数学运算,如寻找下一个质数
import sympy
# 从Crypto.Util.number模块导入一些加密相关的数学实用功能
from Crypto.Util.number import *
# 定义一个包含占位符的flag字符串
flag = 'GWHT{******}'
# 定义一个未知的secret字符串
secret = '******'
# 断言flag的长度为38,但实际上由于flag中的占位符,这个断言可能会失败
assert(len(flag) == 38)
# 计算flag字符串长度的一半,用于后面的分割
half = len(flag) / 2
# 使用切片操作将flag字符串分割为两部分,每部分长度相等
flag1 = flag[:half]
flag2 = flag[half:]
# 生成一个1024位的质数,并与secret字符串(转换为长整型)相乘,得到一个新的数
secret_num = getPrime(1024) * bytes_to_long(secret)
# 使用sympy库的nextprime函数找到大于secret_num的下一个质数,赋值给p
p = sympy.nextprime(secret_num)
# 找到大于p的下一个质数,赋值给q
q = sympy.nextprime(p)
# 计算RSA公钥的模数N,即p和q的乘积
N = p * q
# 设置RSA加密的公共指数e为65537(即0x10001)
e = 0x10001
# 将flag1和flag2字符串转换为长整型
F1 = bytes_to_long(flag1)
F2 = bytes_to_long(flag2)
# 对F1和F2进行简单的数学运算:求和与立方和
c1 = F1 + F2
c2 = pow(F1, 3) + pow(F2, 3)
# 断言c2的值必须小于N,这是RSA加密的一个必要条件,确保c2在模N的范围内
assert(c2 < N)
# 使用RSA公钥(e和N)对c1进行加密,得到m1
m1 = pow(c1, e, N)
# 使用RSA公钥(e和N)对c2进行加密,得到m2
m2 = pow(c2, e, N)
# 打开一个名为'secret'的文件,以写入模式
output = open('secret', 'w')
# 将N的值写入文件
output.write('N=' + str(N) + '\n')
# 将m1的值写入文件
output.write('m1=' + str(m1) + '\n')
# 将m2的值写入文件
output.write('m2=' + str(m2) + '\n')
# 关闭文件
output.close()
在线网站分解n为p,q
脚本分解:
https://blog.csdn.net/hacker_zrq/article/details/121444869
exp:
import gmpy2
from Crypto.Util.number import *
from sympy import *
from sympy.abc import a, b, c
N = 636585149594574746909030160182690866222909256464847291783000651837227921337237899651287943597773270944384034858925295744880727101606841413640006527614873110651410155893776548737823152943797884729130149758279127430044739254000426610922834573094957082589539445610828279428814524313491262061930512829074466232633130599104490893572093943832740301809630847541592548921200288222432789208650949937638303429456468889100192613859073752923812454212239908948930178355331390933536771065791817643978763045030833712326162883810638120029378337092938662174119747687899484603628344079493556601422498405360731958162719296160584042671057160241284852522913676264596201906163
m1 = 90009974341452243216986938028371257528604943208941176518717463554774967878152694586469377765296113165659498726012712288670458884373971419842750929287658640266219686646956929872115782173093979742958745121671928568709468526098715927189829600497283118051641107305128852697032053368115181216069626606165503465125725204875578701237789292966211824002761481815276666236869005129138862782476859103086726091860497614883282949955023222414333243193268564781621699870412557822404381213804026685831221430728290755597819259339616650158674713248841654338515199405532003173732520457813901170264713085107077001478083341339002069870585378257051150217511755761491021553239
m2 = 487443985757405173426628188375657117604235507936967522993257972108872283698305238454465723214226871414276788912058186197039821242912736742824080627680971802511206914394672159240206910735850651999316100014691067295708138639363203596244693995562780286637116394738250774129759021080197323724805414668042318806010652814405078769738548913675466181551005527065309515364950610137206393257148357659666687091662749848560225453826362271704292692847596339533229088038820532086109421158575841077601268713175097874083536249006018948789413238783922845633494023608865256071962856581229890043896939025613600564283391329331452199062858930374565991634191495137939574539546
p = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377748737
q = 797862863902421984951231350430312260517773269684958456342860983236184129602390919026048496119757187702076499551310794177917920137646835888862706126924088411570997141257159563952725882214181185531209186972351469946269508511312863779123205322378452194261217016552527754513215520329499967108196968833163329724620251096080377747699
e = 0x10001
L = (p - 1) * (q - 1)
d = gmpy2.invert(e,L)
c1 = pow(m1, d, N)
c2 = pow(m2, d, N)
F1F2 = solve([a + b - c1, pow(a, 3) + pow(b, 3) - c2], [a, b]) # solve()函数作用是解方程
print(F1F2)
F1 = 1141553212031156130619789508463772513350070909
F2 = 1590956290598033029862556611630426044507841845
print(long_to_bytes(F1))
print(long_to_bytes(F2))
print(long_to_bytes(F2) + long_to_bytes(F1))
flag:
NSSCTF{f709e0e2cfe7e530ca8972959a1033b2}