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