CTFShow-easyrsa1-4

回顾一下rsa加密算法:

密钥生成过程
1、 随机找两个质数 P 和 Q ,P 与 Q 越大,越安全;
2、 计算他们的乘积 n = P * Q
3、 计算 n 的欧拉函数 φ(n):φ(n) = φ(P * Q)= φ(P - 1)φ(Q - 1) = (P - 1)(Q - 1)
4、 随机选择一个整数 e,条件是 1< e < φ(n),且 e 与 φ(n) 互质
5、 计算e对于 φ(n) 的模反元素d,可以使得 ed 除以 φ(n) 的余数为 1
( 1<d<e,且ed mod φ(n) = 1 ) 即:d=e^-1 ( mod φ(n) )
6、 公钥(n,e);私钥(n,d);

RSA使用公共指数e和私有指数d。指数e是每个人都知道的公钥(e, N)的一部分。使用公钥e加密的消息只能使用私钥d解密

加解密过程
c:密文
m:明文
加密:c = m^e mod N
解密:m = c^d mod N

博主:lesczx, 原文链接:https://blog.csdn.net/lesczx/article/details/106652689

easyrsa1

题目:

e = 65537
n = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009

题解:知道密文要求明文。可先通过分解N得到p、q,在线分解大整数网址:factordb.com,然后可得φ(n),接着用gmpy2库中invert和powmod函数即可得到明文,代码如下:

import gmpy2
import binascii

e = 65537
N = 1455925529734358105461406532259911790807347616464991065301847
c = 69380371057914246192606760686152233225659503366319332065009
p = 1201147059438530786835365194567
q = 1212112637077862917192191913841

n = (p-1)*(q-1)
d = gmpy2.invert(e,n)#即e*d mod n = 1
m = gmpy2.powmod(c,d,N)#即m = c^d mod N
print(binascii.unhexlify(hex(m)[2:]))

easyrsa2

题目:

 题解:给了两组e、n、c,e都相同,可通过欧几里得算法求最大公因数p,q=n1//p,下面的计算和上题一样,代码如下:

import gmpy2
import binascii

e = 65537
N1 = 23686563925537577753047229040754282953352221724154495390687358877775380147605152455537988563490716943872517593212858326146811511103311865753018329109314623702207073882884251372553225986112006827111351501044972239272200616871716325265416115038890805114829315111950319183189591283821793237999044427887934536835813526748759612963103377803089900662509399569819785571492828112437312659229879806168758843603248823629821851053775458651933952183988482163950039248487270453888288427540305542824179951734412044985364866532124803746008139763081886781361488304666575456680411806505094963425401175510416864929601220556158569443747
c1 = 1627484142237897613944607828268981193911417408064824540711945192035649088104133038147400224070588410335190662682231189997580084680424209495303078061205122848904648319219646588720994019249279863462981015329483724747823991513714172478886306703290044871781158393304147301058706003793357846922086994952763485999282741595204008663847963539422096343391464527068599046946279309037212859931303335507455146001390326550668531665493245293839009832468668390820282664984066399051403227990068032226382222173478078505888238749583237980643698405005689247922901342204142833875409505180847943212126302482358445768662608278731750064815

N2 = 22257605320525584078180889073523223973924192984353847137164605186956629675938929585386392327672065524338176402496414014083816446508860530887742583338880317478862512306633061601510404960095143941320847160562050524072860211772522478494742213643890027443992183362678970426046765630946644339093149139143388752794932806956589884503569175226850419271095336798456238899009883100793515744579945854481430194879360765346236418019384644095257242811629393164402498261066077339304875212250897918420427814000142751282805980632089867108525335488018940091698609890995252413007073725850396076272027183422297684667565712022199054289711
c2 = 2742600695441836559469553702831098375948641915409106976157840377978123912007398753623461112659796209918866985480471911393362797753624479537646802510420415039461832118018849030580675249817576926858363541683135777239322002741820145944286109172066259843766755795255913189902403644721138554935991439893850589677849639263080528599197595705927535430942463184891689410078059090474682694886420022230657661157993875931600932763824618773420077273617106297660195179922018875399174346863404710420166497017196424586116535915712965147141775026549870636328195690774259990189286665844641289108474834973710730426105047318959307995062

p = gmpy2.gcd(N1,N2)
q = N1//p
n = (p-1)*(q-1)
d = gmpy2.invert(e,n)#即e*d mod n = 1
m = gmpy2.powmod(c1,d,N1)#即m = c^d mod N
print(binascii.unhexlify(hex(m)[2:]))

easyrsa3

题目:

 题解:和easyrsa2类似,同样是两组数,这次是n相同,看了题解知道是共模攻击

