• 2023 柏鹭杯 --- Crypto fractrsa wp


    文章目录

    题目

    #python3
    import sys 
    sys.path.append("..") 
    from Crypto.Util.number import *
    from random import *
    from sage.all import *
    from  secret import flag1 as flag
    
    num1 = 3
    num2 = 5
    while(num1<num2):
        num1 = getPrime(512)
        num2 = getPrime(512)
    pt = bytes_to_long(flag) + num2
    
    ring = RealField(1100)
    num3 = ring(num1) / ring(num2)
    print("num3 = ", num3)
    
    while True:
        p = randint(2**511, num1)
        q = randint(2**511, num2)
        if isPrime(p) and isPrime(q) and p!=q:
            break
     
    N = p*q
    e = 65537
    leak = pow(p-q, num1, num1*num2)
    ct = pow(pt, e, N)
    
    print("ct = ", ct)
    print("N = ", N)
    print("leak = ", leak)
    
    """
    num3 = 1.23389923415003373900567515471436168841941584796842188964423737295914869304653496800649965063081353720701415762591488370228399019899893688681309320356016722276295236528757306976510687729729934668311830828756908988350841843676900575414367123810470585198055372776278588638204471298838884740198056387082949710435502826460830711429956
    ct = 31011170589632318837149853165664224847925206003567781692767655474759523146503572164952138829336342836023903919700264739071138739105931471740973631326608186969523753119546323993892359278563753903149741128282349467136720827132122619177620866305659196267641453819504766216964516467658995724859657544518337771393
    N = 61860727516406742636690805639158184396057779906729165734489212939937929906456706343476469874085504076991779041906401043694401076841639925611957258119417559980829238154105119701407722069260962772947894516879731956778127512764229384957918619863998939985369399189275568362193066167855420897196095587732512368673
    leak = 23213363443983005040318061737977092634638640953366787443691593387275645092922646169818923792205696350020369122807136306157118385984272980615310163206933078119776935167207473544453080959202803743994251355133953187110546017667004996272367137522351606700447920805532616096125523674597551449412004735397779511371
    """
    
    
    • 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

    解题过程

    将num3转为连分数形式, n u m 3 = n u m 1 n u m 2 num3 = \frac{num1}{num2} num3=num2num1,再遍历其收敛值列表,其值满足512bit且是素数的则为num1和num2

    #sage
    num3 = 1.23389923415003373900567515471436168841941584796842188964423737295914869304653496800649965063081353720701415762591488370228399019899893688681309320356016722276295236528757306976510687729729934668311830828756908988350841843676900575414367123810470585198055372776278588638204471298838884740198056387082949710435502826460830711429956
    cf = continued_fraction(num3)
    frac_list = cf.convergents()
    for i in frac_list:
        tmp = str(i).split('/')
        if len(tmp)==2:
            num1 = int(tmp[0])
            num2 = int(tmp[1])
            if num1.bit_length()==512 and num2.bit_length()==512 and is_prime(num1) and is_prime(num2):
                print(num1)
                print(num2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    得到num1和num2

    num1 = 11167377337790397338811417806698264734026040696284907854286100186126887838302430726803014418419121360514985339992064951270502853852777225947659429837569693
    
    num2 = 9050477566333038464101590216458863799039754468566791821195736389139213194857548339787600682491327798736538059818887575696704421576721592454156775006222517
    
    • 1
    • 2
    • 3

    利用 l e a k leak leak解出 p − q p-q pq,且已知 n = p ∗ q n=p*q n=pq,可构建一个方程组,解方程得到p,q。解出 p t pt pt之后减去 n u m 2 num2 num2即可得到flag

    from Crypto.Util.number import *
    import gmpy2
    from sympy import *
    
    num1 = 11167377337790397338811417806698264734026040696284907854286100186126887838302430726803014418419121360514985339992064951270502853852777225947659429837569693
    num2 = 9050477566333038464101590216458863799039754468566791821195736389139213194857548339787600682491327798736538059818887575696704421576721592454156775006222517
    num3 = 1.23389923415003373900567515471436168841941584796842188964423737295914869304653496800649965063081353720701415762591488370228399019899893688681309320356016722276295236528757306976510687729729934668311830828756908988350841843676900575414367123810470585198055372776278588638204471298838884740198056387082949710435502826460830711429956
    ct = 31011170589632318837149853165664224847925206003567781692767655474759523146503572164952138829336342836023903919700264739071138739105931471740973631326608186969523753119546323993892359278563753903149741128282349467136720827132122619177620866305659196267641453819504766216964516467658995724859657544518337771393
    n = 61860727516406742636690805639158184396057779906729165734489212939937929906456706343476469874085504076991779041906401043694401076841639925611957258119417559980829238154105119701407722069260962772947894516879731956778127512764229384957918619863998939985369399189275568362193066167855420897196095587732512368673
    leak = 23213363443983005040318061737977092634638640953366787443691593387275645092922646169818923792205696350020369122807136306157118385984272980615310163206933078119776935167207473544453080959202803743994251355133953187110546017667004996272367137522351606700447920805532616096125523674597551449412004735397779511371
    e = 65537
    phi1 = (num2-1)*(num1-1)
    d1 = gmpy2.invert(num1,phi1)
    p_q = pow(leak,d1,num1*num2)
    
    p,q = symbols('p q')
    eq = [p*q-n,p-q-p_q]
    result = list(nonlinsolve(eq,[p,q]))
    p,q = int(result[1][0]),int(result[1][1])
    phi = (p-1)*(q-1)
    d = gmpy2.invert(e,phi)
    m = pow(ct,d,n)
    flag = long_to_bytes(m-num2)
    print(flag)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    水中有明月,碎碎圆圆;心中有良人,平平安安。】

  • 相关阅读:
    记一次生产大对象及GC时长优化经验
    马斯克欲“放手”,终止收购 Twitter
    初始vue3
    如何将数据显示到UI上?
    第十五届蓝桥杯模拟赛(第一期)
    PHP通过pem文件校验签名异常
    基于单片机的八路抢答器(数码管版)(独立按键、四位共阳极数码管、指示灯)
    UNIX环境高级编程-第五章
    正则表达式
    浅析JVM invokedynamic指令和Java Lambda语法|得物技术
  • 原文地址:https://blog.csdn.net/luochen2436/article/details/133790725