从0开始RSA 逐步变成RSA高手(二)

libnum库的使用及RSA会用到的函数

#pow()函数
第一种
a=3
b=4
c = pow(a,b)  # 计算a^b,a的b次方
print(c)
#输出结果81
第二种
a = 3
b = 4
c = 5
d = pow(a,b,c)  # 计算a^b mod c,先求a的b次方,再模c
print(d)        #81÷5 = 16......1
#输出结果1

#libnum.s2n()函数  字符串转换为数字
#s = "flag{RSA_is_easy}"
print(libnum.s2n(s))
#输出结果34852863801134503651556594674538971887997


#libnum.n2s()函数  数字转换为字符串
n = 34852863801134503651556594674538971887997
print(libnum.n2s(n))
#输出结果flag{RSA_is_easy}


#libnum.s2b()函数  字符串转换为二进制
s = "flag{RSA_is_easy}"
print(libnum.s2b(s))
#输出结果0110011001101100011000010110011101111011010100100101001101000001010111110110100101110011010111110110010101100001011100110111100101111101


#libnum.b2s()函数  二进制转换为字符串

b = "0110011001101100011000010110011101111011010100100101001101000001010111110110100101110011010111110110010101100001011100110111100101111101"
print(libnum.b2s(b))
#输出结果flag{RSA_is_easy}


#libnum.primes()函数  返回不大于n的素数列表
n = 100
print(libnum.primes(n))
#输出结果[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]



#libnum.generate_prime(n)函数  产生长度为n位的伪素数产生长度为n位的伪素数

print(libnum.generate_prime(128))
#输出结果321507399576220755333889790942476059179


#libnum.factorize(n)函数  返回n的所有素因子及每个素因子的个数

print(libnum.factorize(50))
输出结果{2: 1, 5: 2}


#libnum.modular.invmod(e,m)函数  返回e的乘法逆元mod m 计算e^(-1) mod m
e = 65537
m = 1000000007
print(libnum.modular.invmod(e,m))
输出结果743534192

好现在有了基础我们现在就可以开始RSA基础题了

已知d,e,n,c求m

n= 14685532699024100754723222996385121368294636639693750794149020559314539676501066491415844320990799035552463714403031072164829458702780715523923962246149328887690893262271480633736651143634392056066729487305166335857950659680699210683976952113003674104898343893168719508462975991580551696824510044412974267585312807460664570245139015568859112921920860421973308538800641652781742897528769692264955229878206911313791989518088100099218315995549914435278654377368771668058107642713121127495780090852489015591581414806590111818355121157794129813430710822697558144598815860067978324469091074823400715400666808772858128261149
d= 10655677501818714057545408290692306276248758047017058020876274084213258239416744966450976471246402284779991562186357882946337721435118045765127426899173581894141706933500094886492805160951008521020815528782559085235105783294876017603112074153984218299742602608478449101819428678878037976091306073545785820932796422483686522431260926680891531210950251782422010888047909274618007401655588566411972291526501884077240225819170340160706732901152519829956055255218835518533347875405883278225018714890042991619568316304958478955576005445279807142753050999269866987221510643119355301877102904394259290548609330522059178100989
e= 65537
c= 7937297427288435728721973474925856865675225171317301007619581716746999628275946964127516634203401830643076435690247635478297903236185011960902817030042080567027165802992734580344202744697251074454156026031417427325660809453340428989949816426637434868049018580855865080715251672252410696685286047485204432648545886024276695749435709592994477514818763551176789963387889424072650811645828675090859926233585219662579177051353763021116106877502871331756544361402971459889233069752657661921397258845893293005099736406362733668960163109452223071514272504206470939914043855546880424121530822318600645513435826636440478681928

都已经知道了c,d,n了,那这个e就没用了

根据解密公式m \equiv c^{^{d}} mod n

直接使用pow()去求m

import libnum

n= 14685532699024100754723222996385121368294636639693750794149020559314539676501066491415844320990799035552463714403031072164829458702780715523923962246149328887690893262271480633736651143634392056066729487305166335857950659680699210683976952113003674104898343893168719508462975991580551696824510044412974267585312807460664570245139015568859112921920860421973308538800641652781742897528769692264955229878206911313791989518088100099218315995549914435278654377368771668058107642713121127495780090852489015591581414806590111818355121157794129813430710822697558144598815860067978324469091074823400715400666808772858128261149
d= 10655677501818714057545408290692306276248758047017058020876274084213258239416744966450976471246402284779991562186357882946337721435118045765127426899173581894141706933500094886492805160951008521020815528782559085235105783294876017603112074153984218299742602608478449101819428678878037976091306073545785820932796422483686522431260926680891531210950251782422010888047909274618007401655588566411972291526501884077240225819170340160706732901152519829956055255218835518533347875405883278225018714890042991619568316304958478955576005445279807142753050999269866987221510643119355301877102904394259290548609330522059178100989
e= 65537
c= 7937297427288435728721973474925856865675225171317301007619581716746999628275946964127516634203401830643076435690247635478297903236185011960902817030042080567027165802992734580344202744697251074454156026031417427325660809453340428989949816426637434868049018580855865080715251672252410696685286047485204432648545886024276695749435709592994477514818763551176789963387889424072650811645828675090859926233585219662579177051353763021116106877502871331756544361402971459889233069752657661921397258845893293005099736406362733668960163109452223071514272504206470939914043855546880424121530822318600645513435826636440478681928

