それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ssh秘密鍵とopenssl を使って電子署名を作る

ssh 秘密鍵で署名を作る

ssh の公開鍵秘密鍵を使って、文字列を暗号化したり復号化したりしてた。

秘密鍵で、デジタル署名をつくってみる。

電子署名というか、ダイジェストのハッシュ値を利用したものになるので、手順としてはこんな感じかな。(自信ない

送信側

  • あるデータAのダイジェスト値を計算
  • ダイジェスト値に秘密鍵でサイン(暗号化)
  • データAと署名したダイジェスト値を送信

受信側

受け取ったデータAが改竄されてないか検証する

  • ダイジェスト値を取り出すために公開鍵を用意する
  • 公開鍵と署名からダイジェスト値を取り出し
  • データAのダイジェストを計算
  • 取り出したダイジェストとデータA導出値と比較
  • 一致すれば改竄なし

受信側の手順は何ステップもあるけど、実際はコマンド一発

秘密鍵を使ってsign を作る

ダイジェストの計算なので openss dgst を使う

ファイルの作成

とりあえず、そのへんの愚痴ってたファイルを使う。

cat   grumbling.txt
ヤマト運輸
 宅急便コンパクト(新設
 宅急便
 メール便(廃止
日本郵便
 ゆうぱっく
 簡易書留
 レターパック

メール便は便利だったのに残念?

保証無しメール便で商品送る奴が多すぎたんだろうな
レターパックも保証無し

補償なしで、スマホ送るとか頭どうかしてるぜ


メルカリやヤフオクでスマホの落札者こわい
安くしたいからメルカリ・ヤフオクで買うんだろうけど
配送トラブルが起きたらどうするんだ、いつも警告してるのに

配送トラブルが出品者負担とかもう頭おかしい

こちらが+500円負担して宅急便で送ってるけど、
指定した配送方法じゃない、送料ごまかしてるんじゃないかとかもうね。。

署名する

ダイジェスト計算して、暗号化

openssl dgst  -sha1 -sign /Users/takuya/.ssh/id_rsa grumbling.txt > grumbling.txt.sig

受け取った側で署名を検証する

受信側は次の2つを受け取ることになる。

  • 元ファイル grumbling.txt
  • 署名 grumbling.txt.sig
takuya@~/Desktop$ openssl dgst -sha1 -verify takuya.pkcs8 -signature grumbling.txt.sig  grumbling.txt
Verified OK

仮に改竄されていると・・・

takuya@~/Desktop$ echo "1" >> grumbling.txt # 改竄
takuya@~/Desktop$ openssl dgst -sha1 -verify takuya.pkcs8 -signature grumbling.txt.sig  grumbling.txt
Verification Failure

失敗する。

ダイジェストを取り出してみる。

たぶん、署名ファイルにはダイジェストが入ってるはずなので取り出してみる。

openssl rsautl -verify -pubin -inkey takuya.pkcs8  -in grumbling.txt.sig > sig.out.rsa
sha1sum grumbling.txt
11b72642526a66e4899c0f76f0f3c67ee98dc3a1  grumbling.txt

これと、デコードした結果を見てみる。

うん、同じものがあるゾ

 hexdump sig.out.rsa
0000000 30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 11
0000010 b7 26 42 52 6a 66 e4 89 9c 0f 76 f0 f3 c6 7e e9
0000020 8d c3 a1
0000023

ちゃんと、ダイジェストが入ってることがわかりました。

でも、openssl rsa で複合がなんで -verify なんだろう。。。

参考資料

iOS - 電子署名のファイルフォーマット - Qiita

OpenSSLコマンドによる公開鍵暗号、電子署名の方法 - Qiita