RSA

1、首先进行交互,看看会发生什么,交互界面输出一些东西(做题的时候忘记了截图!不过没有关系,请接着往下看)

2、对出题人发布的题目源码进行代码审计,发现交互界面给出的是c1,e,n1,c2,e,n2

    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

3、根据源码我们可以知道,加密方式是RSA加密,我们首先来看一下RSA工作过程(这里直接用的ppt)
RSA
4、根据源码,两次加密的q是一样的,但是p不一样,我们要做的是将flag解出,就需要将第一次加密的私钥(d)解出来,这样根据解密公式就可以将flag解出。
RSA
5,、将私钥(d)解出来,就需要将φ(n)解出来,自然而然的就需要将p、q解出来。
RSA6、通过交互,我们知道n1,n2,这两个数都是大质数的乘积,则q为n1,n2的最大公因子,这样可以将q解出。
7、q解出来,p也就可以确定,φ(n)也就可以确定,则d就是e在模为φ(n)时的乘法逆元,这样就可以将d解出来。
8、最后利用解密公式,将flag解出,这里解出来的是数字,需要将其转换字符串。解题成功。
最终flag为:flagflag
9、附上脚本

    import numpy as np
import base64
import re
from crypto.util.number import long_to_bytes

n1 = 28986134087549938381818025408800355537754413600851200653983690760805671416180825898462204111557323074808471298812701525944412592588137910749845538239719567717893567916905376463827847854206349427950473805840382298320132459658323007954097396388871161320938429851596472764989749639081488609106718919960525703721846492915410923649633742759629864058763811164776032571171052109160957248571808347962229387383227327593246981804786720024838387104253682794451107478779788142745740185886567636862338297747403684458378310354375838872360119099615106936630365241577350387283984345780067454514676312531933242144792007870082454918397
n2 = 27837042633564093601513492201971060817134869282518546159044545689175898668978649610078818499364405486864952772939220311487624685692878728554436949329538037984988127515092612159411595933438928041293276214510494230688148537326431925140008874863607560198220401015082373016555048274482259565973507367936691585383485393192674036836489468815930025424061313780838584896256101183360828540226398162568785121029252326524547717343984315218318661392260435465412124251717861777072370967395794592444073763963593423935199580366388794117764337427871454343759978741696992234608670051277042563905735800342559238495048790964426962581417
e=65537
c1=15043342893351947970683295718125821787284913852543080383373016276139226281053376487856451387212186574598996068906398050820861984723874191085664299308596138856977479629845054467996079917261090205497109443969283987606908712966987608383357229874127684414241282271018452381059505683076406798971524385445024584480897242851999030418001680528410891255397568102479978912371542191363983865067982850920286480326150198610826727855784142559712681724105076564988722055981631959016927310349160985803918851114966907017022648819925325416448661491228045478541840210827321560122639335551235640259084650460480430435299310157967219141764


def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)

print gcd(n1,n2)
q=gcd(n1,n2)
p1=n1/q
p2=n2/q
print p1
print p2
print 0
f=(p1-1)*(q-1)
print f

print 111
for i in range(1,100000):
    ee=((i*f+1)/e)
    eee = (i*f+1)%ee
    if(eee==0):
        print ee

print 111
#print ee
d= 10431770733920576875254588206539285986747571588410766721468168062077338999680195304043968234359079940223577582950033998976531049770111856858657809556769850987903591755620950139247198063526114372150691596877355644722502467209381059029332151169994281259680086157128864712071779834099455122059158527948928990463027602997470207383210711869780956919329733028824614644185238006735408896006978100527689170907623239296446672649896423131641740691942574839932655343554173816983161888487979659365864916912830310688742875636191815988835429064133453353073782287588242450502628537871920513147294817710452407173781921004481508165761
#print pow(ee,1,f)
print 0
m=pow(c1,d,n1)
print m

mm=long_to_bytes(m)
print mm
上一篇:I2C—读写EEPROM学习笔记之软件模拟IIC原理


下一篇:docker 安装,100% work