Loading... # RSA总结 网安数学基础快学完同余式了,就尝试了下ctf里的RSA解题 ## 原理 <img src="http://120.78.215.15/usr/uploads/2021/10/1342902826.png" style="zoom:33%;"> ## 已知p、q、e,求d <img src="http://120.78.215.15/usr/uploads/2021/10/287339502.png" style="zoom:33%;"> 第一种法直接遍历i得到满足条件的d ```python p = 473398607161 q = 4511491 e = 17 s = (p - 1) * (q - 1) for i in range(s): if (i * s + 1) % e == 0: print("d is " + str((i * s + 1) // e)) break ``` 第二种法使用gmpy2库 ```python import gmpy2 p = 473398607161 q = 4511491 e = 17 d = gmpy2.invert(e, (p - 1) * (q - 1)) print("d is " + str(d)) ``` 结果: ``` d is 125631357777427553 ``` ## 已知n、e,求d 比上一步多了个分解质因数,不是大数可以判断质数并分解,大数直接用在线分解质因数网站[factordb.com](http://factordb.com/) ## 已知p、q、e、c,求m 先求出d,再利用 m-c^d=kn 求出m ```python import gmpy2 import binascii p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483 q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407 e = 65537 c = 704796792 n = p*q d = gmpy2.invert(e, (p - 1) * (q - 1)) m = gmpy2.powmod(c, d, n) # m 的十进制形式 pow(c, d, n) 表示c的d次幂除以n的余数 print(binascii.unhexlify(hex(m)[2:])) ``` ## 已知p、q、dp、dq、c,求m 证明思路 <img src="http://120.78.215.15/usr/uploads/2021/10/1784575533.png" style="zoom:33%;"> ```python import gmpy2 # 不知道明文,但可由dp、dq求出 p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852 I = gmpy2.invert(q, p) # 求逆元 mp = pow(c, dp, p) mq = pow(c, dq, q) m = (((mp - mq) * I) % p) * q + mq print(hex(m)) ``` ## 已知e、n、c、dp,求m <img src="http://120.78.215.15/usr/uploads/2021/10/3160271150.png" style="zoom:33%;"> ```python import gmpy2 e = 65537 n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113 dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657 c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751 temp = e * dp - 1 for k in range(1, e): if temp % k == 0: p = temp // k + 1 if n % p == 0: q = n // p if gmpy2.is_prime(p) and gmpy2.is_prime(q): # print("%d = %d * %d" % (n, p, q)) break d = gmpy2.invert(e, (p - 1) * (q - 1)) m = gmpy2.powmod(c, d, n) # m 的十进制形式 pow(c, d, n) 表示c的d次幂除以n的余数 print(hex(m)[2:]) ``` ## 已知n、e1、e2、c1、c2,求m <img src="http://120.78.215.15/usr/uploads/2021/10/3425268871.png" style="zoom:33%;"> ```python import binascii import gmpy2 c1 = 22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361 n = 22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801 e1 = 11187289 c2 = 18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397 e2 = 9647291 # 扩展欧几里得算法 r, s1, s2 = gmpy2.gcdext(e1, e2) m = (gmpy2.powmod(c1, s1, n) * gmpy2.powmod(c2, s2, n)) % n m = hex(m)[2:] flag = binascii.unhexlify(m) print(flag) ``` 最后修改:2021 年 10 月 25 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,请随意赞赏