RSA公钥文件(PEM)解析

公钥语法为: 

RSAPublicKey ::= SEQUENCE { 
modulus INTEGER, //RSA合数模n 
publicExponent INTEGER //RSA公开幂e 
}

说明:

1.此语法中的modulus和publicExponent,提取自对应私钥中的同名域值。

2.PKCS1和PKCS8的公钥文件是一样的,没有区别。


本文适用范围:已知公钥结构各域值,组装RSA公钥文件,即PEM文件。

PEM文件组成是TLV结构。

一、数据实例,各域值如下:

1.modulus: 
AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8 
AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B70142429 
93F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688 
ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0 
E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515 
FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E92 
69F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F11 
9C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7

2.publicExponent: 
00000003

二、组装PEM文件

1.按照以上数据域顺序依次组装成TLV。 
①modulus组装 
0282010100 
AB602562101207D05A6C413E24CE42699210388F5D31D28151E0FA9141D9C8F8 
AC716C0C4F449616AA2270F1007CF3BA46F05131E402266B2A628F4B70142429 
93F5BC06E3C0609F9E52BE8D5D0CFACF53C2EE98533A9818828EC5CB8120A688 
ADC603DBE65DF9059AD8039644897896943912D81C76856AB7E380C1530C6DE0 
E155D4C9FB943967C52EB147CDBF2464AC2B631055DBE3109491A067567AE515 
FD36428930FABCAC7C0FEB906C11815B6F00462E588DEB81C4364E2B62540E92 
69F49487CC4F8724DDC481C5134B86108C9FACD5D7187706ACA2D3425BFE4F11 
9C254273FA5C91EEA5EB06154936D27EE62266CDCAE9E34D20229360559325C7

说明: 
02 - tag 
82 - 81代表长度用1byte表示,82代表长度用2byte表示(此字节部分tag后不存在) 
0101 - length 2bytes表示  
00 - 在modulus数据前添加00,原因未知,请知情道友告知。

②publicExponent组装: 
020103

说明: 
02 - tag 
01 - length 
03 - 00000003 在公钥组装中,舍弃0x00;私钥组装中,保留0x00

2.输出PEM文件 
①公钥PEM文件头,嵌套多层TLV,本实例文件头为: 
30820120 300d06092a864886f70d0101010500 0382010d 0030820108

说明: 
30820120 
30 - tag 
82 - 代表length由2bytes表示 
0120 - length (2bytes)

30 0d 06092a864886f70d0101010500 
30 - tag 
0d - length 
06092a864886f70d0101010500 - value

03 82 010d 
03 - tag 
82 - 代表length由2bytes表示 
010d - value (2bytes),代表长度

00 3082 0108 
00 - 补0x00,原因未知,请知悉者不吝赐教 
30 - tag 
82 - 代表length由2bytes表示 
0108 - value(2bytes),代表长度。

②依次输出以上组装后的数据到PEM文件。

至此,PEM文件已生成。 
本文实例数据对应PEM文件,如图: 
RSA PubKey PEM

对此PEM文件进行Base64编码,即得到RSA公钥: 
—–BEGIN PUBLIC KEY—– 
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAq2AlYhASB9BabEE+JM5CaZIQOI9dMdKB 
UeD6kUHZyPiscWwMT0SWFqoicPEAfPO6RvBRMeQCJmsqYo9LcBQkKZP1vAbjwGCfnlK+jV0M+s9T 
wu6YUzqYGIKOxcuBIKaIrcYD2+Zd+QWa2AOWRIl4lpQ5EtgcdoVqt+OAwVMMbeDhVdTJ+5Q5Z8Uu 
sUfNvyRkrCtjEFXb4xCUkaBnVnrlFf02Qokw+rysfA/rkGwRgVtvAEYuWI3rgcQ2TitiVA6SafSU 
h8xPhyTdxIHFE0uGEIyfrNXXGHcGrKLTQlv+TxGcJUJz+lyR7qXrBhVJNtJ+5iJmzcrp400gIpNg 
VZMlxwIBAw== 
—–END PUBLIC KEY—–

转载自:http://blog.csdn.net/xuanshao_/article/details/51679824

### 回答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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值