RSA密码的原理及做题总结


RSA算法:是应用最广泛的公钥密码算法

RSA算法步骤

1.随计选择两个不相等的质数p,q
2.计算它们的乘积N=p*q
3.计算欧拉函数φ(N)=(p-1)(q-1),N的二进制长度作为密钥的长度,
4.随机选择一个加密密钥e,这里1<e<φ(N), gcd(e,φ(N))=1,即e与φ(N)互质。
5.根据以下公式求解得到解密密钥d
ed=1 mod φ(N),0≤d≤N
6.发布加密密钥:(e,N)
7.保密解密密钥:(d,N)

在这里插入图片描述

这里的n就是N!!!!

在这里插入图片描述
这张图是我偷别人的哈哈哈哈哈!!!!!!!!
我们来简单计算一下吧:
已知p=3,q=11。
计算N:

N=P*Q=33

欧拉函数:

φ(N)=(p-1)*(q-1)=20

计算公钥e:

1<e<φ(N),即1<e<20,那么我们取最小值e=3,(e要与φ(N)互质)

计算私钥d:

e*d%φ(N)=1
3*d%φ(N)=1
那么d= 7

公钥加密
我们来加密M=2
C=M^e mod N

M=2
e=3
N=33
C=2^3 %33=8

经过RSA加密后M就变成了8.
私钥解密
M=C^d mod N

C=8
D=7
N=33
M=8^7 %33=2

我们学习RSA不可能去手算,因此我们需要自己编写脚本!

安装python的gmpy2第三方库

我是在windows下安装的,比较简单方便,当然要先安装python,以及环境配置。
python直接去官网安装就可以了,然后我们选择适合自己python版本的gmpy去安装,这个网站就很棒!!!
我们把安装好的wheel放在python文件夹下的scripts里边,打开命令函,win+r,输入cmd,cd到这个文件夹下,输入pip install gmpy************在这里插入图片描述
稍等一会就安装好了;检查一下是否安装成功:pip list

在这里插入图片描述
这样就可以了!!!

下面让我们来练练手吧!

【BUUCTF-Crypto】RSA

在这里插入图片描述

在这里插入图片描述

由题意可知:p,q,e,求d
直接上脚本:

import gmpy2
p = 473398607161
q = 4511491
e = 17
d = gmpy2.invert(e,(p-1)*(q-1))
print (d)

flag{125631357777427553}

【BUUCTF-Crypto】rsarsa

在这里插入图片描述
已知p,q,e,c,求m即可,根据公式m=pow(c,d,n);
直接上脚本:

import gmpy2
def Decrypt(c,e,p,q):
	L=(p-1)*(q-1)
	d=gmpy2.invert(e,L)
	n=p*q
	m=gmpy2.powmod(c,d,n)
	flag=str(m)
	print("flag{"+flag+"}")
if __name__ == '__main__':
	p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
	q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
	e =  65537
	c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
	Decrypt(c,e,p,q)

if name == ‘main’:一个python文件通常有两种使用方法,第一是作为脚本直接执行,第二是 import 到其他的 python 脚本中被调用(模块重用)执行。因此 if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的。
pow(x,y,z) 这个是表示x 的y 次幂后除以z的余数即:

pow(x,y,z)=x^y%z

【BUUCTF-Crypto】RSA1

在这里插入图片描述

dp=d%(p-1)
dq=d%(q-1)
import gmpy2
import libnum
def decrypt(dp,dq,p,q,c):
    InvQ = gmpy2.invert(q, p)
    mp = pow(c, dp, p)
    mq = pow(c, dq, q)
    m = (((mp-mq)*InvQ) % p)*q+mq
    print (libnum.n2s(m))

p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229 
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469 
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929 
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041 
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
decrypt(dp,dq,p,q,c)

这里提醒一下,我们还需要安装libnum这个库。
跑一下脚本:noxCTF{W31c0m3_70_Ch1n470wn},这便是flag!

【BUUCTF-Crypto】RSA2

在这里插入图片描述

import gmpy2 as gp

e = 65537
n = gp.mpz(248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113)
dp = gp.mpz(905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657)

c = gp.mpz(140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751)

for x in range(1, e):
    if(e*dp%x==1):
        p=(e*dp-1)//x+1
        if(n%p!=0):
            continue
        q=n//p
        phin=(p-1)*(q-1)
        d=gp.invert(e, phin)
        m=gp.powmod(c, d, n)
        if(len(hex(m)[2:])%2==1):
            continue
        print('--------------')
        print(m)
        print(hex(m)[2:])
        print(bytes.fromhex(hex(m)[2:]))

我是脚本收集者!flag{wow_leaking_dp_breaks_rsa?_98924743502}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值