暗号化とデジタル署名
暗号化は機密性 (暗号化対象のデータが誰にも知られないこと) を担保するものであるのに対し、デジタル署名は改竄検知 (署名対象のデータが変更された場合に、検証を行うことで皆がそれに気付くこと)、否認防止 (署名した本人がしらばっくれたときに、検証を行うことで本人が署名したことを証明できること) を担保するものです。
OpenPGP と S/MIME はともに「メールを暗号化して内容を秘匿」しつつ、「署名により第三者の改竄を検知、本人の送信したことの否認を防止」する技術ですが、この 2 つはどのように違うのでしょうか。
まずは基本的な仕組みとして RSA による暗号化 (鍵交換) とデジタル署名を使った例を示します。
RSA の基礎として以下も併せてご参照下さい。
OpenPGPとS/MIMEの基本的な仕組み
OpenPGP と S/MIME の共通した仕組みの例を以下に示します。デジタル署名と暗号化 (セッション鍵交換) にはともに RSA を使う場合です。RSA が一番説明するのに易しいため例に利用していますが、他のアルゴリズムを使う場合は、(基本的な仕組みと流れはだいたい同じですが) 流れの中での所作が異なります。
RSA は A さん (送信者) は署名のために、B さん (受信者) は暗号化のために使いますが、A さんの暗号化のための鍵ペアは署名用の鍵ペアを使い回しても良いですが、個別に用意するのが良いでしょう。(B さんも然り)
さて、A さんがメールを送信するときの流れを以下に示します。
- A さんは署名検証用の公開鍵を B さんに渡し、B さんも同様に暗号化用の公開鍵を A さんに渡します
- A さんは送りたいメール本文をハッシュ化し、そのハッシュ値を署名用の秘密鍵で暗号化することでデジタル署名を生成します
- A さんはセッションキーを生成しメール本文をセッションキーで暗号化します
- A さんはセッションキーを B さんの暗号化用の公開鍵で暗号化します
- A さんはデジタル署名、暗号化されたメール本文、暗号化されたセッションキーをセットでメールで B さんに送ります
次に、B さんがメールを受信したときの流れを以下に示します。
- B さんは自分の復号用の秘密鍵でセッションキーを復号します
- B さんはセッションキーを使って暗号化されたメール本文を復号します (メールの内容は見られるようになりますが、送り主が信頼できるか検証をしていない状態です)
- B さんはメール本文をハッシュ化します (Hash#2)
- B さんはデジタル署名を A さんの署名検証用の公開鍵で復号します (Hash#1)
- Hash#1 と Hash#2 を比較し、一致すれば検証成功となり、メール本文は改竄されていないし、送り主が A さんであると認定します
メール本文は共通鍵暗号方式のセッションキーで AES512 等の方式で暗号化します。セッションキーの暗号化 (鍵交換) は RSA 等が使われます。
ここまでが OpenPGP と S/MIME の共通的な仕組みの話でした。
では、異なる点は何なのでしょうか?次に説明します。
OpenPGPとS/MIMEの違い、メリット・デメリット
違いはデジタル署名の社会的信頼を獲得する方法
デジタル署名のアルゴリズムは RSA だけでなく DSA, ECDSA や EdDSA が使えます。(正確には OpenPGP については RFC4880 の改訂の動きがあり、ECDSA, EdDSA はそれが承認されれば使えます。2020/10/10現在)
さて、ところで A さんの署名鍵は社会的に信頼されてなければ意味がありません。悪意ある人が署名鍵を使ってサインしたとしても、逃げられておしまいです。
この署名鍵をどのように社会的に信頼あるものとするか、この方式の違いが OpenPGP と S/MIME の大きな違いです。
もう少し具体的に言うと、「信頼モデル」が異なることです。
S/MIME=ルート認証局を信頼, OpenPGP=Web of Trust (信頼の輪)
S/MIME は Web サーバの SSL/TLS (https) 証明書と同様に、「Aさんの署名鍵に対して第三者機関の PKI (認証局) がお金をもらって署名する」のに対し、OpenPGP では特に大きな後ろ盾は用意せず、「Aさんの署名鍵に対してAさんを知る人たちが善意で署名する」のです。(最近は第三者機関の PKI でも無料で署名するサービスも出てきましたが。)
OpenPGP では公開鍵に対して他の人が署名することができますので、色々な人が署名している鍵は信頼度が高いと判断できます。
一方、S/MIME ではルート認証局が署名しますので、受け取った人がそのルート認証局を信じるかどうかがポイントになります。
ちなみに Windows では「どのルート認証局を信じるか」といったリストを内部で持っています。確認方法は以下の通りです。
この信頼モデルの違いは、実装/導入のし易さに大きく影響します。
OpenPGP は自分で作成した公開鍵/秘密鍵のペアをすぐ設定して使うことができるため、実装/導入がとても容易であることがメリットです。
一方 S/MIME は自分で作成した公開鍵/秘密鍵のペアのうち、公開鍵 (CSR) を認証局に送付し、本人確認を経て証明書を発行してもらう必要があるので、実装/導入のハードルが高いことがデメリットです。
SSL/TLSやDKIMとの比較
その他の似た技術である TLS (SSL) と DKIM を比較した表を以下に示します。
ThunderBird での OpenPGP の実装例
ThunderBird では OpenPGP の鍵を 30 秒で作成できます。(「ツール」⇒「OpenPGP鍵マネージャー」⇒「生成」⇒「新しい鍵ペア」⇒「鍵を生成」)
OpenPGP の鍵を作成する際にはデフォルトでは「デジタル署名 : RSA」および「セッションキーの暗号化 : RSA」が選択されています。
ですが作成時にオプションとして「ECC (楕円曲線暗号)」を選択することもできます。
この場合、「デジタル署名 : EdDSA」、セッションキーの暗号化 : ECDH」となります。
Ephemeral-Static Diffie-Hellman (ESDH)
現代においては RSA による鍵交換は敬遠されます。これは前方秘匿性が無いため、一たび秘密鍵が漏洩したら、過去にさかのぼって全て1つの秘密鍵で復号されてしまうためです。
実際、SSL/TLS の最新バージョン 1.3 においては、RSA による鍵交換は廃止されました。
鍵交換の主流は Diffie-Hellman (DH) 鍵合意アルゴリズム、およびそれを楕円曲線暗号で実装した ECDH の2つです。
SSL/TLS においては通信開始時のネゴシエーションで互いに DH 公開鍵を生成し、それらを使います。この DH 公開鍵は一時利用であり Ephemeral (短期的) です。このような Ephemeral な公開鍵を使う DH を [ DHE ] と表現します。楕円曲線暗号で実装した ECDH で Ephemeral な公開鍵を使う場合は [ ECDHE ] と表現します。
ですが、OpenPGP と S/MIME においては通信を暗号化するのではなく、メールデータを暗号化した上で、それを相手方に送る仕組みです。そのため、相手とネゴエーションするタイミングはありません。
そこで OpenPGP と S/MIME においては受信側では Static な DH 公開鍵を使う[ Ephemeral-Static Diffie-Hellman (ESDH) ] という方式が利用可能です。S/MIME であれば証明書に埋め込んでおくことができます。
A さんの DH 公開鍵はメール送信のたびに変更すれば、毎回異なるセッションキーを使うことになります。ただし、DH の性質上、固定となっている B さんの秘密鍵がバレると以前のメールまで復号できてしまうため、前方秘匿性はありません。
RFC としては RFC2631 Section2.3 に定められており、実装としては「NIST SP 800-56A」で定められている One-pass Diffie-Hellman 等があります。
なお、Diffie-Hellman の仕組みについては以下をご参照下さい。
コメント