本文主要是介绍2023 泰山杯 --- Crypto wp,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 题目
- 解题过程
- part1
- part2
- part3
- 解题代码
题目
from fastecdsa.curve import P521 as Curve
from fastecdsa.point import Point
from os import urandom
from random import getrandbits
import uuid
from Crypto.PublicKey import DSA
from Crypto.Util.number import *
import random
from hashlib import sha256flag = f"flag{{{uuid.uuid4()}}}".encode('utf-8')
m1 = b'****************'
m2 = b'****************'def gen(G):urand = bytes_to_long(urandom(256 // 8))while True:s = getrandbits(256) ^ urandQ = s * Gif isPrime(Q.x) and isPrime(Q.y):return Q.x, Q.ydef sign(m, k, x, p, q, g):cm = sha256(m).digest()hm = bytes_to_long(cm)r = pow(g, k, p) % qs = (hm + x * r) * inverse(k, q) % qreturn r, sdef encrypt(msg):p, q, r, t = getPrime(256), getPrime(256), getPrime(256), getPrime(256)pubkey = p ** 2 * q * r * tn = pubkeyphi = (p - 1) * (q - 1) * (r - 1) * (t - 1)privkey = inverse(n, phi)c = long_to_bytes(pow(bytes_to_long(msg), pubkey, pubkey))return [c, pubkey, privkey]def verify(message, r, s, p, q, g, y): cm = sha256(message).digest()hm = bytes_to_long(cm)w = pow(s, q - 2, q) u1 = (hm * w) % q u2 = (r * w) % q v = ((pow(g, u1, p) * pow(y, u2, p)) % p) % q return v == r ecc_p = Curve.p
a = Curve.a
b = Curve.b
Gx = Curve.gx
Gy = Curve.gy
G = Point(Gx, Gy, curve=Curve)
p, q = gen(G)
n = p * q
print(f"a={a}")
print(f"b={b}")
print(f"ecc_p={ecc_p}")
print(f"n={n}")
x = bytes_to_long(flag)
cm1 = encrypt(m1)
cm2 = encrypt(m2)
key = DSA.generate(int(2048))
g = key.g
assert q > x
k = random.randint(1, q - 1)
r1, s1 = sign(m1, k, x, p, q, g)
r2, s2 = sign(m2, k, x, p, q, g)
print(f"cm1={cm1}")
print(f"cm2={cm2}")
print(f's1 = {s1}')
print(f'r1 = {r1}')
print(f'r2 = {r2}')
print(f's2 = {s2}')"""
a=-3
b=1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984
ecc_p=6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
n=17892143742135558659464483241031582705399015704984635198259117502698806062144577358841580186430592021484784182374984891504991723987372158404717308894627025254370106060682124762121644746055038786733570766842371672272269500805787962472846195694411232153017387865489974233181909133999038179766349022983643293490318883cm1=[b'~(\x13K\xbd\x07\xf6\xac\x0f^\xff\xc0\x11\xf4\\-[bd\xd4\xee\xad\xd3\x12hY\xa9\xfawU6\tM\xd8\xc7$Q\x08fe\x0e\xa6V\x84Af\xc2\x90\xff\x0b\xb3\xf7\t\xeb\x1f\x92\xe9_\xc2d\x0b,\xb8j\xa7x\xb7\xd8.\x01\x0f\xb3\xfb\x84}\x18M_$J\x19WS\x19\xe4\xac|\xfb\xab\\\xddE\xe8K\x11\x85\x94I\x88\x06\xda\xd9\xa5\xd3%\xdeZ\xc0\xa1\x96K\x8f\xc9\xd6rZ\xf9\x80\x03\xb6\xe7&\xc7\xba\xfa\x11\x0e\x17\x03\xc6@\xf9\xe1\x91\xc3\x98\xfd~\xb4,\xbf+\xf1\x9c\x13\xf9\xcb\xd3\xa2\xcd\t\xc1\xa0\x16\xac(kO\x0e', 4210112960230753389177723103991057503675404064215473253619064996297654205031972289490914887593241466687180915490587736105591295790203391680056466722777574962131018329890483040708509359428184782432390334491747709835762154148954222667111743029165387940794322517656416298463983972364481679736217231237972603248180412651171720538869199141557228108454144762163387122885891997412124486368093, 34467673940229375549861096366968383350573853982091018691379038369575391106133342982206096859322434387821396329105522038690695490560975568642248771969263414977884644851551873207137010180591879084640509485920597821696620795026052163156567900184188166776652129980691756851240082925443033375548789315858902528245]cm2=[b"\x04L\xfbgl\x83\x8c\xd0\xd1\x94\xaeH\x15\x1f\x9d\r\xfe4Qo\x1f\x0e\xac\x99\x10\xd7p\x05\x0e\xe1Z\xde\xf1-\x90'\xfd\n\xcb\x11\x95\xe7\xfd\xb4\xa9\xe1g\xba\x88\x97h\t\x114\x8f\r\xa4\xf38\xf59\xbdbt\x8f\\U\xeau\x0e\xe2C\xd0\xbf\xb0\x0b\xe4\xfb\\\xb1\xe6\xd8\xc9K\x99F\n\xd1s(\xda \xe1\xa0)st\xdduv\x05\t\x97\x85\xbfdnr$\xeee<\xdd\xa2j\xd1l\x0c\x14\xe0\x9d!\x9d\x85J\xe6\x08\xf3\x8b\xf5^\xb6\xf9\xd5\xf8\xf1\xa9\x05\x11\xf2\x1f\xe6L}_?\xdc\xf1\xcf_\x19K\x9d?F\x11\x8a\xd6m_", 2107035726522358468787800437216735702294054489210423482763141344245971658038208946943384473505445944203654154393368969472650747972993446483863354738530464536671191192852772663305104685295729636566877550779644763943501495227449049599621704191810033993441720482366622086425653151565702373624357844645714794047547901924425604430887869417863146263310137069165358904526698570368614646908659, 25851316624668868073282577242443094459803237792257031370809123539176662555947554778083633535689341409219664781371076460089226128423940382827297717468898042144540839805840728213520942720971834042050337266075935231655467146339599134132537675265039256700087188339078240329238442682883808814292004154090735239739]s1 = 1147444956942488206425397540690496331513776719096397579521439800869593847794208912124600845863795170543614454413750492051491732502087262731130173253134510721
r1 = 1157925007400122568661548726339484089282532284376929635262438142895805835643192575599802310792451479232905705228133875039893052991121145062272055314297648646
r2 = 1157925007400122568661548726339484089282532284376929635262438142895805835643192575599802310792451479232905705228133875039893052991121145062272055314297648646
s2 = 1705053872995228285447305031429522382982990819347651751236442503354782702527682212062279231285695576661552718820729949632674150767988313498856519278708115047"""
解题过程
part1
y 2 = x 3 + a ∗ x + b y^2 = x^3+a*x+b y2=x3+a∗x+b
两边同时乘上 x 2 x^2 x2
⇒ x 2 y 2 = x 5 + a ∗ x 3 + b ∗ x 2 \Rightarrow x^2y^2 = x^5+a*x^3+b*x^2 ⇒x2y2=x5+a∗x3+b∗x2
⇒ n 2 = x 5 + a ∗ x 3 + b ∗ x 2 \Rightarrow n^2 = x^5+a*x^3+b*x^2 ⇒n2=x5+a∗x3+b∗x2
此时构建一个在模Ep下的方程即可解出 x x x,也就是p,进而q = n//p
part2
本质上是dp泄露,其中
n = p 2 ∗ q ∗ r ∗ t n = p^2*q*r*t n=p2∗q∗r∗t
p h i = p ∗ ( p − 1 ) ( q − 1 ) ∗ ( r − 1 ) ∗ ( t − 1 ) phi = p*(p-1)(q-1)*(r-1)*(t-1) phi=p∗(p−1)(q−1)∗(r−1)∗(t−1)
p h i 1 = ( p − 1 ) ( q − 1 ) ( r − 1 ) ( t − 1 ) phi_1 = (p-1)(q-1)(r-1)(t-1) phi1=(p−1)(q−1)(r−1)(t−1)
e = n e = n e=n
e d 1 ≡ 1 m o d p h i 1 ed_1 \equiv 1 \space mod \space phi_1 ed1≡1 mod phi1
m e d 1 m o d n ≡ m 1 + k ∗ p h i 1 m o d p ∗ q ∗ r ∗ t m^{ed_1} \space mod \space n\equiv m^{1+k*phi_1} \space mod \space p*q*r*t med1 mod n≡m1+k∗phi1 mod p∗q∗r∗t
根据费马小定理
a p − 1 ≡ 1 m o d p a^{p-1} \equiv 1 \space mod \space p ap−1≡1 mod p
⇒ m 1 + k ∗ p h i 1 m o d p ∗ q ∗ r ∗ t ≡ m m o d p ∗ q ∗ r ∗ t \Rightarrow m^{1+k*phi_1} \space mod \space p*q*r*t \equiv m \space mod \space p*q*r*t ⇒m1+k∗phi1 mod p∗q∗r∗t≡m mod p∗q∗r∗t
⇒ m e d 1 m o d n − m ≡ 0 m o d p ∗ q ∗ r ∗ t \Rightarrow m^{ed_1} \space mod \space n - m \equiv 0 \space mod \space p*q*r*t ⇒med1 mod n−m≡0 mod p∗q∗r∗t
又 ∵ n = p 2 ∗ q ∗ r ∗ t 又\because n = p^2*q*r*t 又∵n=p2∗q∗r∗t
则有, m e d 1 m o d n − m 与 n 存在最大公约数 p ∗ q ∗ r ∗ t 则有,m^{ed_1} \space mod \space n - m与n存在最大公约数p*q*r*t 则有,med1 mod n−m与n存在最大公约数p∗q∗r∗t
所以,存在任意自然数 m ,使得 p ∗ q ∗ r ∗ t = g c d ( m e d 1 m o d n − m , n ) , m ∈ [ 2 , p ∗ q ∗ r ∗ t ) 所以,存在任意自然数m,使得p*q*r*t = gcd(m^{ed_1} \space mod \space n - m,n),m\in [2,p*q*r*t) 所以,存在任意自然数m,使得p∗q∗r∗t=gcd(med1 mod n−m,n),m∈[2,p∗q∗r∗t)
⇒ p ∗ q ∗ r ∗ t = g c d ( m e d 1 m o d n − m , n ) \Rightarrow p*q*r*t = gcd(m^{ed_1} \space mod \space n - m,n) ⇒p∗q∗r∗t=gcd(med1 mod n−m,n)
然后分别解出 m 1 m_1 m1和 m 2 m_2 m2即可
part3
这部分采用了同一个随机密钥k签名了两次,又已知 m 1 m_1 m1和 m 2 m_2 m2,则有
s 1 ≡ ( H ( m 1 ) + x r ) k − 1 m o d q s_1 \equiv (H(m_1)+xr)k^{-1} \space mod \space q s1≡(H(m1)+xr)k−1 mod q
s 2 ≡ ( H ( m 2 ) + x r ) k − 1 m o d q s_2 \equiv (H(m_2)+xr)k^{-1} \space mod \space q s2≡(H(m2)+xr)k−1 mod q
变换一下,两边同时乘以k
s 1 k ≡ H ( m 1 ) + x r m o d q s_1k \equiv H(m_1)+xr \space mod \space q s1k≡H(m1)+xr mod q
s 2 k ≡ H ( m 2 ) + x r m o d q s_2k \equiv H(m_2)+xr \space mod \space q s2k≡H(m2)+xr mod q
两式两相减,消去 x r xr xr
( s 1 − s 2 ) k ≡ H ( m 1 ) − H ( m 2 ) m o d q (s_1-s_2)k \equiv H(m_1)-H(m_2) \space mod \space q (s1−s2)k≡H(m1)−H(m2) mod q
⇒ k ≡ ( s 1 − s 2 ) − 1 ( H ( m 1 ) − H ( m 2 ) ) m o d q \Rightarrow k \equiv (s_1-s_2)^{-1}(H(m_1)-H(m_2)) \space mod \space q ⇒k≡(s1−s2)−1(H(m1)−H(m2)) mod q
当我们知道随机密钥k,q,hm,r,s时候,并且那么我们就可以根据签名算法
s = ( H ( m ) + x r ) k − 1 m o d q s = (H(m)+xr)k^{-1} \space mod \space q s=(H(m)+xr)k−1 mod q
计算私钥出 x x x,即flag
x ≡ r − 1 ( k s − H ( m ) ) m o d q x \equiv r^{-1}(ks-H(m)) \space mod \space q x≡r−1(ks−H(m)) mod q
解题代码
#sage
from hashlib import sha256
from Crypto.Util.number import *
import gmpy2a = -3
b = 1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984
ecc_p = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
n = 17892143742135558659464483241031582705399015704984635198259117502698806062144577358841580186430592021484784182374984891504991723987372158404717308894627025254370106060682124762121644746055038786733570766842371672272269500805787962472846195694411232153017387865489974233181909133999038179766349022983643293490318883
s1 = 1147444956942488206425397540690496331513776719096397579521439800869593847794208912124600845863795170543614454413750492051491732502087262731130173253134510721
r1 = 1157925007400122568661548726339484089282532284376929635262438142895805835643192575599802310792451479232905705228133875039893052991121145062272055314297648646
s2 = 1705053872995228285447305031429522382982990819347651751236442503354782702527682212062279231285695576661552718820729949632674150767988313498856519278708115047cm1=[b'~(\x13K\xbd\x07\xf6\xac\x0f^\xff\xc0\x11\xf4\\-[bd\xd4\xee\xad\xd3\x12hY\xa9\xfawU6\tM\xd8\xc7$Q\x08fe\x0e\xa6V\x84Af\xc2\x90\xff\x0b\xb3\xf7\t\xeb\x1f\x92\xe9_\xc2d\x0b,\xb8j\xa7x\xb7\xd8.\x01\x0f\xb3\xfb\x84}\x18M_$J\x19WS\x19\xe4\xac|\xfb\xab\\\xddE\xe8K\x11\x85\x94I\x88\x06\xda\xd9\xa5\xd3%\xdeZ\xc0\xa1\x96K\x8f\xc9\xd6rZ\xf9\x80\x03\xb6\xe7&\xc7\xba\xfa\x11\x0e\x17\x03\xc6@\xf9\xe1\x91\xc3\x98\xfd~\xb4,\xbf+\xf1\x9c\x13\xf9\xcb\xd3\xa2\xcd\t\xc1\xa0\x16\xac(kO\x0e', 4210112960230753389177723103991057503675404064215473253619064996297654205031972289490914887593241466687180915490587736105591295790203391680056466722777574962131018329890483040708509359428184782432390334491747709835762154148954222667111743029165387940794322517656416298463983972364481679736217231237972603248180412651171720538869199141557228108454144762163387122885891997412124486368093, 34467673940229375549861096366968383350573853982091018691379038369575391106133342982206096859322434387821396329105522038690695490560975568642248771969263414977884644851551873207137010180591879084640509485920597821696620795026052163156567900184188166776652129980691756851240082925443033375548789315858902528245]
cm2=[b"\x04L\xfbgl\x83\x8c\xd0\xd1\x94\xaeH\x15\x1f\x9d\r\xfe4Qo\x1f\x0e\xac\x99\x10\xd7p\x05\x0e\xe1Z\xde\xf1-\x90'\xfd\n\xcb\x11\x95\xe7\xfd\xb4\xa9\xe1g\xba\x88\x97h\t\x114\x8f\r\xa4\xf38\xf59\xbdbt\x8f\\U\xeau\x0e\xe2C\xd0\xbf\xb0\x0b\xe4\xfb\\\xb1\xe6\xd8\xc9K\x99F\n\xd1s(\xda \xe1\xa0)st\xdduv\x05\t\x97\x85\xbfdnr$\xeee<\xdd\xa2j\xd1l\x0c\x14\xe0\x9d!\x9d\x85J\xe6\x08\xf3\x8b\xf5^\xb6\xf9\xd5\xf8\xf1\xa9\x05\x11\xf2\x1f\xe6L}_?\xdc\xf1\xcf_\x19K\x9d?F\x11\x8a\xd6m_", 2107035726522358468787800437216735702294054489210423482763141344245971658038208946943384473505445944203654154393368969472650747972993446483863354738530464536671191192852772663305104685295729636566877550779644763943501495227449049599621704191810033993441720482366622086425653151565702373624357844645714794047547901924425604430887869417863146263310137069165358904526698570368614646908659, 25851316624668868073282577242443094459803237792257031370809123539176662555947554778083633535689341409219664781371076460089226128423940382827297717468898042144540839805840728213520942720971834042050337266075935231655467146339599134132537675265039256700087188339078240329238442682883808814292004154090735239739]
#solve ecc to get q
R.<x> = PolynomialRing(Zmod(ecc_p))
f = x^5+a*x^3+b*x^2-n^2
result = f.roots()
p = int(result[0][0])
q = n//p
#solve rsa to get m1 and m2
c1, pubkey1, privkey1 = cm1
p1 = gmpy2.gcd(int(pow(5,privkey1*pubkey1,pubkey1)-5),int(pubkey1))
m1 = long_to_bytes(int(pow(bytes_to_long(c1),privkey1,p1)))c2, pubkey2, privkey2 = cm2
p2 = gmpy2.gcd(int(pow(5,privkey2*pubkey2,pubkey2)-5),int(pubkey2))
m2 = long_to_bytes(int(pow(bytes_to_long(c2),privkey2,p2)))#solve dsa
hm1 = bytes_to_long(sha256(m1).digest())
hm2 = bytes_to_long(sha256(m2).digest())
k = gmpy2.invert((s1 - s2), q) * (hm1 - hm2) % q
x = (s1 * k - hm1) * gmpy2.invert(r1, q) % q
flag = long_to_bytes(x)
print(flag)
#flag{d55a50f1-c95b-4e56-a7f7-b0efa1dc1d04}
【看似鸡毛蒜皮的琐碎小事,最消磨孝心善心。】
这篇关于2023 泰山杯 --- Crypto wp的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!