暗号化のカギをPEM形式に変換する方法を調べたので、その覚書。
初めに
今回利用しようとしたのは、.NetのSystem.Security.Cryptography.RSACryptoServiceProvider
。
これで作成された公開鍵をテキスト形式にして、やり取りできないかと調べていた。一応、PEM形式というのがテキストとしてやり取りする形式らしいのだが、上記.Netのオブジェクトからすぐそのまま出力することはできなかった。
一応、親クラスのRSAにはToXmlStringというメソッドがあるので、とりあえずのテキスト化はできそうなのだが、このメソッドは.NET Coreのみサポートされていない。
別手法として、RSA.ExportParametersで出力されたRSAParametersはシリアル化できるのだが、すべてのメンバーがシリアル化対象ではないらしい。(Net Core 2.1.0 以降その制限は解除されているらしいが)
そこで、”RSAParameters PEM”でググったところ、BouncyCastleというパッケージを利用するのが一般的らしいということが分かった。
ググった結果の参照先
上記Qittaのページが、参考になったのでテストプログラムを作成。
問題点
該当ページの実行結果にも書かれていたのだが、復号化したところで例外が発生してしまった。
このページには解決策も記述されていた。
PEMをバイナリに変換する際に、先頭のバイトに0x00が入っているので、それを除去するというコードを入れる、という内容だった。
このサイトのコードは、バイナリ化にToByteArray()を使っている。
一応、この部分について、追跡調査した結果、他の多くのサイトではバイナリ化するコードとして、ToByteArrayUnsigned()を使っているのが多かった。
理由
バイナリ化に利用されているBigIntegerを調べたところ、先頭のバイトに入るのは、符号情報らしいということが分かった。
今回適用しようとしている鍵情報は、もともとがByte配列なので、符号情報はいらない。なので、バイナリ化にはToByteArrayUnsigned()が正しいという理由になる。
その他
MSDNのSystem.Security.Cryptography.RSAを見ていたら、RSA.ExportRSAPublicKeyというメソッドが追加されているというのがあった。
説明には、以下の様に記載があるので、今後は、BouncyCastleを利用しなくても実装できるようになるのかもしれない。
現在のキーの公開キーの部分を、PKCS#1 RSAPublicKey 形式でエクスポートします。
コメント