RSA 共模n攻击

例题

c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
e1=11187289
c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
e2=9647291

攻击条件

c1,e1,c2,e2,n => m

已知n,同一份密文m用e1和e2两个公钥分别加密得到c1和c2两份密文

原理

已知 c1,e1,c2,e2,n

由此可得:
c 1 = m e 1 % n c_{1} =m^{e_{1} } \% n c1=me1%n
c 2 = m e 2 % n c_{2} =m^{e_{2} } \% n c2=me2%n

又因为gcd(e1,e2)=1
所以 e 1 s 1 + e 2 s 2 = 1 e_{1}s_{1}+e_{2}s_{2}=1 e1s1+e2s2=1 肯定能找到一组解

结论为:

m = ( c 1 s 1 ∗ c 2 s 2 ) % n = ( ( c 1 s 1 % n ) ∗ ( c 2 s 2 % n ) ) % n m=(c_{1}^{s_{1}} *c_{2}^{s_{2}}) \% n=((c_{1}^{s_{1}} \% n)*(c_{2}^{s_{2}} \% n)) \% n m=(c1s1c2s2)%n=((c1s1%n)(c2s2%n))%n

证明如下:
( c 1 s 1 ∗ c 2 s 2 ) % n (c_{1}^{s_{1}} *c_{2}^{s_{2}}) \% n (c1s1c2s2)%n

= ( ( m e 1 % n ) s 1 ∗ ( m e 2 % n ) s 2 ) % n =((m^{e_{1} } \% n)^{s_{1}}*(m^{e_{2} } \% n)^{s_{2}}) \% n =((me1%n)s1(me2%n)s2)%n

= ( ( ( m e 1 % n ) s 1 % n ) ∗ ( ( m e 2 % n ) s 2 ) % n ) % n =(((m^{e_{1} } \% n)^{s_{1}} \% n)*((m^{e_{2} } \% n)^{s_{2}}) \%n) \% n =(((me1%n)s1%n)((me2%n)s2)%n)%n

= ( ( m e 1 s 1 % n ) ∗ ( m e 2 s 2 % n ) ) % n =((m^{e_{1}s_{1} } \% n)*(m^{e_{2}s_{2} } \%n)) \% n =((me1s1%n)(me2s2%n))%n

= m e 1 s 1 + e 2 s 2 % n =m^{e_{1}s_{1} + e_{2}s_{2} } \% n =me1s1+e2s2%n

= m % n =m \% n =m%n

= m =m =m

脚本

from gmpy2 import *
from Crypto.Util.number import *

# c1,e1,c2,e2,n => m

def rsa(c1,c2,e1,e2,n):
    #扩展欧几里得算法,第一个返回结果是最大公因数,后面两个分别对应e1,e2的系数
    g,s1,s2=gcdext(e1,e2)
    m=(pow(c1,s1,n)*pow(c2,s2,n))%n
    print(long_to_bytes(m))


if __name__ == "__main__":
    c1=22322035275663237041646893770451933509324701913484303338076210603542612758956262869640822486470121149424485571361007421293675516338822195280313794991136048140918842471219840263536338886250492682739436410013436651161720725855484866690084788721349555662019879081501113222996123305533009325964377798892703161521852805956811219563883312896330156298621674684353919547558127920925706842808914762199011054955816534977675267395009575347820387073483928425066536361482774892370969520740304287456555508933372782327506569010772537497541764311429052216291198932092617792645253901478910801592878203564861118912045464959832566051361
    n=22708078815885011462462049064339185898712439277226831073457888403129378547350292420267016551819052430779004755846649044001024141485283286483130702616057274698473611149508798869706347501931583117632710700787228016480127677393649929530416598686027354216422565934459015161927613607902831542857977859612596282353679327773303727004407262197231586324599181983572622404590354084541788062262164510140605868122410388090174420147752408554129789760902300898046273909007852818474030770699647647363015102118956737673941354217692696044969695308506436573142565573487583507037356944848039864382339216266670673567488871508925311154801
    e1=11187289
    c2=18702010045187015556548691642394982835669262147230212731309938675226458555210425972429418449273410535387985931036711854265623905066805665751803269106880746769003478900791099590239513925449748814075904017471585572848473556490565450062664706449128415834787961947266259789785962922238701134079720414228414066193071495304612341052987455615930023536823801499269773357186087452747500840640419365011554421183037505653461286732740983702740822671148045619497667184586123657285604061875653909567822328914065337797733444640351518775487649819978262363617265797982843179630888729407238496650987720428708217115257989007867331698397
    e2=9647291

    rsa(c1,c2,e1,e2,n)

变形

