''' p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951 q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223 e = 65537 c = 40005881669517895877352756665523238535105922590962714344556374248977905431683140065629966778249773228248201807844489945346731806741025157651474530811920115794270396320935022110691338083709019538562205165553541077855422953438117902279834449006455379382431883650004540282758907332683496655914597029545677184720 '''
decrypt.py
已知p,q,e,c,可直接求出d,然后求出m
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import *
p = 10554915510546378513140074459658086644656654144905337809416976066414771647836950941616441505897207397834928781511863699153349798682451297889979721668885951 q = 8246403321715011123191410826902524505032643184038566851264109473851746507405534573077909160292816825514872584170252311902322051822644609979417178306809223 e = 65537 c = 40005881669517895877352756665523238535105922590962714344556374248977905431683140065629966778249773228248201807844489945346731806741025157651474530811920115794270396320935022110691338083709019538562205165553541077855422953438117902279834449006455379382431883650004540282758907332683496655914597029545677184720
''' n = 7382582015733895208810490097582153009797420348201515356767397357174775587237553842395468027650317457503579404097373070312978350435795210286224491315941881 e = 65537 c = 6511001389892474870028836129813814173158254564777610289284056550272120510686249909340499673868720839756059423749304765055919251717618117507007046973023557 '''
n = 7382582015733895208810490097582153009797420348201515356767397357174775587237553842395468027650317457503579404097373070312978350435795210286224491315941881 e = 65537 c = 6511001389892474870028836129813814173158254564777610289284056550272120510686249909340499673868720839756059423749304765055919251717618117507007046973023557
p = 70538125404512947763739093348083497980212021962975762144416432920656660487657 q = 104660876276442216612517835199819767034152013287345576481899196023866133215633
''' n = 53690629441472827148854210396580805205350972614395425306316047967905824330731 e = 65537 c = 22130296334673852790451396673112575082637108306697684532954477845025885087040 '''
''' n = 115637000420176820831322601039129424406844427046456738651883381559357542765613732363445112111006849040385859313572091386802534464534403117787314180179562651607533039692795522388596550968316951090748054495960090527479954143448774136390568881020918710834542819900918984139672802889774720153267841255456602500057 e = 65537 c = 98161406745910866780822530171878255235776133393411573803496865047700715941955255328757920065032397556905095591171977170479344602512244671081108703687450560269408412671849929423399172588599903975793985819498354819305128607934552101433664794909855378636055525016664559476808490723554481335856183927702549281730 '''
decrypt.py
已知n,e,c,且p,q相差不大(特例款)。
直接copy了xenny师傅的wp,😰😢
本题的关键是q = gmpy2.next_prime(p),相当于q是p的下一个素数
然后这里可以采用一个\(\sqrt{n}\),因为\(n = p*q\),考虑n的算术平方根为\(sn = \sqrt{n}\),同时 sn
也是p和q的几何平均值。所以有\(p<sn<q\)
from Crypto.Util.number import * from gmpy2 import * p = getPrime(512) q = gmpy2.next_prime(p)
n = 115637000420176820831322601039129424406844427046456738651883381559357542765613732363445112111006849040385859313572091386802534464534403117787314180179562651607533039692795522388596550968316951090748054495960090527479954143448774136390568881020918710834542819900918984139672802889774720153267841255456602500057 e = 65537 c = 98161406745910866780822530171878255235776133393411573803496865047700715941955255328757920065032397556905095591171977170479344602512244671081108703687450560269408412671849929423399172588599903975793985819498354819305128607934552101433664794909855378636055525016664559476808490723554481335856183927702549281730
sn = isqrt(n) #或者sn = gmpy2.iroot(n,2) q = next_prime(sn) p = n // q
from Crypto.Util.number import * import gmpy2 flag = b'NSSCTF{******}'
p = getPrime(512) q = gmpy2.next_prime(p - getPrime(256)) n = p*q e = 65537 phi = (p-1)*(q-1) m = bytes_to_long(flag) c = pow(m, e, n)
print(f'n = {n}') print(f'e = {e}') print(f'c = {c}') ''' n = 148841588941490812589697505975986386226158446072049530534135525236572105309550985274214825612079495930267744452266230141871521931612761645600600201983605957650711248808703757693378777706453580124982526368706977258199152469200838211055230241296139605912607613807871432800586045262879581100319519318390454452117 e = 65537 c = 69038543593219231496623016705860610154255535760819426453485115089535439537440188692852514795648297200067103841434646958466720891016026061658602312900242658759575613625726750416539176437174502082858413122020981274672260498423684555063381678387696096811975800995242962853092582362805345713900308205654744774932 '''
decrypt1.py
已知n,e,c,且p,q相差不大(经典款)。
直接yafu分解:
但是不能用[RSA1]P4里面的方法,因为根号n的下一个素数不一定是q哦😡
1 2 3 4 5 6 7 8 9 10 11 12 13 14
from Crypto.Util.number import *
P = 12200065120379104459630695224710181907653841921369674962900093531339421658815375891425102591939094029941691738405035324548070063226677838530633694428729829 q = 12200065120379104459630695224710181907653841921369674962900093531339421658815305905822146210878434959851438079877557401145694064756239882458467901042367473 e = 65537 c = 69038543593219231496623016705860610154255535760819426453485115089535439537440188692852514795648297200067103841434646958466720891016026061658602312900242658759575613625726750416539176437174502082858413122020981274672260498423684555063381678387696096811975800995242962853092582362805345713900308205654744774932
from Crypto.Util.number import * from gmpy2 import * p = getPrime(512) q = gmpy2.next_prime(p - getPrime(256))
n = 148841588941490812589697505975986386226158446072049530534135525236572105309550985274214825612079495930267744452266230141871521931612761645600600201983605957650711248808703757693378777706453580124982526368706977258199152469200838211055230241296139605912607613807871432800586045262879581100319519318390454452117 e = 65537 c = 69038543593219231496623016705860610154255535760819426453485115089535439537440188692852514795648297200067103841434646958466720891016026061658602312900242658759575613625726750416539176437174502082858413122020981274672260498423684555063381678387696096811975800995242962853092582362805345713900308205654744774932
deffermat_attack(n): a = isqrt(n) b2 = a*a - n b = isqrt(n) #这里只是对b进行一个初始化,b=1,2,3,,,等于几应该都行 count = 0 while b*b != b2: a = a + 1 b2 = a*a - n b = isqrt(b2) count += 1 p = a+b q = a-b assert n == p * q return p, q
''' p = 10666139331774428325755287635566473140804481321882464031499529816800186578792308674238646794969384836340484775213796013129603472328582005363876462361316357 q = 8419311673449738061914489023962717718536471719688567807316495262754711350004888752049108347226115000749280146228195893953964759818878155006622123533942989 r = 12875078327453384158245832541544758526474680184252540739652077682353277702054275525591573258723948221345537075374635382175740236093131628077747126356403959 e = 65537 c = 424552463648937499189041230155623101311087334789253159440707211761796081289342164253743235182597460622581134089949035117444838205449163269030784233435435681797627188717450074808905561404960693227573181548281296514743775615606388692910356320667720308219275107443303501165027740512539959960217657836317351146520079753390346207659007421416917274795119021374032194294225350901136669304225010974617136606299060486198480556729770211945777266366417547752798441211059402 '''
decrypt.py
已知(e,p,q,r),求m(特例款)
相当于多了一个参数r,还是一样,加上r就行了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
from Crypto.Util.number import *
p = 10666139331774428325755287635566473140804481321882464031499529816800186578792308674238646794969384836340484775213796013129603472328582005363876462361316357 q = 8419311673449738061914489023962717718536471719688567807316495262754711350004888752049108347226115000749280146228195893953964759818878155006622123533942989 r = 12875078327453384158245832541544758526474680184252540739652077682353277702054275525591573258723948221345537075374635382175740236093131628077747126356403959 e = 65537 c = 424552463648937499189041230155623101311087334789253159440707211761796081289342164253743235182597460622581134089949035117444838205449163269030784233435435681797627188717450074808905561404960693227573181548281296514743775615606388692910356320667720308219275107443303501165027740512539959960217657836317351146520079753390346207659007421416917274795119021374032194294225350901136669304225010974617136606299060486198480556729770211945777266366417547752798441211059402
''' p = 80505091208742938705306670241621545375764148093711243653439069254008824979403 q = 67599990875658931406915486208971556223245451500927259766683936131876689508521 e = 65537 c = 7958690969908064264211283192959937430539613460471121984649054121171267262097603091410178042319139582772142226087020110084551158367679146616732446561228522673699836019156243452069036383047309578614662564794584927846163157472211089368697387945469398750955336949678910159585015004994620777231073804301249774041 '''
decrypt.py
已知(e,p,q,r),求m(经典款)
byd欧拉公式都不知道是吧:
对于: \[
n = p_{1}^{k_{1}}p_{2}^{k_{2}}p_{3}^{k_{3}}\cdots p_{r}^{k_{r}}
\]
p = 80505091208742938705306670241621545375764148093711243653439069254008824979403 q = 67599990875658931406915486208971556223245451500927259766683936131876689508521 e = 65537 c = 7958690969908064264211283192959937430539613460471121984649054121171267262097603091410178042319139582772142226087020110084551158367679146616732446561228522673699836019156243452069036383047309578614662564794584927846163157472211089368697387945469398750955336949678910159585015004994620777231073804301249774041
''' p = 7478755670255767435237487693415479182290330775502792675052667363676831056436638619069277770540533350723045234676443621124912287506103439704868369839725279 q = 9232828888049557325429111621080998490274442347556398052322580869768941301413255711626092627273543579067597113958627672298942570149816938335701615759283713 r = 102909133680612532601801231903654039 e = 65537 c = 142893174944324070830219394465469685943669308818639857030565389839224452373848570577201378981080333784852764502832587008270072323948511579823852437852643609820245476634896477031076952735298279618952398460203032125853063235638358942643559551563899381032067185778629120272032518475352761100115057449043142848203976076694124978394099839339406197 '''
decrypt.py
已知(e,p,q,r),且m已知很短
总结:
满足以下情况时,可以不使用题中给的n=pqr计算公式,自己重新计算n,再进一步计算公私钥:
明文m比较简短
flag = b’NSSCTF{ \(\cdots\cdots\)}’
+ b’1’ * 100 不行
flag = b’NSSCTF{ \(\cdots \cdots\)
}’ 可以
分析发现使用给定的n无法计算d,原因可能是d = inverse(e,
phi)中e、phi不互素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
from Crypto.Util.number import * from gmpy2 import *
p = 7478755670255767435237487693415479182290330775502792675052667363676831056436638619069277770540533350723045234676443621124912287506103439704868369839725279 q = 9232828888049557325429111621080998490274442347556398052322580869768941301413255711626092627273543579067597113958627672298942570149816938335701615759283713 r = 102909133680612532601801231903654039 e = 65537 c = 142893174944324070830219394465469685943669308818639857030565389839224452373848570577201378981080333784852764502832587008270072323948511579823852437852643609820245476634896477031076952735298279618952398460203032125853063235638358942643559551563899381032067185778629120272032518475352761100115057449043142848203976076694124978394099839339406197
n = p * q # 相当于直接把r给忽略掉了,但原理还没懂,xenny师傅的wp有点没看懂 phi = (p-1)*(q-1)
''' p = 9927950299160071928293508814174740578824022211226572614475267385787727188317224760986347883270504573953862618573051241506246884352854313099453586586022059 q = 9606476151905841036013578452822151891782938033700390347379468858357928877640534612459734825681004415976431665670102068256547092636766287603818164456689343 e = 131074 c = 68145285629092005589126591120307889109483909395989426479108244531402455690717006058397784318664114589567149811644664654952286387794458474073250495807456996723468838094551501146672038892183058042546944692051403972876692350946611736455784779361761930869993818138259781995078436790236277196516800834433299672560 '''
from Crypto.Util.number import * from gmpy2 import *
p = 9927950299160071928293508814174740578824022211226572614475267385787727188317224760986347883270504573953862618573051241506246884352854313099453586586022059 q = 9606476151905841036013578452822151891782938033700390347379468858357928877640534612459734825681004415976431665670102068256547092636766287603818164456689343 e = 65537 c = 68145285629092005589126591120307889109483909395989426479108244531402455690717006058397784318664114589567149811644664654952286387794458474073250495807456996723468838094551501146672038892183058042546944692051403972876692350946611736455784779361761930869993818138259781995078436790236277196516800834433299672560
n = p*q phi = (p-1)*(q-1) d = invert(e, phi) m = pow(c, d, p*q)
print(long_to_bytes(isqrt(m)))
# 后面这部分也能写出下面这样:
n = p * q phi = (p-1)*(q-1) # print(gcd(e, phi))
d = invert(e, phi) m = pow(c,d,n) a,b = gmpy2.iroot(m,2)