原理:

共模攻击即用两个及以上的公钥(n,e)来加密同一条信息m
已知有密文:
c1 = pow(m, e1, n)
c2 = pow(m, e2, n)
条件:
当e1,e2互质,则有gcd(e1,e2)=1
根据扩展欧几里德算法,对于不完全为 0 的整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么一定存在整数 x,y 使得 gcd(a,b)=ax+by
所以得到:
e1*s1+e2*s2 = 1
因为e1和e2为正整数,所以s1、s2皆为整数,但是一正一负,此时假设s1为正数,s2为负数

推导过程:

这里需要用到两条幂运算的性质:

(a * b) % p = (a % p * b % p) % p
a ^ b % p = ((a % p) ^ b) % p

因为c1 = m^e1%n,c2 = m^e2%n,需要证明m=(c1^s1*c2^s2)%n

代入可得:

(c1^s1*c2^s2)%n = ((m^e1%n)^s1(m^e2%n)^s2)%n

                             =((m^e1%n)^s1*(m^e2%n)^s2)%n

                             =((m^e1)^s1%n*(m^e2)^s2%n)%n   //消掉%n

                             =((m^e1)^s1*(m^e2)^s2)%n

                             =((m^(e1*s1)*(m^(e2*s2))%n   //幂的乘方,底数不变,指数相乘

                             =(m^(e1*s1+e2*s2))%n   //同底数幂相乘,底数不变,指数相加

又因为m<n,所以(c1^s1*c2^s2)%n=m%n=m

原文链接:【密码学RSA】共模攻击原理详解_已知e1*e2的共模攻击题_malloc_冲!的博客-CSDN博客_共模攻击

代码:

import gmpy2
import binascii

n = 15944475431088053285580229796309956066521520107276817969079550919586650535459242543036143360865780730044733026945488511390818947440767542658956272380389388112372084760689777141392370253850735307578445988289714647332867935525010482197724228457592150184979819463711753058569520651205113690397003146105972408452854948512223702957303406577348717348753106868356995616116867724764276234391678899662774272419841876652126127684683752880568407605083606688884120054963974930757275913447908185712204577194274834368323239143008887554264746068337709465319106886618643849961551092377843184067217615903229068010117272834602469293571
e1 = 797
c1 = 11157593264920825445770016357141996124368529899750745256684450189070288181107423044846165593218013465053839661401595417236657920874113839974471883493099846397002721270590059414981101686668721548330630468951353910564696445509556956955232059386625725883038103399028010566732074011325543650672982884236951904410141077728929261477083689095161596979213961494716637502980358298944316636829309169794324394742285175377601826473276006795072518510850734941703194417926566446980262512429590253643561098275852970461913026108090608491507300365391639081555316166526932233787566053827355349022396563769697278239577184503627244170930

e2 = 521
c2 = 6699274351853330023117840396450375948797682409595670560999898826038378040157859939888021861338431350172193961054314487476965030228381372659733197551597730394275360811462401853988404006922710039053586471244376282019487691307865741621991977539073601368892834227191286663809236586729196876277005838495318639365575638989137572792843310915220039476722684554553337116930323671829220528562573169295901496437858327730504992799753724465760161805820723578087668737581704682158991028502143744445435775458296907671407184921683317371216729214056381292474141668027801600327187443375858394577015394108813273774641427184411887546849

s = gmpy2.gcdext(e1,e2)#扩展欧几里得算法,得到x,y,即ax+by=gcd(a,b)
m1 = gmpy2.powmod(c1,s[1],n)
m2 = gmpy2.powmod(c2,s[2],n)

m = (m1*m2)%n
print(binascii.unhexlify(hex(m)[2:]))

easyrsa4

 低加密指数攻击,可以看看这篇http://t.csdn.cn/F6McG

import gmpy2
from Crypto.Util.number import *

e = 3
n = 18970053728616609366458286067731288749022264959158403758357985915393383117963693827568809925770679353765624810804904382278845526498981422346319417938434861558291366738542079165169736232558687821709937346503480756281489775859439254614472425017554051177725143068122185961552670646275229009531528678548251873421076691650827507829859299300272683223959267661288601619845954466365134077547699819734465321345758416957265682175864227273506250707311775797983409090702086309946790711995796789417222274776215167450093735639202974148778183667502150202265175471213833685988445568819612085268917780718945472573765365588163945754761
c = 150409620528139732054476072280993764527079006992643377862720337847060335153837950368208902491767027770946661

m = gmpy2.iroot(c,e)#x开n次根
if m[1]:
    m=m[0]
    print(long_to_bytes(m))#正整数转化为byte类型字符串

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值