出てくる、メッセージのやりとりに用いるディジタル署名。超頻出問題なのだが、これを実際に使っている部分を目で見たり、手でいじってみたりするのはなかなか敷居が高い。opensslなどフリーの環境だけで試せるのだから、やってみないのはもったいない。いうわけでここでは、実際に手元のパソコンで動かしてみるとどうなるか、やり方をまとめてみた。ターミナル.appからopensslを使います。Linuxならばopensslパッケージを入れてください(もう最近のは最初から入ってるけど)。Windowsならばcygwinでどうぞ。公開鍵と秘密鍵の作成ではまずは教科書通り、秘密鍵と公開鍵の鍵ペアを作る。最後の数字は何も入れないと512bitがデフォルト。ここでは1024bitで作ってみる。拡張子はkeyとして"private.key"とかする人もいる。ただのファイル名なので、この辺はどうでもいい。.pemなのは、PEM形式だということを言いたいから。公開鍵の作成いま作った秘密鍵から、公開鍵を作成する。-puboutオプションを付ければよい。public.pemこれで、以下の鍵ペアができた。秘密鍵:private.pem公開鍵:public.pemメッセージへのディジタル署名の作成では、鍵ペアが用意できたので実際にディジタル署名を付けたメッセージを手で作って送ってみよう。ケースとしてこんなのを考える。AliceがBobに以下のようなメッセージを送る。明日は10:00に時計台で待ち合わせをしましょう。Aliceよりまず、Aliceは送信文のハッシュ値を作る。sha-1(160bit)で作るのが普通ですかね。メッセージが、message.txtというファイルに書かれているとする。message.txtこのハッシュから、Aliceは自分の秘密鍵を使ってディジタル署名を作る。alice.sigこれで出来上がったディジタル署名、alice.sigはバイナリファイル。今はメッセージは電子メールで送るのが普通(だよね?)。S/MIMEの場合、ディジタル署名をBase64エンコーディングして、メール本文と共にマルチパートで送ることになる。ここでは手動で目で見ながらやってみるのが目的なので、このまま行きます。メッセージ受信とディジタル署名の確認さて、Bobはこの署名ファイルが付いた、こういうメッセージを受け取った。明日は10:00に時計台で待ち合わせをしましょう。添付では、この内容が改ざんされていないかを、受け取ったBobが調べてみよう。Bobは、メッセージ本文をmessage.txtとして保存し、sha1sumを自分で作ってみる。message.txt先ほど我々が計算した通り、"325b367c3a9b07ad7951e8d015d63f03136b9deb"が出てきた。Aliceが公開している公開鍵ファイル、public.pemをどこかで取得して(きっとAliceは自分のWebページを持っていて、そこで配っているのでしょう)、その公開鍵を使って電子署名を復号してみる。public.pem325b367c3a9b07ad7951e8d015d63f03136b9debこの値は、自分で計算したメッセージのハッシュ値と一致した。いうことは、このメッセージは「Aliceの鍵を用いて」「改ざんされずに」送られたことが分かる。明日は遅れないようにしないとね。改ざんされた場合では、AliceとBobの仲に嫉妬したMarvinが、Aliceの送信メールを何らかの手段でぶっこ抜き、代わりにこんなメールをBobに送ったとする。あなたのことなんて大嫌い。添付(Marvinは、メール本文のみ書き換えて署名はそのままにしたとする。message.txt"30762f44b44b6d9ce47b3925656ec998aea791c9"だった。(面倒だけど、この例では本文をいったんmessage.txtとして保存してそのファイルのハッシュを取っている)一方、添付されたalice.sig(ディジタル署名)ファイルをAliceの公開鍵で復号すると、それは......。public.pem325b367c3a9b07ad7951e8d015d63f03136b9deb"325b367c3a9b07ad7951e8d015d63f03136b9deb"。値が違う!ということは、このメッセージはAliceが送ったものから、何かしらの改ざんを受けたモノである。判断できることになる。二人の仲は無事でした。署名を偽造するでは、署名をなんとか偽造しようとしたらどうだろう。Aliceの秘密鍵は手に入らないので、Marvinは自分の秘密鍵でハッシュから署名したものを付けて、それっぽく送ってみたとする。あなたのことなんて大嫌い。添付(実はMarvinが自分の秘密鍵で作ったもの)この際には、受信したBobは、「Aliceの公開鍵を使い、Marvinの秘密鍵で暗号化されたものを復号する」ということになる。すると以下の通りエラーとなり復号できないため、やっぱり正しいメッセージではないことが分かる。failed:rsa_eay.c:721:このように、ディジタル署名の一番シンプルな例では、「平文+署名」で改ざん検知ができる。暗号化ももちろんできるのだが、ここでは分かりやすくするためしていない。上記の例では書いていないけど、この逆の機能と言うべき否認の防止もできる。あるメッセージとそのディジタル署名に対して、Aliceの公開鍵で正しく正当性が確認できるということは、逆に言うとそのディジタル署名はAliceの秘密鍵で作られたものだということ。いうことは、あるメッセージが署名付きで出されたら、それを後でAliceが「いや、それは私の発言じゃないよ」と言うことはできない。その署名はAliceの秘密鍵でしか作れない、イコール、Aliceが書いたものだから......。証明書この辺で、意図的に書いていなかった重要な問題がある。今まで、BobはAliceの公開鍵を正しく入手したという前提でサラリと書いてきたけれど、コトはそんなに単純じゃない。Aliceが直接USBメモリを持ってBobの部屋にやってきて、「これ、あたしの鍵だから。」と渡してくれればいいのだけど、現実的にはそんなことはないですね。部屋に女の子来ないし(そういう話じゃない)。普通は、公開鍵はメールで送られるなりWebで公開するなりして送られてくる。それを送ってくれた人が本当にAliceかどうかは分からない......というのがキモ。実はMarvinが、「あたしAlice、よろしくね」とAliceのフリをして自分の公開鍵をBobにメールしているのかもしれない。いうことで、証明書が必要になってくる。認証局)が、「これは確かにAliceの鍵だね」と言ってくれれば、Bobは安心してAliceの公開鍵をゲットできて解決する。試しに認証局の署名付きの証明書を作ってみよう......と思うとカネがかかっちまう。いうことで、opensslでとりあえず試してみたければ、オレオレ証明書が以下のコマンドで作れる。bundle.p12pkcs12とは、秘密鍵と証明書ファイルをパッケージ化したファイル形式。これでWindowsなどではダブルクリックで証明書ストアにインポートできる。過去問の例ということで、一度手で動かしてみれば、よく分かるようになると思う。午前問40ディジタル署名を生成するときに,発信者がメッセージのハッシュ値をディジタル署名に変換するのに使う鍵はどれか。午前問40ディジタル署名付きのメッセージをメールで受信した。受信したメッセージのディジタル署名を検証することによって,確認できることはどれか。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。