大数RSA


情况1

    # !/usr/bin/python3
    # -*-coding:UTF-8-*-

    # 已知p,q(或n),e,c
    # 大数分解网址:http://www.factordb.com/

    # 方法2
    import gmpy2 as gp
    from binascii import a2b_hex,b2a_hex

    p =  gp.mpz(9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483)

    q =  gp.mpz(11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407)
    e =  gp.mpz(65537)
    c =  gp.mpz(83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034)

    n = p*q

    phi = (p-1) * (q-1)
    d = gp.invert(e, phi)
    m = pow(c, d, n)

    print m
    print 'flag{'+hex(m)[2:]+'}'
    # !/usr/bin/python3
    # -*-coding:UTF-8-*-

    # 已知p,q(或n),e,c
    # 大数分解网址:http://www.factordb.com/

    # 方法1
    from Crypto.Util.number import inverse
    p = 282164587459512124844245113950593348271
    q = 366669102002966856876605669837014229419
    # 求e
    n = p*q
    phi = (p-1)*(q-1)

    e = 65537
    # 求逆元
    d = inverse(e, phi)
    # 密文
    c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
    m = pow(c, d, n)
    print(bytes.fromhex(hex(m)[2:]))

情况2

    # -*-coding:UTF-8-*-
    # 已知e,n,dp,c

    import gmpy2 as gp

    e = 65537
    n = gp.mpz(444511907374811621333864968430251419855347882081695888904531795366857517417289716213363408137550866409163408633679685635315881237914815762134949770798439327373469286675370381115822381092997433491238495970527484356127131132345893007368069814286822931047915482947544230741924674880304607902413527794657556174021361113759962742306966643629644800759209829893438222447478882663573891473386520138017997195362559918730232709719486847337248425121547893862458228964360472119045154255446606447184782930767120924229261090464514045697735201016333117579385787597262783543886217220299959364476125167328883418109849139384318692440116746717156025869399990008034002881758452936213924306428955442475834311604905905260723607788504332389824348292286402781474054375184928462870240017012586229806658850881803134678565293180207556731290044948846308165695896369703720482941116135445836684836990286418102640883844706122407701782360072256987197118468391662366105964629786899281484884877640733549203394680006068637251717623691598753570260479050407069262236583726905151495550801274277155039839844872050380772537409714164680083539118124646217833871816488578092001365486400242215564766336041803413006183310354910820598373905617564797817421231716827155927723376783)
    dp = gp.mpz(20688083194401098183398626094352469308150523583583104270723199988926694776131531953207031668652408481119466919329893607763657623952024909876740067584191851505244658377465365020503008072292716279306615911408934182303357474341329766407852983275790499225322862499664901633190925232802162977135254216707834894816730529759991634343322039528413883937752397011466779521590767711786777317159161700645318091278528395252576086979838790917201179739657819356771788743301669430631157222234922010934163688512789947321007479617996170289230676037655762865962020063056831019134814970048718940037920888121806608032574204482673114726401)

    c = gp.mpz(378245912689862819668716257795108255336928883693984263805908702337591160408234974716356292413190786704878880742998101926728409825216339197208512929079484687018187263522243781958701468849915372674337274640196043362477406890622345686503512151501592397926764442945655423801602100185867239106836704835215686246083812117439685990637352246191517010645343417283169123105697782747026231044064639955374854873089604766677942725374108213749982052985866259433900255218180285975477045323647923881322428349632056484406017564586481848442834247385904402824072352354677823823078646874632195128328299942128116508251564811923564362991466660005438580449558184197006623490303413636461137434703925564785299335803341222051570131842042120923719184091689629809380828306649702440460761848154682611972768099340896995546188526274235118488618951865589050087434162728116205149188555273127955536588551565951618535230908129965250151258048934985977493740897420718340268536363763127676899114219828753570040978640121185354431884041597851910784347040946251752577201426797684912671641470307249794269755972278013107831885544781029384256069586713714201822683071958299038410102821213570933652719191413490563464823296852894960994148922867149263897530215474500564443133161527)
    for x in range(1, e):
        if(e*dp%x==1):
            p=(e*dp-1)//x+1
            if(n%p!=0):
                continue
            q=n//p
            phin=(p-1)*(q-1)
            d=gp.invert(e, phin)
            m=gp.powmod(c, d, n)
            if(len(hex(m)[2:])%2==1):
                continue
            print m
            print hex(m)[2:]
            print hex(m)[2:].decode('hex')

情况3

    # -*-coding:UTF-8-*-
    # 共模攻击
    # 攻击条件:当两个用户使用相同的模数 N、不同的私钥时,加密同一明文消息时即存在共模攻击
    # 已知多个c和对应的多个e,它们共用一个n,


    import gmpy2 as gp

    def exgcd(a, b):
        if b==0:
            return 1, 0, a
        x2, y2, r = exgcd(b, a%b)
        x1 = y2
        y1 = x2-(a//b)*y2
        return x1, y1, r

    c1=gp.mpz(22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361)
    n=gp.mpz(22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801)
    e1=gp.mpz(11187289)
    c2=gp.mpz(18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397)
    e2=gp.mpz(9647291)

    r1, r2, t = exgcd(e1, e2)
    m = gp.powmod(c1, r1, n) * gp.powmod(c2, r2, n) % n
    print m
    print hex(m)[2:]
    print hex(m)[2:].decode('hex')

情况4

    # -*-coding:UTF-8-*-
    # 已知 p,q,dp,dq,c

    import gmpy2 as gp

    p = gp.mpz(8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229)
    q = gp.mpz(12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469)
    dp = gp.mpz(6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929)
    dq = gp.mpz(783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041)
    c = gp.mpz(24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852)

    n = p*q
    phin = (p-1)*(q-1)

    dd = gp.gcd(p-1, q-1)

    d=(dp-dq)//dd * gp.invert((q-1)//dd, (p-1)//dd) * (q-1) +dq
    print(d)


    m = gp.powmod(c, d, n)

    print m
    print hex(m)[2:]
    print hex(m)[2:].decode('hex')