1

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

任何建议表示赞赏。

4

1 回答 1

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 个字符的行......但我怀疑这对您的目的很重要)

于 2013-02-26T13:37:54.070 回答