diff --git a/Cry/submissions/26-Cry-Bu-666-coquerr.md b/Cry/submissions/26-Cry-Bu-666-coquerr.md index 02e11c4..2c9ae39 100644 --- a/Cry/submissions/26-Cry-Bu-666-coquerr.md +++ b/Cry/submissions/26-Cry-Bu-666-coquerr.md @@ -1,14 +1,17 @@ -![作业截图](123.png) -作业一: -【结果】 +[作业截图](123.png) + +# 作业一: +## 【结果】 计算出的私钥 d 为: 79207981603943158726342183501779498060887007919090529125944823321702668048201689505972813194857982765709487932291240004251663951673457580264860941532435588683621436899173175161302810123020953081054829086674128226499194637030759214221405433730067252975356487293571655947465562336968378931694193445519305068993 + 解出的原始明文数字 m 为: 9810209026724424616698728675395036057388193011482243197 【第二步:最终 Flag 翻译】 🎉 成功!最终 Flag 文字为:flag{W31c0m3_T0_Crypt0} -【原题目代码】from Crypto.Util.number import * +## 【原题目代码】from Crypto.Util.number import * +``` from secrets import randbits p = getPrime(512) @@ -31,7 +34,9 @@ q = 1127452248211464816765342570765711794216721596961232424905785849339809281666 e = 65537 c = 10221721591889545844573050254595795861182348856506145605480348246534477032085113801390383245391427274224627900490105787486227774188957450006691363974396952878850785124275814042623413354128640305152567667226654321244510669777870256213487113315863197287562256336752636572876416053482569293397021584043886350655 ''' -【解题脚本】 +``` +## 【解题脚本】 +``` # -*- coding: utf-8 -*- from Crypto.Util.number import long_to_bytes @@ -75,17 +80,17 @@ except Exception: print(f"🚩 拿到原始 Flag 字节流:{long_to_bytes(m)}") print("="*50 + "\n") - -【解题思路】 +``` +## 【解题思路】 根据正常逻辑:我们知道p,q,可以算出来n是多少,也可以算出来φ(n),然后根据c=pow(m,e,n),知道了e,φ(n)就能算出来e×d÷φ(n)=1算出来d是多少,知道了d和c的大小,就能根据解密公式算出m的值=c的d次方对n取模, -作业二: -【结果】 +# 作业二: +## 【结果】 解出的原始明文 m 为: 584734024210241000157106698028514857242399424381 --------------------------------------------------- 🎉 最终 Flag 为:flag{Wh@t_1s_dp_dq?} -【原题目代码】 +## 【原题目代码】 +``` from Crypto.Util.number import * p = getPrime(512) @@ -115,7 +120,9 @@ dp = 401068114021755738042293506599263878596085628429041672039168334777926739285 dq = 2650091114188243387783699150080671432452650354401886796343461099352350290584408461982954461814393687345324352950407449243857759926179828428073409383707519 c = 49442655923625309909385017545371837339079019962533687954830521594031788193892512818961352203881969632046490177930759665200677302956816647378151364853230118743634390053041583940566732297636464662866406886764229490729837423276227228984024967061624432225315562131278455141688731687433597958272776740673914705069 ''' -【解题校本】 +``` +## 【解题校本】 +``` from Crypto.Util.number import long_to_bytes # [1. 录入已知参数] @@ -145,14 +152,16 @@ try: except: print(f"🚩 原始字节流为:{long_to_bytes(m)}") print("="*50) -【解题思路】 +``` +## 【解题思路】 由于题目中没有给出具体的e的值,但是给出了dp,dq的值,我们可以根据这两个值绕过e直接求,m的值 -作业三: -【结果】 +# 作业三: +## 【结果】 🎉 成功检测到 $m^3 < n$ 漏洞!正在还原明文... 解出的数字 m 为:56006392793428920827102007075673367741253452217733739675258514641466151117335380278006308102255031165 最终 Flag 为:flag{d07cc7cf-9d78-4bfb-9449-d099b0329563} -【原题目代码】 +## 【原题目代码】 +``` import libnum import gmpy2 import uuid @@ -177,7 +186,9 @@ n= 14292719350731304209906438502366895952915964006388078677132756297121071761855 e= 3 c= 175676150266632261170048224865383344382701466592480820852821987310883907646453945269873798553604154950679789706816103734968119191264040967221804258086782193045472222806462922151478555259607753533988574525462498108797766467552606740700525351657072574897006690469089852849417334378963664086027896356417125 ''' -【解题脚本】 +``` +## 【解题脚本】 +``` import gmpy2 import libnum @@ -204,9 +215,11 @@ else: print("❌ 警告:无法完全开尽立方根。") print("这可能意味着 $m^3$ 稍微超过了 $n$,需要尝试 c + n 后再开方。") print("-" * 50) -【解题思路】 +``` +## 【解题思路】 由于n是1008位2进制长度,而m的三次方大约是900多位二进制数,所以这样的话c就等于m的三次方,所以求m就直接把c开三次方就好 -作业四:为什么选crypto +#作业四:为什么选crypto 大二上的时候学了公钥密码学的数学基础,那时候有些贪玩,课本都没怎么看过,到最后考试的时候,很多证明题,解答题什么的都是现场推演的,感觉最后结果还不错,也比较享受数学推导的过程, + 我想莫非我有这方面的天赋,就选了这个方向。