未加密和加密私钥之间的区别在于密钥数据块是经过加密的。在使用私钥数据块之前,您需要解密私钥数据块。因此,一旦解码加密的私钥数据,您可以像处理未加密的私钥数据一样处理它。
未加密的私钥数据块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加密的私钥块。
- 基于盐和口令生成加密算法“key”和“IV”。
- 解码加密的私钥块。
完成上述步骤后,解密后的私钥块可以像未编码的私钥块一样处理。
支持的加密算法数量相当大,因此您可能希望支持子集算法。例如“DES-EDE3-CBC”,“AES-xxx-CBC”等。
要生成IV,您需要将salt字符串转换为二进制。盐字符串是一个十六进制编码的字符串,因此使用十六进制字符串字符到字节转换器将每两个字符串字符转换为一个字节。
生成加密算法密钥需要密钥大小(例如,DES-EDE3-CBC为192位,AES-256-CBC为256位)。使用循环将MD5哈希结果附加到密钥上,直到生成所需的所有密钥位数。
MD5哈希循环生成包括:
1. 第一个MD5哈希:IV和密码的前8个字节的MD5哈希值
2. 所有其他MD5哈希都是上一个MD5哈希结果和IV以及密码的前8个字节的MD5哈希
请参见openssl源代码中的
EVP_BytesToKey方法,了解密钥位生成的示例。
现在可以使用上面构建的IV和KEY使用所选的加密算法解码加密私钥块。
libmagic
对你有用吗? - S.S. Anne