From cd8379ae5ed55aa1c0a6ab44d11a61cb285435de Mon Sep 17 00:00:00 2001 From: mwatson-aprilu Date: Sun, 26 Apr 2026 19:43:04 +0800 Subject: [PATCH] =?UTF-8?q?Create=2025-Cry-shuiyue-=E6=9D=A8=E6=99=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added detailed explanation and code for the third problem involving RSA encryption and decryption using Python. --- ...5-Cry-shuiyue-\346\235\250\346\231\266.md" | 57 ++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git "a/Cry/submissions/Cry/submissions/25-Cry-shuiyue-\346\235\250\346\231\266.md" "b/Cry/submissions/Cry/submissions/25-Cry-shuiyue-\346\235\250\346\231\266.md" index 3ff8f72..af358d1 100644 --- "a/Cry/submissions/Cry/submissions/25-Cry-shuiyue-\346\235\250\346\231\266.md" +++ "b/Cry/submissions/Cry/submissions/25-Cry-shuiyue-\346\235\250\346\231\266.md" @@ -93,7 +93,62 @@ c = 4944265592362530990938501754537183733907901996253368795483052159403178819389 2.知识补充(自我提醒): >题目中的dp,dq是由p,q分别减一再取模得到,可以简化计算。 3.由于dp,dq可看作密钥的一部分,故而先'pow'算出dp,dq。 -4.利用中国剩余定理得到m,再将m转化为字符型,得到flag。 +4.利用中国剩余定理得到m,再将m转化为字符型,得到flag。 +## 第三题 three + +```py +import libnum +import gmpy2 +import uuid +flag = "flag{" + str(uuid.uuid4()) + "}" +m = libnum.s2n(flag) +print(gmpy2.bit_length(m ** 3)) +while True: + p = libnum.generate_prime(504) + q = libnum.generate_prime(504) + n = p * q + phi_n = (p - 1) * (q - 1) + e = 3 + if gmpy2.gcd(e, phi_n) == 1 and phi_n%e !=0: + break + +c = pow(m, e, n) +print("n=", n) +print("e=", e) +print("c=", c) +''' +n= 1429271935073130420990643850236689595291596400638807867713275629712107176185520444788761901754075622136449476721042807647099083589759664014467696405646188198112649666177678289522724798981531832903351705482763333352669597586657968404428319154104297454666647063679624028208478294081894177792365782518110223 +e= 3 +c= 175676150266632261170048224865383344382701466592480820852821987310883907646453945269873798553604154950679789706816103734968119191264040967221804258086782193045472222806462922151478555259607753533988574525462498108797766467552606740700525351657072574897006690469089852849417334378963664086027896356417125 +''' +``` + +思路思路: +1.题目里 e=3,c = m³ mod n +2.因为明文 m 是 flag+uuid,长度很短,m³ 直接小于模数 n,没有发生取模运算 +3.所以:c = m³,直接对 c 开三次方就能得到 m +4.再把数字 m 转回字符串就是 flag + +```py +from Crypto.Util.number import * +import gmpy2 +n= 1429271935073130420990643850236689595291596400638807867713275629712107176185520444788761901754075622136449476721042807647099083589759664014467696405646188198112649666177678289522724798981531832903351705482763333352669597586657968404428319154104297454666647063679624028208478294081894177792365782518110223 +e= 3 +c= 175676150266632261170048224865383344382701466592480820852821987310883907646453945269873798553604154950679789706816103734968119191264040967221804258086782193045472222806462922151478555259607753533988574525462498108797766467552606740700525351657072574897006690469089852849417334378963664086027896356417125 +h = pow(2, 1005) +if (h < n): + print("YES") +m = int(gmpy2.iroot(c, 3)[0]) +flag = libnum.n2s(m) +print(flag) +``` + +最后输出: + +```txt +YES +b'flag{d07cc7cf-9d78-4bfb-9449-d099b0329563}' +``` ##为什么要选择这个方向: >实践出真知