2020-10-30

逆向练习#10

Buuctf-rsa

前言:rsa加密确实是很有名。但这应该是密码学范畴吧?

公钥n = p * q,其中p和q是两个大素数

e是随机选择的数,作为公钥

d是跟e有关的一个数,满足条件式:ed=1(mod phi(n))

phi(n)是欧拉函数,phi(n)=(p-1)(q-1)

加密过程:设明文为m,密文为c

c = m^e(mod n)

解密过程:

m=c^d (mod n)

RSA密钥体制中,n和e作为公钥,是都可以得到的值;d作为私钥,是私人拥有的

要破解RSA,最常用的方法是大素数分解,即:找到p和q,使得n=p*q成立

1.

下载来文件有两个,flag.enc和pub.key。

用UE打开pub.key后,会转换里面的十六进制,得

1
2
3
4
-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+
/AvKr1rzQczdAgMBAAE=
-----END PUBLIC KEY-----

2.

然后将公钥进行分析,提取n,e

key长度: 256
模数: C0332C5C64AE47182F6C1C876D42336910545A58F7EEFEFC0BCAAF5AF341CCDD
指数: 65537 (0x10001)

借助了在线解密工具

即e=65537

n=86934482296048119190666062003494800588905656017203025617216654058378322103517(十进制)

3.

再通过n解析p,q

这里也是借助在线工具 地址

得出

p = 285960468890451637935629440372639283459

q = 304008741604601924494328155975272418463

4.

再用脚本解密flag.enc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import gmpy2
import rsa

e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

phin = (q-1)*(p-1)
d = gmpy2.invert(e, phin)

key = rsa.PrivateKey(n, e, int(d), p, q)

with open("flag.enc", "rb+") as f: #你对应的文件位置
f = f.read()
print(rsa.decrypt(f, key))

5.

得到flag:flag{decrypt_256} 搞定!

不过这道题,只能算是拓展阅历吧。