这个命令在内部做什么? openssl pkcs8 -inform DER -in file.key?

时间:2013-01-17 22:49:13

标签: perl openssl rsa

如果我运行命令: 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编码的

任何建议都表示赞赏。

1 个答案:

答案 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个字符的行...但我怀疑这将是重要的为了您的目的)