文章目录
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}