1. ホーム
  2. openssl

[解決済み] BEGIN RSA PUBLIC KEY」と「BEGIN PUBLIC KEY」の2種類の公開鍵形式がありますが、どのように変換すればよいのでしょうか?

2022-06-29 08:36:20

質問

公開鍵の形式は2種類ありますが、どのように変換すればよいのでしょうか。 1つのフォーマットは

-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----

という形式であれば、もう一方の形式は

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

例えば、私は ssh-keygen コマンドを使用して id_rsa/id_rsa.pub のペアを生成しました。 id_rsaから公開鍵を計算しました。

openssl rsa -in id_rsa -pubout -out pub2 

で、再度id_rsa.pubから公開鍵を計算しました。

ssh-keygen -f id_rsa.pub -e -m pem > pub1

は、pub1 のコンテンツです。

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa
D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw
luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB
o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV
gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH
Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB
-----END RSA PUBLIC KEY-----

で、pub2 の内容は:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----

私の理解では、pub1とpub2は同じ公開鍵情報を含んでいますが、異なるフォーマットになっています。誰かが私に塔の形式に関するいくつかの簡潔な紹介を示すことができますか?

どのように解決するのですか?

使用方法 phpseclib, PHP による純粋な RSA 実装 ...

<?php
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey('-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA61BjmfXGEvWmegnBGSuS
+rU9soUg2FnODva32D1AqhwdziwHINFaD1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBS
EVCgJjtHAGZIm5GL/KA86KDp/CwDFMSwluowcXwDwoyinmeOY9eKyh6aY72xJh7n
oLBBq1N0bWi1e2i+83txOCg4yV2oVXhBo8pYEJ8LT3el6Smxol3C1oFMVdwPgc0v
Tl25XucMcG/ALE/KNY6pqC2AQ6R2ERlVgPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeu
lmCpGSynXNcpZ/06+vofGi/2MlpQZNhHAo8eayMp6FcvNucIpUndo1X8dKMv3Y26
ZQIDAQAB
-----END PUBLIC KEY-----');
$rsa->setPublicKey();

echo $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1_RAW);

ヘッダにBEGIN PUBLIC KEYとあってBEGIN RSA PUBLIC KEYでないにもかかわらず、base64エンコードされたものはマッチしているように見えます。そのため、str_replaceを使用して修正すれば、問題ないでしょう。