(PKCS1) RSA 公私钥 pem 文件 提取 公私钥 e d 和 模数 n

 

请注明转载 https://blog.csdn.net/BlackNight168/article/details/82891487

参考链接:RSA公钥文件(PEM)解析
参考链接:OPENSSL中RSA私钥文件(PEM格式)解析【一】
参考:使用openssl命令剖析RSA私钥文件格式
RSA PKCS8 与 PKCS1 公私钥互转工具网站:http://www.ssleye.com/web/pkcs
RSA 私钥生成公钥网站:http://tool.chacuo.net/cryptgetpubkey

参考内容:

在PKCS#1 RSA算法标准中定义RSA私钥语法为:
 RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}

类型RSAPrivateKey 的各域具有以下意义:
• version 是版本号,为了与本文档的今后版本兼容。本篇文档的这个版本号应该是0,如果使用了多素数,则版本号应该是1。
Version ::= INTEGER { two-prime(0), multi(1) }
(CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
• modulus 是RSA合数模n。
• publicExponent 是RSA的公开幂e。
• privateExponent 是RSA的私有幂d。
• prime1 是n的素数因子p。
• prime2 i是n的素数因子q。
• exponent1 等于d mod (p − 1)。
• exponent2 等于d mod (q − 1)。
• coefficient 是CRT系数 q–1 mod p。
• otherPrimeInfos 按顺序包含了其它素数r3, …, ru的信息。如果version是0 ,它应该被忽略;而如果version是1,它应该至少包含OtherPrimeInfo的一个实例。
OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo
OtherPrimeInfo ::= SEQUENCE {
prime INTEGER, -- ri
exponent INTEGER, -- di
coefficient INTEGER -- ti
}

OtherPrimeInfo的各域具有以下意义:
• prime 是n的一个素数因子ri ,其中i ≥ 3。
• exponent 是di = d mod (ri − 1)。
• coefficient 是CRT系数 ti = (r1 · r2 · … · ri–1)–1 mod ri。

公钥语法为:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}

类型RSAPublicKey的域具有以下意义:
• modulus 是RSA的合数模n。
• publicExponent 是RSA公开幂e。
  • 私钥pem文件内容如下:(前 n-1 行64 个字符一行,最后一行不定)
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDnsN1F66mF6h6y/XpyN+ZU/w5AyeWBjZNIqi33/ATn4qQpw+kD
HrKyF7sQ/RNw6tibM90iM6VOA14305umPbPROJJs3JoB6Lao74SUm58aO9T+Ct7r
O52E+3r5jyDQicdRl6lIhLigNADXPD/KoNwfrRrCyw4wTHMZhSHc8eUHeQIDAQAB
AoGABVTIgqddiztL4Yp7ms02e5Yy2cLLiSOc0/s2e5JM+pj4dg2P+wZlzjtFjqqE
HAELYubam8LcduMU8+vmlPiufoK9fo47fLsX1PFCY9TDKL1dFlZgBAmJU7hR27h/
gCo4r3PMub/snq7n+skrbarZbX1J6Q1o5UYKFIrrIjNObEECQQD0DIzIdMObPUUu
W+JXg10kz/ayYn3irxZmp5ngc+b9WZfSOPehZBsLWsIb1eC7y9DZMhZfBQ/sPaO8
0tvqJMUFAkEA8wlj3B3zK20pK+Hj+vFiAlaQmqILTSfv/9jMm8tbVfXt+bHrmZdN
jruGVQDb7V2pW9HeG5PgDB3vKXeOiVfC5QJAYikKFzaf1rj2ModSqtBzjnL3Txi+
eYbjA7c19UmpBw4aOrwfHhMdrZt7p6aHFgIMps+2n9Fxbhv8194YBj1z4QJAPONW
XFg4iuGvVeoi9sSwvEs5sTP1xt/BlgSXxlRdTpztgQgdMX6hlKfQkM1FTCOSAYoD
rj8O+5ooR+hHEoulLQJBAOtaMvMWIOG7mARngpwqfJ07L41/T0ITHteiiYJfCurz
kLVCx1XA3MlN+u5gn7osUHMbah0Ze3uakSZ6za3mL5Y=
-----END RSA PRIVATE KEY-----
  • 首先将:private key 中间的 base64 字符串 base64 解码成 字节流,然后将字节流 转换成 16 进制字符串
