未加密和加密私钥之间的区别在于密钥 blob 已加密。您需要先解密私钥 blob 数据,然后才能使用私钥 blob。所以加密后的私钥数据一旦被解码,就可以和未加密的私钥数据一样对待。
未加密的私钥 blob PEM 文件如下所示:
—–BEGIN PRIVATE KEY—–
{base64 private key blob)
—–END PRIVATE KEY—–
加密的 RSA 私钥 PEM 文件如下所示:
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: {encryption algorithm},{salt}
{base64 encrypted private key blob)
—–END RSA PRIVATE KEY—–
例如
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,AB8E2B5B2D989271273F6730B6F9C687
{base64 encrypted private key blob)
—–END RSA PRIVATE KEY—–
所以要解码你需要的私钥数据:
- 解析DEK-Info加密算法和盐(确认第一行的好主意是:“Proc-Type: 4,ENCRYPTED”)。
- 解码 base64 加密的私钥 blob。
- 根据盐和密码生成加密算法“密钥”和“IV”
- 解码加密的私钥 blob。
完成后,解密的私钥 blob 可以像未编码的私钥 blob 一样处理。
支持的加密算法数量相当多,因此您可能希望支持一组算法。例如“DES-EDE3-CBC”、“AES-xxx-CBC”等
要生成 IV,您需要将盐字符串转换为二进制。盐字符串是一个十六进制编码的字符串,因此使用十六进制字符串字符到字节转换器将每两个字符串字符转换为一个字节。
为了生成加密算法密钥,您需要密钥大小(例如,DES-EDE3-CBC 是 192 位,AES-256-CBC 是 256 位)。通过将 MD5 哈希结果附加到密钥的循环来构建密钥“位”,直到生成所需的所有密钥位。
MD5 HASH 循环生成将包括:
- 第一个 MD5 哈希:IV 和密码的前 8 个字节的 MD5 哈希
- 所有其他 MD5 哈希是最后一个 MD5 哈希结果和 IV 和密码短语的前 8 个字节的 MD5 哈希
有关密钥位生成的示例,请参见 EVP_BytesToKey 方法的 openssl 源代码。
现在可以使用上面的 IV 和 KEY 构建使用选定的加密算法对加密的私钥 blob 进行解码。