【攻防世界】Crypto系列之Normal_RSA

【攻防世界】Crypto系列之Normal_RSA

这道题存在两个文件flag.enc和pubkey.pem,从文件名不难看出flag.enc是对flag文件进行了加密,而pubkey.pem就是RSA算法中的公钥,两个文件如下

这里又要使用RSA算法,解题思路:

  • 解析pubkey.pem文件,得到大整数n和公钥e
  • 对大整数n进行因数分解,得到p和q
  • 由q和p计算出欧拉函数oula(n)=(p-1)(q-1)
  • 由oula(n),e计算出私钥d
  • 讲私钥d保存为pem格式

解密公钥文件

第一种方法是使用openssl对公钥文件进行解密

1
openssl rsa -pubin -text -modulus -in pubkey.pem

得到

1
2
3
e=65537
n=C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD(十六进制)
n=87924348264132406875276140514499937145050893665602592992418171647042491658461

第二种方法使用Crypto.PublicKey库解析公钥及生成私钥

1
2
3
4
5
6
with open("pubkey.pem","r") as f:
key = f.read()
pubkey = RSA.import_key(key)

print('n:',pubkey.n)
print('e:',pubkey.e)

因式分解

使用工具对大整数进行因式分解

1
2
q= 275127860351348928173285174381581152299
p= 319576316814478949870590164193048041239

计算欧拉函数

1
2
3
4
5
6
7
8
q= 275127860351348928173285174381581152299
p= 319576316814478949870590164193048041239

oula = (q-1)*(p-1)
print(oula)

d = inverse(pubkey.e,oula)
print(d)

得到d私钥为

1
10866948760844599168252082612378495977388271279679231539839049698621994994673

输出私钥

1
2
3
4
5
6
prikey = RSA.construct((pubkey.n,pubkey.e,d),False)

with open('prikey.pem','wb') as f:
key = prikey.export_key()
print(key)
f.write(key)

输出文件

1
2
3
4
5
6
-----BEGIN RSA PRIVATE KEY-----
MIGqAgEAAiEAwmNq5cPY5D/7l6sJAo8arGwL9s09cOvKKBv/6X++MN0CAwEAAQIg
GAZ5m9RM5kkSK3i0MGDHhvi3f7FZPghC2gY7oNhyi/ECEQDO+7LPfhipjr7cNuPn
w7ArAhEA8Gwo6RyJIrnCNuI1YMCXFwIRAJulRkclqWIHx5pNZIAp9VUCEGjeJLIZ
ek+lSut5m+LJ3p0CEDRBEd7C622/wt1+58xOIfE=
-----END RSA PRIVATE KEY-----

解密文件

1
openssl pkeyutl -decrypt -in flag.enc -inkey prikey.pem

得到flag

1
PCTF{256b_i5_m3dium}

完整代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from Crypto.PublicKey import RSA
from Crypto.Util.number import long_to_bytes,inverse

with open("pubkey.pem","r") as f:
key = f.read()
pubkey = RSA.import_key(key)

print('n:',pubkey.n)
print('e:',pubkey.e)

q= 275127860351348928173285174381581152299
p= 319576316814478949870590164193048041239

oula = (q-1)*(p-1)
print(oula)

d = inverse(pubkey.e,oula)
print(d)

prikey = RSA.construct((pubkey.n,pubkey.e,d),False)

with open('prikey.pem','wb') as f:
key = prikey.export_key()
print(key)
f.write(key)
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信