zoukankan      html  css  js  c++  java
  • NPUCTF2020 EzRSA

    题目

    from gmpy2 import lcm , powmod , invert , gcd , mpz
    from Crypto.Util.number import getPrime
    from sympy import nextprime
    from random import randint
    p = getPrime(1024)
    q = getPrime(1024)
    n = p * q
    gift = lcm(p - 1 , q - 1)
    e = 54722
    flag = b'NPUCTF{******************}'
    m = int.from_bytes(flag , 'big')
    c = powmod(m , e , n)
    print('n: ' , n)
    print('gift: ' , gift)
    print('c: ' , c)
    
    #n:  17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
    #gift:  2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
    #c:  3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
    

    分析与求解

    1. 根据题设,得到以下关系:

    [gift=lcm((p-1),(q-1)) gmpy2.lcm求最小公倍数 ]

    [n=p*q ]

    [c=m^{e} mod n ]

    1. 尝试直接将(n)分解,无果。(gift)可以分解为

    gift = 8 * 11 * 97 * 9601 * 26057167557433418766727399341516665922795024485718296827775927226598694152064298989740080209950805089159979564300359652085874056289167084685303669920341402021998569251561854184586912056788515477034039863935829715784489123437315798902409373317578932823488000322365526936227790036245092665207472438169954702748857842187299166976320465787901470261800372425345547560303561842376571751928531743505412746346436473024093575122041981043859827477404447458211341273671273506575488189374812217939984540494633634622813448773520886788206836310702581026986331011987344147901504555559723572981774237352245997308787165273589

    1. 此外,根据我们小学五年级学过的知识,有:

    [最小公倍数(p, q) * 最大公因数(p,q) = p*q ]

    所以对于(gift),我们有:

    [gift*gcd(p-1, q-1)=(p-1)*(q-1)=phi(n) ]

    1. 我们可以求出(gift)的二进制位数为2045

    求法:print(len(bin(gift)[2:]))

    1. 同时知道(phi(n)=(p-1)*(q-1))的位数为2048,因此(gcd(p-1, q-1))占3bits,因此最大公因数的范围(十进制)为([4, 8])
    2. 在此范围内遍历最大公因数的值,然后与最小公倍数相乘得到(phi(n))的值,再有(e, phi(n))求得(d),然后就可求得明文
    3. 但是这个时候发现一个问题(e)值不是素数,分解可以得到

    [e=2*27361 ]

    所以,在计算时,需要将原先的(e)值除以2才可以进行常规的解密操作。
    8. 值的变化可通过以下表达式体现

    [c=(m^{2})^{frac{e}{2}}mod n ]

    所以解出的明文需要开根号再转为字节流

    1. 完整的求解代码如下:注意:遍历过程中不是所有的值都符合条件,可能会报ZeroDivisionError,因此需要加异常处理
    from Crypto.Util.number import *
    import gmpy2
    
    e = 54722
    # e = 2*27361
    n = 17083941230213489700426636484487738282426471494607098847295335339638177583685457921198569105417734668692072727759139358207667248703952436680183153327606147421932365889983347282046439156176685765143620637107347870401946946501620531665573668068349080410807996582297505889946205052879002028936125315312256470583622913646319779125559691270916064588684997382451412747432722966919513413709987353038375477178385125453567111965259721484997156799355617642131569095810304077131053588483057244340742751804935494087687363416921314041547093118565767609667033859583125275322077617576783247853718516166743858265291135353895239981121
    gift = 2135492653776686212553329560560967285303308936825887355911916917454772197960682240149821138177216833586509090969892419775958406087994054585022894165950768427741545736247918410255804894522085720642952579638418483800243368312702566458196708508543635051350999572787188236243275631609875253617015664414032058822919469443284453403064076232765024248435543326597418851751586308514540124571309152787559712950209357825576896132278045112177910266019741013995106579484868768251084453338417115483515132869594712162052362083414163954681306259137057581036657441897428432575924018950961141822554251369262248368899977337886190114104
    c = 3738960639194737957667684143565005503596276451617922474669745529299929395507971435311181578387223323429323286927370576955078618335757508161263585164126047545413028829873269342924092339298957635079736446851837414357757312525158356579607212496060244403765822636515347192211817658170822313646743520831977673861869637519843133863288550058359429455052676323196728280408508614527953057214779165450356577820378810467527006377296194102671360302059901897977339728292345132827184227155061326328585640019916328847372295754472832318258636054663091475801235050657401857262960415898483713074139212596685365780269667500271108538319
    # gift = 8 * 11 * 97 * 9601 * 26057167557433418766727399341516665922795024485718296827775927226598694152064298989740080209950805089159979564300359652085874056289167084685303669920341402021998569251561854184586912056788515477034039863935829715784489123437315798902409373317578932823488000322365526936227790036245092665207472438169954702748857842187299166976320465787901470261800372425345547560303561842376571751928531743505412746346436473024093575122041981043859827477404447458211341273671273506575488189374812217939984540494633634622813448773520886788206836310702581026986331011987344147901504555559723572981774237352245997308787165273589
    
    print(len(bin(gift)[2:]))
    print(len(bin(n)[2:]))
    
    # gift * gcd = (p-1) * (q-1)
    # gift % gcd = 0
    for gcd_val in range(4, 8):
        phi = gift * gcd_val
        try:
            d = gmpy2.invert(e // 2, phi)
            m_2 = pow(c, int(d), n)
            flag = long_to_bytes(gmpy2.isqrt(m_2))
            print(flag)
        except ZeroDivisionError:
            continue
    

    NPUCTF{diff1cult_rsa_1s_e@sy}

  • 相关阅读:
    Leetcode-113 Path Sum II(路径总和 II)
    Leetcode-946 验证栈序列(Validate Stack Sequences)
    Leetcode-945 Minimum Increment to Make Array Unique(使数组唯一的最小增量)
    UVa-10129 Play on Words
    UVa-10305 Ordering Tasks
    UVa-816 Abbott's Revenge
    UVa-1103 Ancient Messages
    种子填充(flood fill)
    内存池
    Leetcode-942 DI String Match(增减字符串匹配)
  • 原文地址:https://www.cnblogs.com/vict0r/p/13723450.html
Copyright © 2011-2022 走看看