予備知識:ハッシュ
たとえば、電文メッセージの文字「ア」を1、「イ」を2というように数値化して、それを合計した値を考えましょう。それをハッシュ値、ダイジェストといいます。
- ハッシュ値の長さは、元のメッセージの長さと比較して非常に短くなります。
- ハッシュ値からメッセージを復元できませんが、メッセージを変更するとハッシュ値が変わります。
実際には、ハッシュ値の計算には、ハッシュ関数という複雑な処理をしています。ハッシュ関数は、次のような特徴を持っています。
- 同じメッセージからは、同一のハッシュ値が生成される。
- 異なるメッセージから、同一のハッシュ値が生成される確率は非常に小さい。
- メッセージが少しでも異なっていればハッシュ値は大きく異なったものになる。
これらの特徴を利用して、送信者はメッセージからハッシュ値を生成し、その二つを送信します。受信者はメッセージからハッシュ値を生成し、送信者のハッシュ値と同じであれば、メッセージが改ざんされていないことがわかります。
- SHA(Secure Hash Algorithm)
- 暗号でのハッシュ関数は公開されています。SHAはその代表的なもので米国標準技術局(NIST)採用されました。いくつかの方式がありますが、SHA-256が普及しています。
- DSA(Digital Signature Algorithm)
- NISTが標準として定めたデジタル署名のアルゴリズムです。RSAの理論に基づきSHAを採用しています。
ハイブリッド暗号方式
ハイブリッド暗号方式とは、共通鍵暗号方式の効率性と公開鍵暗号方式の鍵送付の安全性を組み合わせた暗号方式です。
現在の電子署名をした暗号化通信では、この方式とハッシュ値を組み合わせたものが一般的になっています。なお、これを(広義での)公開鍵暗号方式ということもあります。
- ① 送信者は、平文からハッシュ値を得る(そのハッシュ関数にSHAが使われる)
- ② 送信者は、ハッシュ値を送信者の秘密鍵で暗号化する(DSAに準拠)。この秘密鍵は送信者しか知らないのだから署名をしたことになる。
この暗号ハッシュ値をMAC(Message Authentication Code)という。
そのとき、一時的な共通鍵暗号方式の共通鍵が生成される(この共通鍵は、1回の通信(セッション)ごとに新しく作成されることから、セッション鍵という)。
- ③ 暗号化されたハッシュ値と平文を共通鍵で暗号化する(共通鍵暗号方式なので効率が良い)。ハッシュ値は2回暗号化されている。
- ④ 生成された共通鍵を受信者の公開鍵で暗号化する。
- ⑤ ③と④の結果を送信する。
- ⑥ 受信者は、受け取った④の暗号化された共通鍵を受信者の秘密鍵で復号する。
- ⑦ 復号された共通鍵で、③の暗文を平文にし、2回暗号化されたハッシュ値を①の暗号化した状態に復号する。
ここで平文を読むことができる。でも、本当に送信者が送ったものなのか、途中で改ざんされたものなのかは未だわからない。
- ⑧ ⑦の1回暗号化ハッシュ値を送信者の公開鍵で復号する。
- ⑨ ⑦で復号した平文を①と同様にハッシュする。
- ⑩ ⑧と⑨で得たハッシュ値を比較する。これが一致していれば、送信者の秘密鍵を持っている者(署名者)が送信したことがわかる。さらに、改ざんされていればハッシュ値が変るので、二つのハッシュ値が一致したことは改ざんされていない証明になる。
ハイブリッド暗号方式の特徴
- 電子署名と暗号通信を同時に行う
電子署名は、送信者がハッシュ値を送信者の秘密鍵で暗号化することで行います。
公開鍵暗号方式での暗号化は、セッション鍵と暗号化されたハッシュ値を、受信者の公開鍵で暗号化することで行います。
- 長文の暗号化・復号には、効率のよい共通鍵暗号方式を用いる
電文の暗号化には、共通鍵を用います。
- 途中で改ざんされていないことが確認できる
送信者が送ったハッシュ値と、送られた平文から計算したハッシュ値が一致していれば、改ざんされていないことが証明できます。
- 作成の日時がわかる。
上の手順では省略しましたが、電子署名をするとその時刻も取り込まれます。復号のときにそれを知ることができます。
秘密鍵で署名をすること、公開鍵で送信者と非改ざんの検証をすることから、秘密鍵を署名鍵、公開鍵を検証鍵ということもあります。
この方式を用いることにより、送信者が本人であること、途中で改ざんされていないことは保証できますが、通信が盗聴されたり破棄されたりする危険性は排除できません。それには、暗号技術ではなく通信網での対策が必要になります。
さらには、署名で用いた公開鍵が本当に本人のものかどうか(盗まれた実印ではないか)は、ここまでの方式ではわかりません。印鑑証明に相当する機能を実現するために電子認証の仕組みがあります。