• 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
    
    """
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    解题过程

    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}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

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

  • 相关阅读:
    CSS3之颜色渐变效果
    集合—LinkedList底层结构
    【计算机网络】第三章:数据链路层
    计网第五章(运输层)(五)(TCP拥塞控制)
    兽医诊所温湿度失衡,该如何止损?
    Chrome内存追踪
    《C++ Primer》第3章 字符串、向量和数组(三)
    SFI立昌在Telecom通讯行业的方案与应用
    丛林探险问题
    cloudfoundry搭建jenkins
  • 原文地址:https://blog.csdn.net/luochen2436/article/details/133793317