暗号化鍵をPEM形式に変換

暗号化のカギをPEM形式に変換する方法を調べたので、その覚書。

初めに

今回利用しようとしたのは、.NetのSystem.Security.Cryptography.RSACryptoServiceProvider

これで作成された公開鍵をテキスト形式にして、やり取りできないかと調べていた。一応、PEM形式というのがテキストとしてやり取りする形式らしいのだが、上記.Netのオブジェクトからすぐそのまま出力することはできなかった。

一応、親クラスのRSAにはToXmlStringというメソッドがあるので、とりあえずのテキスト化はできそうなのだが、このメソッドは.NET Coreのみサポートされていない。

別手法として、RSA.ExportParametersで出力されたRSAParametersはシリアル化できるのだが、すべてのメンバーがシリアル化対象ではないらしい。(Net Core 2.1.0 以降その制限は解除されているらしいが)

そこで、”RSAParameters PEM”でググったところ、BouncyCastleというパッケージを利用するのが一般的らしいということが分かった。

ググった結果の参照先

OpenSSLで作成したRSA暗号鍵をC#で読み込む方法 - Qiita
OpenSSLで作成したRSA暗号鍵(.pem)を、C#で読み込むには工夫が必要です。 そのままの内容で読み込むとエラーとなります。 原因はわかったのですがスマートな解決策が見つかっていません。 内容を見て、もし助言いただければ、もれ...

上記Qittaのページが、参考になったのでテストプログラムを作成。

問題点

該当ページの実行結果にも書かれていたのだが、復号化したところで例外が発生してしまった。

このページには解決策も記述されていた。

PEMをバイナリに変換する際に、先頭のバイトに0x00が入っているので、それを除去するというコードを入れる、という内容だった。
このサイトのコードは、バイナリ化にToByteArray()を使っている。

一応、この部分について、追跡調査した結果、他の多くのサイトではバイナリ化するコードとして、ToByteArrayUnsigned()を使っているのが多かった。

理由

バイナリ化に利用されているBigIntegerを調べたところ、先頭のバイトに入るのは、符号情報らしいということが分かった。

今回適用しようとしている鍵情報は、もともとがByte配列なので、符号情報はいらない。なので、バイナリ化にはToByteArrayUnsigned()が正しいという理由になる。

その他

MSDNのSystem.Security.Cryptography.RSAを見ていたら、RSA.ExportRSAPublicKeyというメソッドが追加されているというのがあった。

説明には、以下の様に記載があるので、今後は、BouncyCastleを利用しなくても実装できるようになるのかもしれない。

現在のキーの公開キーの部分を、PKCS#1 RSAPublicKey 形式でエクスポートします。

コメント

タイトルとURLをコピーしました