buuctf:rsa

题目:含有flag.encpub.key两个文件

解题:用openssl 读取pub.key里的公钥

openssl rsa -pubin -inform PEM -text < '/root/桌面/pub.key'

 

 获得m=c0:33:2c:5c:64:ae:47:18:2f:6c:1c:87:6d:42:33:69:10:54:5a:58:f7:ee:fe:fc:0b:ca:af:5a:f3:41:cc:dd

转换为十进制:

a = 'c0:33:2c:5c:64:ae:47:18:2f:6c:1c:87:6d:42:33:69:10:54:5a:58:f7:ee:fe:fc:0b:ca:af:5a:f3:41:cc:dd'
b = a.replace(':','')
b
'c0332c5c64ae47182f6c1c876d42336910545a58f7eefefc0bcaaf5af341ccdd'
c = int(b,16)
c
86934482296048119190666062003494800588905656017203025617216654058378322103517

factordb分解n,获得pq

factordb 86934482296048119190666062003494800588905656017203025617216654058378322103517

安装factordb

pip install factordb-pycli

读取flag.enc文件的内容,转换为十六进制,后转为十进制;

import binascii
with open('/root/桌面/flag.enc','rb+') as f:
    f = f.read()
    a = binascii.hexlify(f)
    b = int(a,16)
    print(b)

再用脚本解密,但之前由于文字转换出现问题,以为自己数据出现问题,搜索相关WP,发现运用RSA库进行解密(不需要将c转换为数)

import rsa
import gmpy2
c = 1854183526100811878807183372982532818560316522978821358738967769534081571682
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
fn = (p-1)*(q-1)

d = int(gmpy2.invert(e,fn))
key = rsa.PrivateKey(n,e,d,q,p)
with open(r'c:\111\flag.enc','rb') as f:    #文件路径
    f = f.read()
    print(rsa.decrypt(f,key))
————————————————
版权声明:本文为优快云博主「gal2xy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_52193383/article/details/119428246

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

#pkcs标准中,pkcs#1规定,私钥包含(n,e,d,p,q),相当于pow()

print(rsa.decrypt(f,key))

# f:公钥加密结果  key:私钥,相当于libnum.n2s(m)

之后通过其他方法,添加一行

decoded_message = libnum.n2s(m).decode('utf-8', 'replace')

#将解密后的整数 m 转换为字符串,并通过 'replace' 参数指定在遇到无法解码的字节时使用问号替代。

最终代码:

import libnum

p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
e = 65537
n = 86934482296048119190666062003494800588905656017203025617216654058378322103517
phi = (p-1)*(q-1)
d = libnum.invmod(e, phi)
c = 29666689760194689065394649908301285751747553295673979512822807815563732622178
m = pow(c, d, n)

decoded_message = libnum.n2s(m).decode('utf-8', 'replace')
print(decoded_message)

flag{decrypt_256}

### BUUCTF RSA 挑战解题思路 #### 计算模反元素 d 的方法 对于给定的 p 和 q 值,在RSA算法中,首先需要计算 n=p*q 并进一步求得 φ(n)=(p−1)(q−1)[^2]。之后利用 e 和 φ(n),通过扩展欧几里得算法找到满足 de≡1(mod φ(n))条件下的私钥 d。 #### 使用 Python 实现具体操作 下面展示一段Python代码用于完成上述提到的任务: ```python from sympy import mod_inverse def compute_d(p, q, e): phi_n = (p - 1) * (q - 1) d = mod_inverse(e, phi_n) return d p = 473398607161 q = 4511491 e = 17 d = compute_d(p, q, e) print(f'flag{{ {hex(d)} }}') ``` 这段程序定义了一个函数`compute_d()`来接收三个参数并返回对应的私钥 d 。最后打印出格式化的标志字符串。 #### 处理加密消息 c 来获取原始信息 m 当拥有完整的公钥组件(即 N 和 e)以及相应的私钥 d 后,则可以采用如下方式对已知密文 c 进行解码从而获得原文本 m :m=c^d % n ```python def decrypt_rsa(ciphertext, private_key, modulus): plaintext = pow(int(ciphertext), int(private_key), int(modulus)) return long_to_bytes(plaintext).decode() # 示例调用此功能解析密文 ciphertext_example = "..." # 密文应由题目提供 private_key_example = hex(d)[2:] # 私钥来自于之前的结果 modulus_example = str(p*q) # 公共模块N等于pq乘积 decrypted_message = decrypt_rsa(ciphertext_example,private_key_example,modulus_example) print(decrypted_message) ``` 以上脚本展示了如何运用私钥 d 对特定形式的密文 ciphertext 执行解密动作,并尝试将其转换回可读字符序列[^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值