private="MIICXAIBAAKBgQDnsN1F66mF6h6y/XpyN+ZU/w5AyeWBjZNIqi33/ATn4qQpw+kD"\
"HrKyF7sQ/RNw6tibM90iM6VOA14305umPbPROJJs3JoB6Lao74SUm58aO9T+Ct7r"\
"O52E+3r5jyDQicdRl6lIhLigNADXPD/KoNwfrRrCyw4wTHMZhSHc8eUHeQIDAQAB"\
"AoGABVTIgqddiztL4Yp7ms02e5Yy2cLLiSOc0/s2e5JM+pj4dg2P+wZlzjtFjqqE"\
"HAELYubam8LcduMU8+vmlPiufoK9fo47fLsX1PFCY9TDKL1dFlZgBAmJU7hR27h/"\
"gCo4r3PMub/snq7n+skrbarZbX1J6Q1o5UYKFIrrIjNObEECQQD0DIzIdMObPUUu"\
"W+JXg10kz/ayYn3irxZmp5ngc+b9WZfSOPehZBsLWsIb1eC7y9DZMhZfBQ/sPaO8"\
"0tvqJMUFAkEA8wlj3B3zK20pK+Hj+vFiAlaQmqILTSfv/9jMm8tbVfXt+bHrmZdN"\
"jruGVQDb7V2pW9HeG5PgDB3vKXeOiVfC5QJAYikKFzaf1rj2ModSqtBzjnL3Txi+"\
"eYbjA7c19UmpBw4aOrwfHhMdrZt7p6aHFgIMps+2n9Fxbhv8194YBj1z4QJAPONW"\
"XFg4iuGvVeoi9sSwvEs5sTP1xt/BlgSXxlRdTpztgQgdMX6hlKfQkM1FTCOSAYoD"\
"rj8O+5ooR+hHEoulLQJBAOtaMvMWIOG7mARngpwqfJ07L41/T0ITHteiiYJfCurz"\
"kLVCx1XA3MlN+u5gn7osUHMbah0Ze3uakSZ6za3mL5Y="
private16=ba.b2a_hex(base64.b64decode(private))
private16=str(private16,"utf-8")
print(private16)

16 进制结果如下:

3082025c02010002818100e7b0dd45eba985ea1eb2fd7a7237e654ff0e40c9e5818d9348aa2df7fc04e7e2a429c3e9031eb2b217bb10fd1370ead89b33dd2233a54e035e37d39ba63db3d138926cdc9a01e8b6a8ef84949b9f1a3bd4fe0adeeb3b9d84fb7af98f20d089c75197a94884b8a03400d73c3fcaa0dc1fad1ac2cb0e304c73198521dcf1e5077902030100010281800554c882a75d8b3b4be18a7b9acd367b9632d9c2cb89239cd3fb367b924cfa98f8760d8ffb0665ce3b458eaa841c010b62e6da9bc2dc76e314f3ebe694f8ae7e82bd7e8e3b7cbb17d4f14263d4c328bd5d16566004098953b851dbb87f802a38af73ccb9bfec9eaee7fac92b6daad96d7d49e90d68e5460a148aeb22334e6c41024100f40c8cc874c39b3d452e5be257835d24cff6b2627de2af1666a799e073e6fd5997d238f7a1641b0b5ac21bd5e0bbcbd0d932165f050fec3da3bcd2dbea24c505024100f30963dc1df32b6d292be1e3faf1620256909aa20b4d27efffd8cc9bcb5b55f5edf9b1eb99974d8ebb865500dbed5da95bd1de1b93e00c1def29778e8957c2e5024062290a17369fd6b8f6328752aad0738e72f74f18be7986e303b735f549a9070e1a3abc1f1e131dad9b7ba7a68716020ca6cfb69fd1716e1bfcd7de18063d73e102403ce3565c58388ae1af55ea22f6c4b0bc4b39b133f5c6dfc1960497c6545d4e9ced81081d317ea194a7d090cd454c2392018a03ae3f0efb9a2847e847128ba52d024100eb5a32f31620e1bb980467829c2a7c9d3b2f8d7f4f42131ed7a289825f0aeaf390b542c755c0dcc94dfaee609fba2c50731b6a1d197b7b9a91267acdade62f96

  • 进行分解

