RSA

发布时间 2023-12-03 11:19:22作者: Eddie68

 

菜鸟营互助:

CTF Crypto RSA合集(新生赛难度)_历届ctf竞赛rsa题目_Cot287的博客-CSDN博客

Crypto中常用的数据类型互转方式
Crypto中常用的数据类型互转方式_long_to_bytes-CSDN博客

 

 

》。。。。。。。。。。。。。。。。。。。。。。。。题目思密达。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。》

就是现在p,q是两个素数,而且他俩在素数序列里面就是一前一后的关系。所以我们要把他俩的乘积开根号得到的结果一定是在p,q之间的一个数字,(而且一定不是素数,因为p,q就是紧邻的两个素数)。

那我们找这个开方出来的数字的下一个素数,一定是q,因此我们再让n/q就可以得到两个素数。(这是第一种方法,必须得保证两个数为素数,而且挨得很近才行,我们还会介绍第二种方法,即使有一个不是素数也可以解决

import gmpy2
from Crypto.Util.number import *

e = 0x10001  #65537
p = getPrime(1024)
  =141496660433366889270545466330850887676022290181252986045191397103716739928522902753590956836793724720660070953105031641323352138017453611886384350976562289236036625214701304137112280085936778739584096334053717138042447824758203778328083054455919029980731605325653142976625341701351792418303109603210580687643
q = gmpy2.next_prime(p)
 = 103730738863613233932113552454615445438251930136901340622818495355699378215098396222203334540607673895173625532199303565004411763049989620729049497304440802792326436749787482708498524498376590196046316601744402149268026923432411115370193130014813744392571843617183380180344564355683059281462570888232581872639
n = p * q
: 8711312672358247110555459533037283937577459870805409557871933405052448320745403067773711672692041152405675923838247248581446794757852077118400103001078740223863125428986657150901940308874225561581951004129364261828465172430566422639133414788211905791358174108139271348870540352428616194140760811383733369952409596793934432342384067441255861801138802285062718142992992879028741968577803799711624783143650615150342418332050505669920953199039761971970193069323693564015567290357856709057446452549199138116890806254422969705933700128301325712866187315462133193862065535020652970708208646672601322518582835704509616121709
print("n =",n)
m = bytes_to_long(flag.encode())
c = pow(m,e,n)#m的e次幂后除以n的余数
print("c =", c)

解题代码思密达

import gmpy2
from Crypto.Util.number import *

n = 14649512071940761295526637299115559124785876291769759641385535810496168571356390875028933662157908527898907054595131961482960199302467356648190631379274697720401554559470504824985612622685394835695867966115901784024976569320394309553109935293587085148062564681314500481394907365147112082687540360098391086714184976743558033278590993154588786124775939766047431416725457741728688637126487364728587712375561695773966767394586311222451769970033239320178997793213284313210443479640426969378574483212255956628018029837363008023768111344140167747248153597634302708520935820581465887878375715293178199822355763254571306861917
c = 12027845013546239316392609172930965416584271242308913354667016233680471230190790405734811583067266163929286181494107261515098660000911579736414996680283956326170766501669935802000154155100686665545895817739485941641910099289990601294438262123368049333984283589964986184064905792613875257151557808151252971101910091243823103407818141675466520285172900274592414845571880035970983902425078647997819177759066019180722029670490597477951055687802318789372881560617674901053734286030365059070206136368543590547536318698381100062114654273208529717439733092703250435608159570238122076785000005010026224446523393666360709957236


e = 0x10001  #65537

p = gmpy2.iroot(n,2)[0]-10000
while not isPrime(p) : p += 1
q = p + 2
while not isPrime(q) : q += 2
while p*q - n != 0 :
    p = q
    q += 2
    while not isPrime(q) : q += 2

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

print(long_to_bytes(m))

Powmod函数和pow函数  c=pow(m,e,n):m的e次幂后除以n的余数是c

 

大佬的总结:(很有帮助)

入坑CTF——RSA解密之大素数分解和共模攻击的Python实现_ctf rsa解密_01Dr1ver的博客-CSDN博客

RSA-p和q挨得很近(费马分解)_rsa费马分解_爱码蔡蔡子的博客-CSDN博客

BUUCTF RSA题目全解4_bytes_to_long long_to_bytes-CSDN博客

CTF Crypto RSA合集(新生赛难度)_历届ctf竞赛rsa题目_Cot287的博客-CSDN博客