如果我运行命令:
openssl pkcs8 -inform DER -in file.key
然后我得到了这个输出:
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJymFcYButtSdq6a
. . .
ROHl3KioElE/sRvPEHxJp5Bqlr2UmWSs4oMcDBVLfY609YKZTeKw6NuqH4xzd81F
7Rj3Gr6eyKeC
-----END PRIVATE KEY-----
我需要在PERL脚本上生成相同的输出,以便将其传递给:
Crypt::OpenSSL::RSA->new_private_key($key_string);
并签署我的数据。
所以我问: 这个命令在内部做什么?
openssl pkcs8 -inform DER -in file.key
所以我可以将这个过程翻译成perl。
这是我到目前为止所做的:
我加载了pkcs8的ASN.1语法,现在我可以通过引用获取数据块:
$pkcs8 = Convert::ASN1->new(encoding => 'DER');
$pkcs8->prepare(q<
--PrivateKey
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm EncryptionAlgorithmIdentifier,
encryptedData EncryptedData
}
EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
EncryptedData ::= OCTET STRING
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL }
>);
加载.key文件并进行转储的结果是:
$VAR1 = {
'encryptionAlgorithm' => {
binary data 'parameters' => binary data¸
'algorithm' => '1.2.840.113549.1.5.13'
},
'encryptedData' => ' . . . . binary data . . . . . '
};
我认为 encryptedData 是根据OID 1.2.840.113549.1.5.13
使用pkcs5编码的任何建议都表示赞赏。
答案 0 :(得分:1)
openssl pkcs8 -inform DER -in file.key
命令只是将输入从DER转换为PEM并将其打印出来。 PEM编码只是二进制DER的base64编码,添加了BEGIN和END行。
use File::Slurp;
use MIME::Base64;
$der = read_file('file.key');
$pem = "-----BEGIN PRIVATE KEY-----\n"
. encode_base64($der)
. "-----END PRIVATE KEY-----\n"
print $pem;
这应该给你基本上与openssl命令相同的输出(默认情况下,MIME :: Base64使用76个字符的输出行,而标准的PEM编码使用64个字符的行...但我怀疑这将是重要的为了您的目的)