目录
openssl 解密RSA一般步骤
步骤:
①使用 openssl 解密.pem 中参数 --> ②参数十六进制转换为十进制 --> ③ 利用 factor 对大整数进行分解,得到 p 和 q --> ④用 rsatool 生成私钥文件: private.pem --> ⑤用 private.pem 解密 flag.enc
①使用 openssl 解密.pem 中参数。
Openssl 是 linux 自带的一个加密库,可以直接使用。
openssl rsa -pubin -text -modulus -in warmup -in ./Normal_RSA/pubkey.pem
②参数十六进制转换为十进制 Python 支持直接将 16 进制转换为 10 进制 Linux 下进入 python 命令行 0x C2636AE5C3D8E43FFB97AB09028F1AAC6C0BF6CD3D70EBCA281BFFE97FBE30DD
也可使用python solve.py -g --dumpkey --key ../exercise/rsa-2/public.pem
,得到的n直接是十进制的,可以省略步骤1和2
③利用 factor 对大整数进行分解,得到 p 和 q :
p= 275127860351348928173285174381581152299
q= 319576316814478949870590164193048041239
④用 rsatool 生成私钥文件: private.pem
python rsatool.py -o private.pem -e 65537 -p 275127860351348928173285174381581152299 -q 319576316814478949870590164193048041239
⑤用 private.pem 解密 flag.enc :
openssl rsautl -decrypt -in ./Normal_RSA/flag.enc -inkey ./private_1.pem
成功获取flag,这种方法比较啰嗦,作为用来弥补solve.py无法获取完整flag的情况,接下来总结常用的各种密码学解密方法:
1.凯撒密码(Caesar)
#!/usr/bin/python
# -*- coding=utf -*-
def caesar(cipher):
for j in range(26):
str_list = list(cipher)
i = 0
while i < len(cipher):
if not str_list[i].isalpha():
str_list[i] = str_list[i]
else:
a = "A" if str_list[i].isupper() else "a"
str_list[i] = chr((ord(str_list[i]) - ord(a) + j) % 26 + ord(a))
i = i + 1
print(''.join(str_list))
if __name__ == '__main__':
cipher = "oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}"
caesar(cipher)
2.摩斯密码在线解密
http://www.bejson.com/enc/morse/
# !/usr/bin/python
# -*- coding=utf -*-
table = {
'a': ".-", 'b': "-...", 'c': "-.-.", 'd': "-..", 'e'