RSA 2022/8/9

1.给了.key和.enc(公钥加签)

(1) 将连个文件解压到桌面后改为.txt格式

(2)SSL在线工具-公钥解析 (hiencode.com)对pub.key(pub.txt)中内容进行公钥解析,得到e和n

(3)再对n进行分解 factordb.com 得到p,q

(4)可用之前写过的脚本直接求得d

(5)rsa库(下载输入pip3 install rsa命令)调用PrivateKey,按照提示输入n,e,d,p,q

 (6)用二进制模式读文件后调用decrypt命令即可

import rsap= 285960468890451637935629440372639283459
q= 304008741604601924494328155975272418463
e=65537
d = 81176168860169991027846870170527607562179635470395365333547868786951080991441
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
key = rsa.PrivateKey(n, e, d, p, q)with open("C:\\Users\\淅汐兮\\Desktop\\flag.txt", "rb") as f:
# 如果输入的是路径,要用\\而不是\,python会将\识别为字符串的一部分f = f.read()
# read()一定要记得加()!!(惨痛经验)print(rsa.decrypt(f, key))

参考:(30条消息) BUUCTF RSA公钥加签_宁嘉的博客-CSDN博客 

2.rsa roll

题目描述很有趣(虽然并没有从中得到什么有用信息)

 再看看下一个文档(好的更懵了)

 (省略接下来一大长串数字)

后来去搜索了一下,发现{920139713,19}是公钥,下面的每一串数字分别是一段密文,只要解开明文再转换成字符即可

一开始一位每串数字结果一样(天真),于是只试着把c = 704796792代入,结果发现得到的字符刚好是“f”(令人喜悦的字母),然后就想到了把所有数字解开就好了

(1)分解n,照例用factordb.com即可(不过看其他大佬用循环也可以很快得到结果,参考一下)

# 分解模数n
def moder(n):base = 2while base < n:if n % base == 0:return base, n/basebase += 1

参考:(31条消息) 记一次30位密钥长度RSA加密破解过程_LandGrey的博客-CSDN博客

(2)求d(直接用gmpy2.invert(e, n)即可)

(3)把所有数字串放到一个列表,不过我懒得删掉空格,就把data文件改一下直接打开,然后挨个元素转换即可

'''rsa roll'''
from gmpy2 import invert
from Crypto.Util.number import *
n, e = 920139713,19
p = 18443
q = 49891
phin = (p - 1) * (q - 1)
d = invert(e, phin)with open("rsaRoll.txt","r") as f:f = f.read().split()
Ming = []
for c in f:m = pow(int(c), d, n)# print(m)Ming.append(long_to_bytes(m))
print(Ming)

这里有点问题是得到的flag不是连续的字符串,秉着懒得动脑找问题的原则,于是乎我选择了一个一个敲在一起(累死),看别人用的是chr()而不是long_to_bytes(),认识了一个新函数,不过chr应该是用于数字很小的情况转为ASCII,不知道其他情况可不可以用

3.Dangerous Rsa

#n:  0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793L
#e:  0x3
#c:0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365
so,how to get the message?

一开始看到是16进制想到要不要转换成十进制的,不过很遗憾没找到合适的工具

后来去搜了一下发现这道题根本不用管进制的问题,唯一的提示是e是一个很小的数,可以采用爆破

gmpy2中有一个函数iroot(x, y)用来求x开次方,得到的结果长这样

(mpz(2), False)
(mpz(3), True)

 其中如果可以顺利开方(我的意思是开方后得到一个整数)的话tuple[1] = True, 反之=False

可以通过这样一个条件来控制爆破结束(因为c = m ^e % n,所以m = (c + i * d) ^ 1/e,其中i是整数)

'''Dangerous RSA'''
from gmpy2 import *
from Crypto.Util.number import *
n = 0x52d483c27cd806550fbe0e37a61af2e7cf5e0efb723dfc81174c918a27627779b21fa3c851e9e94188eaee3d5cd6f752406a43fbecb53e80836ff1e185d3ccd7782ea846c2e91a7b0808986666e0bdadbfb7bdd65670a589a4d2478e9adcafe97c6ee23614bcb2ecc23580f4d2e3cc1ecfec25c50da4bc754dde6c8bfd8d1fc16956c74d8e9196046a01dc9f3024e11461c294f29d7421140732fedacac97b8fe50999117d27943c953f18c4ff4f8c258d839764078d4b6ef6e8591e0ff5563b31a39e6374d0d41c8c46921c25e5904a817ef8e39e5c9b71225a83269693e0b7e3218fc5e5a1e8412ba16e588b3d6ac536dce39fcdfce81eec79979ea6872793
e = 0x3
c = 0x10652cdfaa6b63f6d7bd1109da08181e500e5643f5b240a9024bfa84d5f2cac9310562978347bb232d63e7289283871efab83d84ff5a7b64a94a79d34cfbd4ef121723ba1f663e514f83f6f01492b4e13e1bb4296d96ea5a353d3bf2edd2f449c03c4a3e995237985a596908adc741f32365i = 0
while True:if gmpy2.iroot(c + i * n, 3)[1] == True:print(long_to_bytes(gmpy2.iroot(c + i * n, 3)[0]))i += 1


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部