3082025c # 标签头,类型为SEQUENCE (sequence 序列),此标签头共 4 字节。注(不确定):3082 应该指 私钥
#以下共 604 字节 (0x025c)
020100 # 整型 长度 为 0 (0x00),内容:version
028181 # 整型 长度 为 129 字节 (0x81),内容:模数 n (modulus)
00e7b0dd45eba985ea1eb2fd7a7237e654ff0e40c9e5818d9348aa2df7fc04e7e2a429c3e9031eb2b217bb10fd1370ead89b33dd2233a54e035e37d39ba63db3d138926cdc9a01e8b6a8ef84949b9f1a3bd4fe0adeeb3b9d84fb7af98f20d089c75197a94884b8a03400d73c3fcaa0dc1fad1ac2cb0e304c73198521dcf1e50779
0203 # 整型 长度 为 3 字节(0x03),内容:e (公钥指数)
010001
028180 # 整型 长度 为 128 字节(0x80),内容:d (私钥指数)
0554c882a75d8b3b4be18a7b9acd367b9632d9c2cb89239cd3fb367b924cfa98f8760d8ffb0665ce3b458eaa841c010b62e6da9bc2dc76e314f3ebe694f8ae7e82bd7e8e3b7cbb17d4f14263d4c328bd5d16566004098953b851dbb87f802a38af73ccb9bfec9eaee7fac92b6daad96d7d49e90d68e5460a148aeb22334e6c41
0241 # 整型 长度 为 65 字节(0x41),内容:p (素数)
00f40c8cc874c39b3d452e5be257835d24cff6b2627de2af1666a799e073e6fd5997d238f7a1641b0b5ac21bd5e0bbcbd0d932165f050fec3da3bcd2dbea24c505
0241 # 整型 长度 为 65 字节(0x41),内容:q (素数)
00f30963dc1df32b6d292be1e3faf1620256909aa20b4d27efffd8cc9bcb5b55f5edf9b1eb99974d8ebb865500dbed5da95bd1de1b93e00c1def29778e8957c2e5
0240 # 整型 长度 为 64 字节(0x40),内容:d mod(p-1)
62290a17369fd6b8f6328752aad0738e72f74f18be7986e303b735f549a9070e1a3abc1f1e131dad9b7ba7a68716020ca6cfb69fd1716e1bfcd7de18063d73e1
0240 # 整型 长度 为 64 字节(0x40),内容:d mod(q-1)
3ce3565c58388ae1af55ea22f6c4b0bc4b39b133f5c6dfc1960497c6545d4e9ced81081d317ea194a7d090cd454c2392018a03ae3f0efb9a2847e847128ba52d
0241 # 整型 长度 为 65 字节(0x41),内容:(1/q)mod p <即 (q**-1)mod p>
00eb5a32f31620e1bb980467829c2a7c9d3b2f8d7f4f42131ed7a289825f0aeaf390b542c755c0dcc94dfaee609fba2c50731b6a1d197b7b9a91267acdade62f96

其对应公钥 pem 文件内容为:(前 n-1 行64 个字符一行,最后一行不定)

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOew3UXrqYXqHrL9enI35lT/DkDJ5YGNk0iqLff8BOfipCnD6QMesrIX
uxD9E3Dq2Jsz3SIzpU4DXjfTm6Y9s9E4kmzcmgHotqjvhJSbnxo71P4K3us7nYT7
evmPINCJx1GXqUiEuKA0ANc8P8qg3B+tGsLLDjBMcxmFIdzx5Qd5AgMBAAE=
-----END RSA PUBLIC KEY-----
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Python RSA 加密和解密文件的基本流程如下: 1. 使用 RSA 库生成公钥私钥。 2. 使用公钥文件进行加密。 3. 使用私钥对加密后的文件进行解密。 示例代码: ``` from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成公钥私钥 key = RSA.generate(2048) private_key = key.export_key() public_key = key.publickey().export_key() # 使用公钥加密文件 with open("original_file.txt", "rb") as f: original_data = f.read() cipher = PKCS1_OAEP.new(RSA.import_key(public_key)) encrypted_data = cipher.encrypt(original_data) with open("encrypted_file.bin", "wb") as f: f.write(encrypted_data) # 使用私钥解密文件 with open("encrypted_file.bin", "rb") as f: encrypted_data = f.read() cipher = PKCS1_OAEP.new(RSA.import_key(private_key)) decrypted_data = cipher.decrypt(encrypted_data) with open("decrypted_file.txt", "wb") as f: f.write(decrypted_data) ``` 请注意,上面的代码仅用于示例目的,实际应用中需要注意密钥的安全存储。 ### 回答2: RSA加密算法是一种非对称加密算法,它使用一对相互关联的公钥私钥进行加解密。公钥用于加密数据,而私钥用于解密数据。 在使用Python进行RSA加解密文件时,我们首先需要生成一对私钥。可以使用`rsa`库中的`newkeys()`函数来生成密钥对。例如,以下代码将生成一对2048位的私钥: ``` from rsa import newkeys # 生成一对私钥 (pub_key, priv_key) = newkeys(2048) ``` 接下来,我们可以使用私钥进行文件的加解密操作。以下是一个使用RSA加解密文件的示例代码: ``` from rsa import encrypt, decrypt # 加密文件 def encrypt_file(file_path, output_path, pub_key): with open(file_path, 'rb') as file: data = file.read() enc_data = encrypt(data, pub_key) with open(output_path, 'wb') as output_file: output_file.write(enc_data) # 解密文件 def decrypt_file(file_path, output_path, priv_key): with open(file_path, 'rb') as file: enc_data = file.read() dec_data = decrypt(enc_data, priv_key) with open(output_path, 'wb') as output_file: output_file.write(dec_data) ``` 在使用以上代码时,需要指定待加密的文件路径、加密后的文件输出路径以及私钥。可以通过`pub_key.save_pkcs1()`和`priv_key.save_pkcs1()`方法将密钥保存到文件以便后续使用。 需要注意的是,RSA加密算法会对数据进行分块加解密,因此对于较大的文件,可能需要分块加密再拼接。另外,RSA加密算法的运算耗时较长,因此在实际使用中可能需要将其用在对安全性要求较高的场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值