m=pow(c, d, n)
print(libnum.n2s(m).decode())

#输出结果flag{20d6e2da95dcc1fa5f5432a436c4be18}

根据上面函数的学习你已经可以出题了

参考出题脚本


import libnum
import uuid

#安装uuid库 pip install uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
#生成随机素数
p=libnum.generate_prime(1024)  #改1024就行
q=libnum.generate_prime(1024)  #改1024就行
e=65537
n=p*q
phi_n=(p-1)*(q-1)
#求逆元
d=libnum.invmod(e,phi_n)
c=pow(m,e,n)
print ("n=",n)
print("d=",d)
print ("e=",e)
print ("c=",c)

已知p,q,e,c求m

题目
p= 172990055271599797477046528501405220044817995757385603261933513936821465675348645154271605975012887547780064589839847406192857799568495059585573771240463528854102733586552542558553466217032854286077390638852298983321982311456393406807122399168556256960643703162876333142443261333268651203532166391660649719601
q= 132595769569531663054685507918958003839509779849543062327006368823096012251323140951341853341120532876926100767159235386548681782142321980460398711353157486439625438187834374617435004944959638642799438555342352962674501663660129600425592335713601951078368644735451679266313677465299125394616506277559205164683
e= 65537
c= 7223580170190224710839659701407531919637620492687836404982941065610655931886697514050383439389147217055192134231297362797433825715669487661544007531993656533439045389044159897965588034921866866602136149047014244029193476563344353308338903159715476353449192560563421816822491853865581665627716287642798258738955159588116639208211720630144585056721586461033104735963792484630505996163745309161215867144912276153228943011497593711536125768529129568856212655920812297010878449934562064844082400388301604351123141931305228945293671176842089149371177749739556369921558382413662755819283708035653211227326858384245453514086

解题思路:

有p和q可以去求出n与phi_n-->f(n)

有n了我们就可以取求d,通过d = e^{^{-1}} mod phi_n

有d,e,n,c解题就和上面的一样了

import libnum
p= 172990055271599797477046528501405220044817995757385603261933513936821465675348645154271605975012887547780064589839847406192857799568495059585573771240463528854102733586552542558553466217032854286077390638852298983321982311456393406807122399168556256960643703162876333142443261333268651203532166391660649719601
q= 132595769569531663054685507918958003839509779849543062327006368823096012251323140951341853341120532876926100767159235386548681782142321980460398711353157486439625438187834374617435004944959638642799438555342352962674501663660129600425592335713601951078368644735451679266313677465299125394616506277559205164683
e= 65537
c= 7223580170190224710839659701407531919637620492687836404982941065610655931886697514050383439389147217055192134231297362797433825715669487661544007531993656533439045389044159897965588034921866866602136149047014244029193476563344353308338903159715476353449192560563421816822491853865581665627716287642798258738955159588116639208211720630144585056721586461033104735963792484630505996163745309161215867144912276153228943011497593711536125768529129568856212655920812297010878449934562064844082400388301604351123141931305228945293671176842089149371177749739556369921558382413662755819283708035653211227326858384245453514086
                                  #由前期的基础知识,我们可以去算出n=p*q
n=p*q                             #然后通过求解d=e^(-1) mod (p-1)(q-1)公式来得到私钥d

phi_n=(p-1)*(q-1)                 #计算f(n)=(p-1)(q-1)

d=libnum.modular.invmod(e,phi_n)  #计算e^(-1) mod phi_n

m = pow(c,d,n)                    #计算c^d mod n

print(libnum.n2s(m))              #输出:b'flag{8beb48fb-be1f-4c04-b05f-2743e42d6a68}'

参考出题脚本

import libnum
import uuid
flag = "flag{" + str(uuid.uuid4()) + "}"
m = libnum.s2n(flag)
#生成随机素数
p=libnum.generate_prime(1024)
q=libnum.generate_prime(1024)
e=65537
n=p*q
phi_n=(p-1)*(q-1)
#求逆元
d=libnum.invmod(e,phi_n)
c=pow(m,e,n)

print("p=",p)
print("q=",q)
print ("e=",e)
print ("c=",c)

关注我不定时每天更新RSA,从crypto新手突破。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值