RSA公钥提取

这篇博客介绍了如何使用Python处理公钥加密的文件。首先,从pub.key中提取公钥的e和n,然后利用在线工具分解n得到p和q。接着,读取加密文件flag.enc,将其字节流转换为数字,通过计算私钥d来解密。最后,使用int.from_bytes()将解密后的数字转换回原始字节并输出解密的flag。
摘要由CSDN通过智能技术生成

特征

此类题目一般会给pub.key和flag.enc。pub.key是公钥文件,可以用txt打开;flag.enc是加密后的二进制文件,用txt打开会是乱码。

公钥一般长这样:

-----BEGIN PUBLIC KEY-----
MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAMAzLFxkrkcYL2wch21CM2kQVFpY9+7+
/AvKr1rzQczdAgMBAAE=
-----END PUBLIC KEY-----

可以用在线网站去解析获得e和n:SSL在线工具-公钥解析 (hiencode.com)

当然也可以用python来解

获得n之后可以尝试利用工具分解n,分解n的在线网站:factordb.com

字节流转换为数字

int.from_bytes()函数

由于二进制文件读取之后是字节流,所以需要将其转换成十进制的数字,才能进行运算,这里就需要用到一个int.from_bytes()函数

函数格式: int.from_bytes(bytes, byteorder, *, signed=False)

简单demo:

s1 = b'\xf1\xff'
print(int.from_bytes(s1, byteorder='big', signed=False))
print(int.from_bytes(s1, byteorder='little', signed=True))

输出:

61951
-15

参数解释:

  1. bytes是要转换的十六进制
  2. byteorder:选’big’或’little’,以上例为例,其中big代表正常顺序,即f1ff;little反之,代表反序fff1
  3. signed:选True、False表示是否要区分二进制的正负数含义。即是否要对原二进制数进行原码反码 补码操作

hex()和fromhex()函数

另外,还有一种方法可以将字节对象进行转换:

bytes对象的hex函数,用来将bytes对象的值转换成hexstr;而fromhex函数,用来将hexstr导入bytes对象,相当于用hexstr来创建bytes对象。bytes对象的这两个函数,有的时候非常好用!

>>> bytes([0,1,2,3,4,5]).hex()
'000102030405'
>>> bytes.fromhex('000102030405')
b'\x00\x01\x02\x03\x04\x05'
>>> b'abcde'.hex()
'6162636465'
>>> a = bytes.fromhex('6162636465')
>>> a
b'abcde'

通过hex将字节流转换为16进制字符串之后,就可以利用int函数将其转换为10进制数字:

class int(x, base=10)

参数:

(1)x – 字符串或数字

(2)base – 进制数,默认十进制

脚本

from gmpy2 import *
from Crypto.Util.number import *
from Crypto.PublicKey import RSA


# 公钥提取
with open("pub.key","r",encoding="utf-8") as file:
    text=file.read()
key=RSA.import_key(text)
e=key.e
n=key.n
print(e)
print(n)

#然后利用yafu分解n得到p和q或者在线网站也能分解
p=285960468890451637935629440372639283459
q=304008741604601924494328155975272418463

with open("flag.enc","rb") as file:
    c=file.read()

d=invert(e,(p-1)*(q-1))
flag=pow(int.from_bytes(c,byteorder="big"),d,n)
print(long_to_bytes(flag))

### 回答1: 生成 RSA 公钥可以使用 Python 的 `cryptography` 库,代码示例如下: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import serialization, hashes # 生成 RSA 密钥对 private_key = rsa.generate_private_key( public_exponent=65537, key_size=2048 ) public_key = private_key.public_key() # 将公钥序列化为 PEM 格式 pem_public_key = public_key.public_bytes( encoding=serialization.Encoding.PEM, format=serialization.PublicFormat.SubjectPublicKeyInfo ) print(pem_public_key.decode()) ``` 运行以上代码,可以得到生成的 RSA 公钥的 PEM 格式字符串。 ### 回答2: Python的`rsa`模块是一个用于生成、加密、解密和签名RSA密钥对的库。在使用RSA算法时,公钥用于加密数据或验证签名,私钥用于解密数据或生成签名。 在`rsa`模块中,可以通过`rsa.key.PublicKey`类来表示公钥。要生成RSA公钥,首先需要生成一个RSA密钥对,然后从密钥对中提取公钥。 下面是一个示例代码,演示了如何生成RSA公钥: ```python from rsa.key import newkeys # 生成RSA密钥对,长度为2048位 public_key, private_key = newkeys(2048) # 获取公钥 public_key_pem = public_key.save_pkcs1() # 将公钥保存到文件或传输给其他应用程序 with open('public_key.pem', 'wb') as f: f.write(public_key_pem) ``` 在上述代码中,首先通过`newkeys()`函数生成了一个长度为2048位的RSA密钥对,然后使用`save_pkcs1()`方法从公钥对象中提取公钥部分。最后将公钥保存到文件中。 需要注意的是,RSA公钥是非对称加密算法中的一种,因此只能用于加密数据或验证签名,不能用于解密数据或生成签名。如果需要使用RSA进行解密或签名操作,需要使用RSA私钥。 总之,Python的`rsa`模块可以用来生成和处理RSA公钥。以上示例代码演示了如何生成RSA公钥,并将其保存到文件中,以便在需要时进行使用。 ### 回答3: RSA是一种非对称加密算法,公钥用于加密数据,私钥用于解密数据。对于Python来说,使用RSA加密算法也非常简单。 首先,我们需要生成RSA密钥对,其中包括公钥和私钥。在Python中,可以使用`rsa`库来生成密钥对。通过以下代码,可以生成一个RSA密钥对,并将公钥和私钥分别保存为`public.pem`和`private.pem`文件。 ```python import rsa # 生成RSA密钥对 (pubkey, privkey) = rsa.newkeys(1024) # 将公钥保存为public.pem文件 with open('public.pem', 'w+') as f: f.write(pubkey.save_pkcs1().decode()) # 将私钥保存为private.pem文件 with open('private.pem', 'w+') as f: f.write(privkey.save_pkcs1().decode()) ``` 生成公钥的代码`pubkey.save_pkcs1().decode()`将公钥保存为PKCS#1格式,通过`decode()`方法将其转化为字符串形式。 生成密钥对后,我们可以使用公钥进行数据加密。在Python中,可以使用`rsa`库的`encrypt`函数来对数据进行加密。假设要加密的数据是明文字符串`message`: ```python import rsa # 加载公钥 with open('public.pem', 'r') as f: pubkey = rsa.PublicKey.load_pkcs1(f.read().encode()) # 加密数据 message = 'Hello, RSA!' enc_data = rsa.encrypt(message.encode(), pubkey) ``` 在这个例子中,我们首先从文件中加载公钥,并利用`rsa.encrypt`函数对明文数据进行加密。加密后的数据`enc_data`将是一个字节串。 以上就是使用Python实现RSA公钥加密的简要介绍。需要注意的是,RSA算法和密钥管理涉及到加解密的安全性,因此在实际应用中,还需要考虑一些具体的安全性问题,并使用适当的措施来保护密钥和加密数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h0l10w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值