2016/09/03

[nfc]公開鍵をopensslで使ってみよう

マイナンバーカードから公開鍵を読めたとしよう。
そこからどうしたらよいのだ?
ここからは、私の知らない世界だ。

 

私の中では、こういうRSAとかはopensslを使うものだろう、というイメージがあるので、それでやってみた。
が・・・、openssl rsaでもopenssl rsautlでも、公開鍵として読めない、と言われる。
openssl asn1parseをDERオプション指定では読めるので、ASN.1としては正しいはず。。。

 

RSA公開鍵のファイル形式とfingerprint - Qiita
こちらを見ると、取得した公開鍵の形式はpkcs#1のような気がする。
サイズが同じだし、タグがSEQUENCE-INTEGER-INTEGERの構成だから、というだけの根拠だが。。。

 

ssh接続用の公開鍵( ssh-rsa public key )をopensslで使える形式( X.509 PEM )にshellscriptで変換する Mac OS X ( Convert ssh-rsa public key to pem )
なんと、pkcs#1はopensslでは使えないようだ、との記述が。

でも、opensslの-informの説明では、"DER"はPKCS#1フォーマットと互換のあるASN1エンコード、と書いているのだが、実際使えないから、何か違うのかもしれん。

 

openssl - How can I transform between the two styles of public key format, one "BEGIN RSA PUBLIC KEY", the other is "BEGIN PUBLIC KEY" - Stack Overflow
お、こちらの2番目の回答者は、rsaEncryptionだけじゃなくて、もうちょっと上の方から、データに含めているようだ。

さっきまで試していたのは、図で言えば赤線で囲んだ枠の中だけのデータだったのだが、回答者は青線で囲んだ枠の部分をデータにしているのだ。

image

 

$ openssl rsautl -encrypt -pubin -inkey file.bin -keyform DER -in
mine.txt -out mine.enc
$

おー、通った。
file.binが青枠の部分をファイルにしたもので、mine.txtは符号化用に作った短いテキストファイルだ。

実際は、mine.txtのダイジェストを取って、それを符号化するんだったような。
じゃないと、長い文章なんかはそのまま符号化できないからだ。
復号するところも試してみたいが、秘密鍵は持っていないのでできない。


実際は、符号化するのはカード側で、opensslで行うのは復号の方だ。
カードには、暗号化したいデータを書けばよいのかな。
マイナンバーカードでSSHする - AAA Blog

"PKCS1形式のハッシュ値"と、また聞いたことのない形式が出てきた。。。
単に符号化するだけだったら、データ形式は関係ないのでは?と思いたいのだが、今までがASN.1というかpkcs#1形式だっただけに、ちゃんとINTEGERとか付けないとだめなのかもしれん。

こういうのは、OpenSCのソースを見るのがよいのだろうが・・・。
sc_pkcs15_compute_signature()をpkcs15-crypt.cなどが呼んでいるところまではわかったのだが、深入りしない方がよい感触だ。

 

では、気にせず適当に値を投げてみればよかろう。
暗証番号が間違えばカウントが減りそうだけど、ここで間違っていても減らないだろう。

よくわからない0x2AコマンドはType-BのCase4Shortなので、ヘッダと、Lc、データ、Leで構成される。
Lcはデータのサイズで、Leは2048bitということで00にしておけば256バイトになるだろう。

あ・・・256バイトのレスポンスなんて対応してないぞ。
Normalフレームでの送受信しかやっていないのだ。
Extendedフレームにした場合は265バイトまでいけるんだけど、入るのか?
レスポンスが256バイト、それにInDataExchangeのレスポンスコード、ステータスフラグで3バイト、SWで2バイト。
261バイトだから、収まるのか。
PN532のドキュメントでは、R-APDUは258バイトまでとなっているが、APDUの部分だったら満たしているから大丈夫か。

今までExtendedフレームなんて対応したことないから、参ったな。。。
あ、昔の私偉い!対応してた!!

 

では、やってみて、受信したデータを公開鍵で復号してみよう。

$ openssl rsautl -verify -pubin -inkey file.bin -keyform DER -in
sig.bin -out sig.txt
$ cat sig.txt
my number card!

おー、出た出た、やりおったわ。
カードの方に「my number card!」というデータを書いて、それによって戻ってきたデータをsig.binに保存して、それを先ほどの公開鍵で復号したのだ(公開鍵でやるときは、-decryptじゃなくて-verifyなのだね)。

 

夏休みの自由研究は、これで終わりにしよう。
やれやれ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。