RSA私钥文件(PEM)解析

本文详细介绍了RSA私钥文件(PEM格式)的解析和组装过程,包括了PEM文件的TLV结构、数据域的组成及其意义,并提供了具体的实例数据和组装步骤。通过理解这些内容,可以更好地理解和操作RSA密钥对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接:OPENSSL中RSA私钥文件(PEM格式)解析

在PKCS#1 RSA算法标准中定义RSA私钥语法

RSAPrivateKey ::= SEQUENCE {
version Version, //版本
modulus INTEGER, // RSA合数模 n
publicExponent INTEGER, //RSA公开幂 e
privateExponent INTEGER, //RSA私有幂 d
prime1 INTEGER, //n的素数因子p
prime2 INTEGER, //n的素数因子q
exponent1 INTEGER, //值 d mod (p-1)
exponent2 INTEGER, //值 d mod (q-1)
coefficient INTEGER, //CRT系数 (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}

otherPrimeInfos 按顺序包含了其它素数r3, …, ru的信息。如果version是0 ,它应该被忽略;而如果version是1,它应该至少包含OtherPrimeInfo的一个实例。
OtherPrimeInfos ::= SEQUENCE SIZE(1…MAX) OF OtherPrimeInfo
OtherPrimeInfo ::= SEQUENCE {
prime INTEGER, //ri – n的一个素数因子ri ,其中i ≥ 3
exponent INTEGER, //di – di = d mod (ri − 1)
coefficient INTEGER //ti – CRT系数 ti = (r1 · r2 · … · ri–1)–1 mod ri
}

RSAPrivateKey 和OtherPrimeInfo各域的意义,如注释所示。

本文讲述适用范围:已知各域值,组装RSA私钥文件,即PEM文件。

PEM文件组成是TLV结构。

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

  1. version:
    00
  2. moudlus:
    c1f7f7196d9ef4b97abede2d5322d76c17fdf9592c39511027268293a14603b6
    5d5425c99cfb5194d37b73487d26e31edf35cfe1e7f58366b5adb35d18f8cdb1
    401264ed35a3e26dc131c099eca45ac23dbc2e1a0d00f6defd6428a6431429b2
    744943f2e1dffe00bbd1dcf22ec7c0dde553659763c8c11db883ccb6de0de91d
    5d2bcffe57e368bf5a1799bbd6f978706793dc7aa710c1cf00725827df6651e2
    15ca4bc83509c89bb257479a2833fa972f4344799c37f8217b704c9e5ae2e09d
    1d5941ddd4caf71d12a823fdf421930df034220bd8ee37fc8b0543f1f2f49ade
    6a7ffcc7ab9d1edab4b07b7f33a72f0c660ea3c46fd7c1243ed956244e506463
  3. publicExponent:
    010001
  4. privateExponent:
    a6c362cd98e2b5f
### 使用 RSA 私钥 PEM 文件进行加密解密 #### 加载私钥和公钥 为了使用 RSA私钥 PEM 文件执行加密解密操作,首先需要加载该文件中的私钥以及对应的公钥。这可以通过多种编程语言完成,在这里提供 PHP 和 Python 中的例子。 对于 PHP 来说,可以利用 `openssl_pkey_get_private` 函数来读取并解析私钥[^2]: ```php $privateKey = openssl_pkey_get_private(file_get_contents('path/to/private_key.pem')); if (!$privateKey) { throw new Exception("Failed to load private key"); } ``` 同样地,Python 可以借助 `cryptography` 库处理 PEM 编码的私钥[^1]: ```python from cryptography.hazmat.primitives import serialization with open("path/to/private_key.pem", "rb") as pem_in: private_bytes = pem_in.read() private_key = serialization.load_pem_private_key( private_bytes, password=None, # 如果私钥受密码保护,则需指定此参数 ) ``` #### 执行加密与解密 一旦拥有了有效的私钥对象之后,就可以着手准备数据的安全传输了。需要注意的是,通常情况下应该是用公钥来进行加密而用私钥做解密;然而在某些特殊场景下确实存在相反的需求——即采用私钥加密再由持有对应公钥的一方负责解开消息的情况。 ##### 在 PHP 中实现私钥加密/公钥解密 下面展示了一个简单的例子说明怎样通过 PHP 实现上述过程: ```php // 假设已经获取到了 $publicKey 和 $privateKey 对象 $dataToEncrypt = 'Sensitive information'; // 使用私钥加密 openssl_private_encrypt($dataToEncrypt, $encryptedData, $privateKey); echo base64_encode($encryptedData); // 接收端收到 Base64 编码后的字符串后... $receivedEncryptedString = ... ; // 获取到的数据 openssl_public_decrypt(base64_decode($receivedEncryptedString), $decryptedData, $publicKey); echo $decryptedData; ``` ##### 利用 Python 完成相同的操作 同样的逻辑也可以很容易地转换为 Python 版本: ```python from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes message = b'Sensitive information' # 使用私钥加密 ciphertext = private_key.encrypt( message, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) print(ciphertext.hex()) # 解密部分省略,因为一般不会这样做 ``` 尽管如此,再次强调这种做法并不推荐用于实际生产环境下的敏感信息安全保障工作之中,因为它违背了常规的最佳实践原则。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值