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はOID1.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 に答える