RSA的破解

题目

在已知密文、公钥和加密算法的前提下求解私钥和明文。
加密算法:

    p=getPrime(1024)
    q=getPrime(1024)
    e=65537
    n1=p*q
    m=bytes_to_long(flag)
    c1=pow(m,e,n1)
    print c1,e,n1
    p=getPrime(1024)
    e=65537
    n2=p*q
    m=bytes_to_long("1"*32)
    c2=pow(m,e,n2)
    print c2,e,n2

密文和公钥:
RSA的破解_第1张图片

RSA原理

RSA的破解_第2张图片

  1. 第一步求出两个大素数

因为题目中给出了n1和n2是由两个大素数组成,且n1和n2存在最大公因数q。
求最大公因数用gcd函数:

def gcd(a,b):
    if b ==0:
        return a
    else:
        return gcd(b,a%b)
n1=19097168568374284889660535938455702489788009753897194730645109417639633056811936860200293549872923369058135591864295904631609233767460201562895176193535018796860650002764384946502133853931157095891244132683871222848901408013165784595045431596215317916295119675262191951421502620501764341248081079145249348843994478303064891709900087612571839212629300410406409288509407036489300952861464272415269540913002615229409177136622364330059294617214886770289950476187888763729146835265833002839748356104024963482340411348663277303226457974358887951105702091875091978793031272569598086500214553092818203348750971322259003621283
n2=15935670398199234986129357600603280281824122033183184439127163308963775672033985124674266368198108819880227596681633707288188796095376684227887499667460152523085224829120886135907892957396314340679638461578066308536103425774125800963830230227706417216321025596886061193137833065551115278334776149822197543686529973758601000691905113618322318195450540085340977466258449381422833353793620916655987085389581403595930751800531619044265871980757178210252586212611219585450786402938848271915617043494499788978729362371646719328129508116812502971427943870745273633352458273192779068457349105524860844458824380944127442868347
c1=6202758654557486807245934869894300222360289655026053249792484238344229871623881130384718745646056464229302235826603479780161542684951561164881211156570131428659277736302848501656837242528910933766549281630032534784874087849228543883686251499536050687926104862843784795457109875837313290104150038928707108813672857096066006034944513238601686450382000820041719554043224766929315805509003509057855176799729807319964627926645775600798410817920970524671343380074753964332188651913123603111386161022302943205272692833744674258527077473879637279320931686292871442831245167742739435896345558299032852153562752423066561702926
q= gcd(n1,n2)
print q

在这里插入图片描述

反解出p:

p= n1/q
print p

在这里插入图片描述
2. 求出φ(n)

fa=(p-1)*(q-1)
print fa

在这里插入图片描述
3. 已知e,求e的逆元d
求逆元函数:

def EX_GCD(a,b,arr): #扩展欧几里得
    if b == 0:
        arr[0] = 1
        arr[1] = 0
        return a
    g = EX_GCD(b, a % b, arr)
    t = arr[0]
    arr[0] = arr[1]
    arr[1] = t - int(a / b) * arr[1]
    return g
def ModReverse(a,n): #ax=1(mod n) 求a模n的乘法逆x
    arr = [0,1,]
    gcd = EX_GCD(a,n,arr)
    if gcd == 1:
        return (arr[0] % n + n) % n
    else:
        return -1

求e的逆元d:

e=65537
d=ModReverse(e,fa)

在这里插入图片描述
4. 解出x

x= pow(c1,d,n1)
print x

在这里插入图片描述
对将结果转化为字符串:

print libnum.n2s(x)

在这里插入图片描述

你可能感兴趣的:(RSA的破解)