2023 泰山杯 --- Crypto wp

题目

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 sha256

flag = 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) ^ urand
        Q = s * G
        if isPrime(Q.x) and isPrime(Q.y):
            return Q.x, Q.y


def sign(m, k, x, p, q, g):
    cm = sha256(m).digest()
    hm = bytes_to_long(cm)
    r = pow(g, k, p) % q
    s = (hm + x * r) * inverse(k, q) % q
    return r, s


def encrypt(msg):
    p, q, r, t = getPrime(256), getPrime(256), getPrime(256), getPrime(256)
    pubkey = p ** 2 * q * r * t
    n = pubkey
    phi = (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=17892143742135558659464483241031582705399015704984635198259117502698806062144577358841580186430592021484784182374984891504991723987372158404717308894627025254370106060682124762121644746055038786733570766842371672272269500805787962472846195694411232153017387865489974233181909133999038179766349022983643293490318883

cm1=[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+ax+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+ax3+bx2
⇒ n 2 = x 5 + a ∗ x 3 + b ∗ x 2 \Rightarrow n^2 = x^5+a*x^3+b*x^2 n2=x5+ax3+bx2
此时构建一个在模Ep下的方程即可解出 x x x,也就是p,进而q = n//p

part2

本质上是dp泄露,其中
n = p 2 ∗ q ∗ r ∗ t n = p^2*q*r*t n=p2qrt
p h i = p ∗ ( p − 1 ) ( q − 1 ) ∗ ( r − 1 ) ∗ ( t − 1 ) phi = p*(p-1)(q-1)*(r-1)*(t-1) phi=p(p1)(q1)(r1)(t1)
p h i 1 = ( p − 1 ) ( q − 1 ) ( r − 1 ) ( t − 1 ) phi_1 = (p-1)(q-1)(r-1)(t-1) phi1=(p1)(q1)(r1)(t1)
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 ed11 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 nm1+kphi1 mod pqrt
根据费马小定理
a p − 1 ≡ 1   m o d   p a^{p-1} \equiv 1 \space mod \space p ap11 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+kphi1 mod pqrtm mod pqrt
⇒ 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 nm0 mod pqrt
又 ∵ n = p 2 ∗ q ∗ r ∗ t 又\because n = p^2*q*r*t n=p2qrt
则有, 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 nmn存在最大公约数pqrt
所以,存在任意自然数 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,使得pqrt=gcd(med1 mod nm,n)m[2,pqrt)
⇒ 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) pqrt=gcd(med1 mod nm,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)k1 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)k1 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 s1kH(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 s2kH(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 (s1s2)kH(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(s1s2)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)k1 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 xr1(ksH(m)) mod q

解题代码

#sage
from hashlib import sha256
from Crypto.Util.number import *
import gmpy2

a = -3
b = 1093849038073734274511112390766805569936207598951683748994586394495953116150735016013708737573759623248592132296706313309438452531591012912142327488478985984
ecc_p = 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
n = 17892143742135558659464483241031582705399015704984635198259117502698806062144577358841580186430592021484784182374984891504991723987372158404717308894627025254370106060682124762121644746055038786733570766842371672272269500805787962472846195694411232153017387865489974233181909133999038179766349022983643293490318883
s1 = 1147444956942488206425397540690496331513776719096397579521439800869593847794208912124600845863795170543614454413750492051491732502087262731130173253134510721
r1 = 1157925007400122568661548726339484089282532284376929635262438142895805835643192575599802310792451479232905705228133875039893052991121145062272055314297648646
s2 = 1705053872995228285447305031429522382982990819347651751236442503354782702527682212062279231285695576661552718820729949632674150767988313498856519278708115047

cm1=[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}

【看似鸡毛蒜皮的琐碎小事,最消磨孝心善心。】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值