e1= 221
e2= 299
n= 22752951745297736168537377055274778116665470909065477125935886705065315928343909239030226134317655286811706825307791028935468695248938314873728310939010332033303049984284854672480419186656651898284247010047681096246455201967436493619623922813042286133760359535974396266228677845061471522291462170675019300170320671686114928795841399272659671749295028598451924716935439876301262667477640877837569951118311739219264913187243646073550492683492113343384821975066291244933858116486782731928931431642274809491405001955412026149194699922670378380172100475024897567223023327826339547555266975263552287361838466410256332586243602018701252181095544525087725089471855146785890801898964498900490722824136161536824524023843219008916078446694933471093288073098317841217353433648382906362253310187885031349173752969974195099147758139669961092400692293113078059473080806234076443570119722130939533645583942861471571301658146374104930923161280707107854937882275460478198823125819905477560849933589115721416285687345303919348351291800712956242809906173781232818857076129195419972616950359257381023984782648862051425193061029177411755248884275122634206055064928918131704555281055171016232989653908936425333474592396425262724183978715755517681781896905505681019433680152515179578293854352466356161898967395639133527374169311595381
c1= 10892593793227365116925700965458364184649125396663943796073539260980997644891965799450399424218723107551158558465723957982810191916064316067402569229239706110587662283006062233207602849048977390414725491999094784268795765845090278541345060691227848049341792356361866090107794846740587550516493827550761044916120742634716100959568752284205773635157016570644732882618112667602892495591343383196825341503584074765200031063900399784671363062540083853968276812461259424786023596109476654103941796084022234777516856935201686089014703949873963763173504178597282120893681944701529635472087336308148045296570250358965387578639389647372863697874387920284376355175371658214022432637233049643918240215883756536156344271717888814377311625833162569949367074856096858774042469897229733611875690829200986478219874772214075323186921718101279851215225427651429974497218901117181173977981895145545289488897144837754206327890077498892642359817562974797240756164341335703875164746037528216084897204167262772966756903307518956994642174111291907559634725813349461899233834828219448501415166737945826263270661137588163692728905410221169466525723870303978092494941639719863782656186969513167917612386960116158336850718448480833247082725651743364206989720150402475518960807596933665261898347257015381952076956414926169065628402035877024
c2= 16234449136110301948915044033782803178888320780730248041362289400402520359200135207779437601300318341574596537693496447844160745059083759235870748096444629141498803084865475060123420097840970184733706276824699107779327930269426809903826537911640592522293558467627053309463726380481516500764543325038595504462274814965367972343969703518441786374346751491786697266008897789281988633961789937331687231107598075641627085598476591935681238873469342798684028977952673061492319474370639867032312696974209893993745844085661037025325712464003345130349368517370647831842069123305455497561422546383131187398775555886803281812066994566108824332556193714585778964779070971454065665303736272711223551782164863853905352227680603140162402255969282233812006972796280850233545219871869909534783019159100014111451843232957211373061429434617954249240688081192808501611525220067662230418353538193891708132134012043837396576358357488762683942703800181858824520755919230602612335238556205420378498803006965524284284802224595940916712846360900844939206346374912066944666599066191687022350969781809803220970991254223987034473812934155305370148168751311003191110608399854183137132450387729417275410039697670774601121758536584269746197227045293026303760774202258533200041885054449850059983037919760683276465377311443445828203784214390883

前面所说的攻击手法都是建立在e1,e2互素的基础上的。那么如果e1,e2不互素呢?

不妨设 gcd ⁡ ( e 1 , e 2 ) = a \gcd(e_{1} , e_{2} ) =a gcd(e1,e2)=a,那么由扩展欧几里得算法,求得的一组s1,s2就不是使等式右边为1了,而是 s 1 e 1 + s 2 e 2 = a s_{1}e_{1}+s_{2}e_{2}=a s1e1+s2e2=a

上面的推导过程到 = m e 1 s 1 + e 2 s 2 % n =m^{e_{1}s_{1} + e_{2}s_{2} } \% n =me1s1+e2s2%n之后就是等于 m a m^{a}%n ma,所以最后要开a次方根。

脚本:

from gmpy2 import *
from Crypto.Util.number import *


e1 =
e2 =
n = 
c1 = 
c2 = 

a, s1, s2 = gcdext(e1, e2)
m = (pow(c1, s1, n)*pow(c2, s2, n)) % n
while True:
    if iroot(m, a)[1]:
        m = iroot(m, a)[0]
        print(long_to_bytes(m))
        break
    m += n

猜你喜欢

转载自blog.csdn.net/m0_51507437/article/details/122978218
RSA
今日推荐