第四周学习
easyrsa3
可以看到
给出了两组e、n、c,且两组的n相同,e互素。
查询可知要使用共模攻击。
根据扩展欧几里得 算法得
可以得到该式子的一组解(s1,s2) 假设s1为正数,s2为负数
有整数s1,s2(一正一负)
存在e1s1+e2s2==1
根据推理可知
m = ( c 1 s 1 × c 2 s 2 ) m o d n m=(c1^{s1}\times c2^{s2})\mod n m=(c1s1×c2s2)modn
写出脚本
import gmpy2
from Crypto.Util.number import *
e1 = 797
n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
c1 = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930
e2 = 521
c2 = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849
s,s1,s2=gmpy2.gcdext(e1,e2)
m = (pow(c1, s1, n)*pow(c2, s2, n))%n
print(long_to_bytes(m).decode('utf-8'))
easyrsa5
题目给出了一组e,n,c.
题目中e很大,与n的位数一样,可知要使用低解密指数攻击
这里使用网上的脚本(https://github.com/pablocelayes/rsa-wiener-attack)
import gmpy2
import binascii
import RSAwienerHacker
e = 284100478693161642327695712452505468891794410301906465434604643365855064101922252698327584524956955373553355814138784402605517536436009073372339264422522610010012877243630454889127160056358637599704871937659443985644871453345576728414422489075791739731547285138648307770775155312545928721094602949588237119345
n = 468459887279781789188886188573017406548524570309663876064881031936564733341508945283407498306248145591559137207097347130203582813352382018491852922849186827279111555223982032271701972642438224730082216672110316142528108239708171781850491578433309964093293907697072741538649347894863899103340030347858867705231
c = 350429162418561525458539070186062788413426454598897326594935655762503536409897624028778814302849485850451243934994919418665502401195173255808119461832488053305530748068788500746791135053620550583421369214031040191188956888321397450005528879987036183922578645840167009612661903399312419253694928377398939392827
d = RSAwienerHacker.hack_RSA(e,n)
m = gmpy2.powmod(c,d,n)
print(d)
print(binascii.unhexlify(hex(m)[2:]))
使用时要将该脚本放到下载到的文件夹内,否则会找不到库.
funnyrsa2
![
](https://gitee.com/li-hua-c3/picture/raw/master/66/image-20240217192633161.png)
题目代码相较于一般rsa加密,这里生成了三个素数用于生成n.
解题过程:
观察到n不是很大,可以考虑直接对其进行分解.
这里使用yafu
P24 = 876391552113414716726089
P25 = 1098382268985762240184333
P24 = 932470255754103340237147
得到了p,q,r.
然后用三个数求d并解密.
from Crypto.Util.number import *
import gmpy2
p = 876391552113414716726089
q = 1098382268985762240184333
r = 932470255754103340237147
n = 897607935780955837078784515115186203180822213482989041398073067996023639
e = 0x10001
c = 490571531583321382715358426750276448536961994273309958885670149895389968
phi = (p-1)*(q-1)*(r-1)
d = gmpy2.invert(e, phi)
print(long_to_bytes(pow(c,d,n)))
[LitCTF 2023]easy_math (中级)
题目:
题目中计算出了 h i n t = p 3 − q 5 hint=p^3-q^5 hint=p3−q5
通过解方程组
{
h
i
n
t
=
p
3
−
q
5
n
=
q
×
q
\begin{cases} hint=p^3-q^5 \\ n=q\times q \\ \end{cases}
{hint=p3−q5n=q×q
可以直接求出p和q.
import sympy
n=2230791374046346835775433548641067593691369485828070649075162141394476183565187654365131822111419512477883295758461313983481545182887415447403634720326639070667688614534290859200753589300443797
c=2168563038335029902089976057856861885635845445863841607485310134441400500612435296818745930370268060353437465666224400129105788787423156958336380480503762222278722770240792709450637433509537280
e=65537
hint=392490868359411675557103683163021977774935163924606169241731307258226973701652855448542714274348304997416149742779376023311152228735117186027560227613656229190807480010615064372521942836446425717660375242197759811804760170129768647414717571386950790115746414735411766002368288743086845078803312201707960465419405926186622999423245762570917629351110970429987377475979058821154568001902541710817731089463915930932142007312230897818177067675996751110894377356758932
p=sympy.Symbol('p')
q=sympy.Symbol('q')
solved_value=sympy.solve([p*q-n,p**3 -q**5 -hint], [p,q])
print(solved_value)
求解得
p = 7321664971326604351487965655099805117568571010588695608389113791312918573783115429227542573780838065461696504325762281209452761930184231131129306271846427
q = 304683618109085947723284393392507415311
进行解密
from Crypto.Util.number import *
import gmpy2
p = 7321664971326604351487965655099805117568571010588695608389113791312918573783115429227542573780838065461696504325762281209452761930184231131129306271846427
q = 304683618109085947723284393392507415311
n = 2230791374046346835775433548641067593691369485828070649075162141394476183565187654365131822111419512477883295758461313983481545182887415447403634720326639070667688614534290859200753589300443797
c = 2168563038335029902089976057856861885635845445863841607485310134441400500612435296818745930370268060353437465666224400129105788787423156958336380480503762222278722770240792709450637433509537280
e = 65537
phi = (p-1)*(q-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))
[HNCTF 2022 WEEK3]AES
代码首先对flag进行了填充然后分组。
然后随机生成一个16字节的key。
进入循环先对第一组数据进行ecb模式加密。
然后将加密后的结果赋值给key
进行下一组加密。
最后进行拼接。
加密过程在模拟CBC模式。
在主函数中,将flag*3后才进行加密。
所以,解密时可以直接使用上一组的密文进行解密,放弃第一组。
from Crypto.Cipher import AES
ct = b'\x179\xb8l\x97\xbew\xc2\xd5f~\x8e\xdc\xf2\x9b\xabR\xa9a\xd2\xf4\xde\xd6|\xd1\x9f\xe9q\x1d\xfcm\xfbj\xe9\x9e\xab\xf5fL\xb3\xb5_\xa5\x16\x8e\x7f\x9fV`\x8b\x16\xa1\xa6)\x08\x97\x91\xbd3\x1d\xeb\\\x86\xa2\xd6\x94>\xf3\xfdt\xd9\x14\xf3\xfc\xe2\x02\xd6\xc4\xcfq"\x1a\x14~2]4\x9f\xc9\x88\xf8\x12\xb6\xa2\xd7\xec\x0b\x7f\xd4d\xdc\xc6\xb4]\x10u\xc6f\x97m\xccA\x82\x02\xa5gh\x85\x85Wz\xd9.\xff\x9bx\x99J\x0e\x86\x16\x90\xad\x1e\x17\x86\x95\xb8S\x17\xea\x93v\xd0'
ct = [ct[i:i+16] for i in range(0, len(ct), 16)]
plain = b''
for i in range(1, len(ct)):
cipher = AES.new(ct[i-1], AES.MODE_ECB)
plain+= cipher.decrypt(ct[i])
print(plain)
运行即可得到flag