blog

暗号化と署名

DES は対称暗号アルゴリズムであり、鍵長 56bit で 64bit の平文を 64bit の暗号文に暗号化します。 実際には仕様上、鍵長は 64bit ですが、エラーチェックのためのビットが 7b...

Oct 29, 2020 · 12 min. read
シェア

パスワードの種類

鍵の使用方法によって、暗号は一般的に対称暗号と公開鍵暗号の2種類に分類されます。

対称パスワード

対称暗号とは、暗号化と復号に同じ鍵を使用する暗号です。

  • 一般的に使用される対称暗号アルゴリズムは3つあります。

DES

DESは64bitの平文を56bitの鍵長で64bitの暗号文に暗号化する対称暗号アルゴリズムです。 実際には仕様上、鍵長は64bitですが、エラーチェック用のビットが7bitごとに設定されるため、実質的な鍵長は56bitとなります。 DESは一度に64bitのデータしか暗号化できないため、より大きなデータに遭遇した場合はDES暗号化を反復する必要があります。DES は一度に 64 ビットのデータしか暗号化できないため、より大きなデータに遭遇した場合は DES 暗号化を繰り返す必要があります。

DES 暗号化は短時間で解読される可能性があるため、使用は推奨されません。

DES

3DESは、DESを3回繰り返すことで得られる暗号アルゴリズムで、3-fold DESとも呼ばれ、現在でも一部の銀行機関で使用されていますが、処理速度が速くなく、セキュリティ上の問題があります。

  • 3DESの暗号化プロセスは以下のように、暗号化-復号化-暗号化によって平文を暗号化します。

  • 3DESの復号プロセスは以下のように、復号-暗号化-復号によって暗号文を平文に復号します。

上記の暗号化・復号化処理では、3つの鍵がすべて異なるため、DES-EDE3とも呼ばれます。

  • 上記処理の鍵が全て同じであれば、結果は通常のDESと同等であり、3回の暗号化と復号化は無意味。

  • キー1とキー3が同じでキー2が異なる場合、DES-EDE2と呼ばれます。

AES

AESは、新しい標準と呼ばれるDESを置き換えるために使用される対称暗号アルゴリズムであり、AESは徐々に好ましい対称暗号アルゴリズムとしてDES、3DES、128、192、256ビットの3つのAESキーの長さを置き換えています。

鍵配布の問題

鍵の分配問題とは何ですか?

対称暗号を使用する場合、次のような鍵配布の問題が発生します。

アリスが対称暗号で暗号化したメッセージをボブに送ったとします。ボブは平文のメッセージを見たいので、アリスが暗号化した鍵を手に入れる必要があります。

鍵の配布問題を解決するには?

鍵の配布問題を解決する方法はいくつかあります。

  • 事前の鍵共有。つまり、アリスとボブは事前に鍵を非公開で共有し、ネットワーク上で送信できないようにします。しかし、この方法は非常に面倒なのでお勧めできません。
  • 鍵配布センター
  • Diffie-Hellman鍵交換
  • 公開鍵暗号公開鍵暗号は 最近よく使われる方法で 学ぶべき主要なものの1つです

公開鍵のパスワード

公開鍵暗号方式では、鍵は暗号化鍵と復号鍵の2種類に分けられ、同じ鍵ではないため、公開鍵暗号方式は非対称暗号方式とも呼ばれます。

公開鍵暗号で

  • 暗号鍵は公開されているので、公開鍵と呼ばれます。
  • 復号鍵はメッセージの受信者が保持し、公開することはできないため、秘密鍵とも呼ばれます。
  • 公開鍵と秘密鍵は1対1の対応関係にあり、別々に生成することはできません。
  • 公開鍵で暗号化された暗号文は、その公開鍵に対応する秘密鍵を使って復号化しなければなりません。
  • 秘密鍵で暗号化された暗号文は、その秘密鍵に対応する公開鍵を使って復号化する必要があります。

公開鍵暗号が鍵配布の問題を解決

以上のように、鍵の配布問題は公開鍵暗号方式で解決することができ、具体的な解決プロセスは以下のようになります:

  • まず、メッセージの受信者は公開鍵と秘密鍵のペアを生成します。
  • メッセージ送信者に公開鍵を送信。
  • メッセージ送信者は公開鍵でメッセージを暗号化します。
  • メッセージ送信者は暗号化された暗号文をメッセージ受信者に送信します。
  • メッセージ受信者は、暗号文を秘密鍵で復号し、平文のデータを取得します。

RSA

RSAは最も広く使われている公開鍵暗号アルゴリズムです。その名前は、3人の開発者、ロン・リベスト、アディ・シャミア、レナード・アドルマンの頭文字から成っています。

ハイブリッド暗号システム

対称暗号と非対称暗号の比較

  • 対称パスワードは鍵配布の問題に対する良い解決策ではありません。
  • 公開鍵暗号は、暗号化された暗号文がメッセージそのものと同じ大きさであるため、暗号化と復号化に時間がかかり、大容量のデータを扱うには遅すぎます。
  • 鍵配布の問題を解決すると同時に、暗号化と復号の速度を向上させるためです。そこで、共通鍵暗号と公開鍵暗号を組み合わせて長所を補完する方式が採用されました。現在、ネットワーク上の暗号通信に使われているSSL/TLSは、ハイブリッド暗号方式を利用しています。

ハイブリッド暗号

セッション鍵

  • セッション・キーは、この通信のために特別に生成されたランダムで一時的なキーです。
  • セッション・キーは、メッセージを暗号化するための対称暗号のキーとして使用されます。

暗号化のステップ - メッセージの送信

  • 最初のステップでは、メッセージ送信者はメッセージ受信者の公開鍵を取得する必要があります。
  • 2番目のステップでは、セッション・キーが生成され、これが対称暗号のキーとして使われ、メッセージを暗号化して暗号文にします。
  • 第3のステップでは、メッセージ受信者の公開鍵がセッション鍵の暗号化に使われます。
  • 第4ステップでは、第2ステップと第3ステップで生成された暗号化結果をメッセージ受信者に送信します。

送信内容

  • セッションキーで暗号化されたメッセージ
  • 公開鍵で暗号化されたセッション鍵

ハイブリッド暗号システム-復号化

メッセージの送信者==からメッセージを受信したら、以下のように復号化操作を行う必要があります:

  • 最初のステップでは、メッセージの受信者は自身の秘密鍵でセッション鍵を復号します。
  • 第2ステップでは、第1ステップで得たセッション・キーでメッセージを復号し、平文データを得ます。

ハイブリッド暗号システム - 暗号化と復号化の完全ステップ・バイ・ステップまとめ

アリスをメッセージの送り手、ボブをメッセージの受け手とします。

メッセージの送信

  1. ボブはまず、公開鍵と秘密鍵のペアを生成します。
  2. Bob公開鍵をアリスと共有
  3. アリスはランダムなセッションキーを生成します。
  4. アリスは送信するメッセージをセッション鍵で暗号化します。
  5. アリスはボブの公開鍵でセッション鍵を暗号化。
  6. アリスはステップ4と5を暗号化した結果をボブに送ります。

メッセージの受信

  1. Bobは自分の秘密鍵を使ってセッション鍵を復号します。
  2. Bobはセッション・キーを使って受信メッセージを解読します。

単一のハッシュ関数

一方向性ハッシュ関数は、メッセージの内容に応じてハッシュ値を計算することができます。また、ハッシュ値の長さとメッセージの長さは関係なく、1bitのメッセージでも、10Mのメッセージでも、100Gのメッセージでも、一方向ハッシュ関数は一定の長さのハッシュ値を計算します。

一方向ハッシュ関数の特徴

  • 固定長のハッシュは、任意の長さのメッセージから計算されます。

  • 計算速度が速く、ハッシュ値を素早く計算できます。

  • たとえ1ビットのデータの違いであっても、メッセージは異なり、ハッシュ値は異なります。

  • 一方向的かつ不可逆的

よく使われる一方向ハッシュ関数

一方向ハッシュ関数は、メッセージダイジェスト関数、ハッシュ関数としても知られています。出力ハッシュ値はメッセージダイジェスト、フィンガープリントとも呼ばれます。

一般的な一方向ハッシュ関数は以下の通りです。

MDMD5

128ビットのハッシュを生成します。MDはMessage Digestの略で、もはや安全ではありません。

SHA-1

160ビットのハッシュを生成します。

SHA-2

SHA-256、SHA-384、SHA-512は、それぞれハッシュ値の長さが256bit、384bit、512bitで、ハッシュ値の長さが大きいほど安全性が高くなります。

SHA-3

SHA3は、理論的に攻撃手法が特定されていたSHA-1アルゴリズムに代わる新たな標準として発表された一方向ハッシュ関数アルゴリズムです。世界中の企業や暗号技術者から多くのSHA-3候補が提出され、5年にわたる選考を経て、2012年にKeccakアルゴリズムがSHA-3標準として正式決定されました。

一方向ハッシュ関数の応用

データ改ざんの防止

  • ファイルを一方向ハッシュ関数に通してハッシュ値を取得することで、ファイルが改ざんされるのを防ぎます。ハッシュ値は安全な場所に保管します。一定期間後、ファイルが改ざんされている場合は、一方向ハッシュ関数を通して、最新のファイルを取得し、比較のハッシュ値と、最新のハッシュ値を取得し、ファイルが改ざんされているかどうかを判断することができます。

  • ソフトウェアの改ざん。一般的に、通信負荷を分散させるために、一部のソフトウェア会社は自社のソフトウェアをイメージサイトに掲載し、ユーザーがダウンロードできるようにしています。では、イメージサイトからダウンロードしたソフトウェアが悪意を持って改ざんされたものであるかどうかは、どのように判断すればよいのでしょうか。一般的に、ソフトウェア会社はハッシュ関数を通じてソフトウェアのハッシュ値を公式サイトに掲載し、ユーザーが比較できるようにしています。ユーザーがダウンロードしたソフトウェアのハッシュ値が公式サイトと一致していれば、ユーザーがダウンロードしたソフトウェアが悪意を持って改ざんされていないことを示します。たとえば、ソフトウェアVNCは、表示するには、VNCクリックすることができます。

パスワード暗号化

アプリにログインする際、一般的にアカウント番号とパスワードを確認する必要がありますが、データベースに保存されているパスワードは一般的に平文のパスワードではなく、SHA-2ハッシュ関数後のハッシュ値であるため、ログイン時にパスワードのハッシュ化アルゴリズムに入力してハッシュ値を取得し、データベースに保存されているハッシュ値と比較し、パスワードが正しいかどうかを判断する必要があります。

また、ハッシュ関数の不可逆性により、データベースに保存されたパスワードのハッシュ値を他人が不正な手段で入手したとしても、ユーザーの本当のパスワードを入手することはできません。これにより、ユーザーデータの安全性が大幅に向上します。

デジタル署名

実際、対称暗号、非対称暗号、ハイブリッド暗号のどれを使っても、メッセージの真正性を検証する方法はありません。つまり、メッセージの受信者は、そのメッセージがメッセージの送信者によって送信されたものかどうかを見分けることができないのです。また、メッセージ送信者を装った他人がメッセージを送信した可能性もあります。では、どのようにしてメッセージの真正性を確認するのでしょうか。それはデジタル署名です。

デジタル署名の2つの動作

  • 署名の生成。主にメッセージ送信者が「署名鍵」を介して行うもの。
  • 署名の検証。これはメッセージの受信者によって行われ、「検証キー」によって検証されます。

では、この署名がメッセージ送信者自身によって署名されたものであることを保証するにはどうすればよいのでしょうか?その答えは、メッセージ送信者自身の秘密鍵を署名に使うことです。公開鍵暗号では、誰でも暗号化に公開鍵を使うことができます。

一方、デジタル署名では、誰でも公開鍵を使って署名を検証することができます。

デジタル署名と公開鍵暗号の比較

デジタル署名とは、公開鍵暗号を逆手に取ったものです。

デジタル署名のプロセス

通常のデジタル署名プロセス

  • まず、メッセージ送信者は公開鍵と秘密鍵のペアを生成します。
  • メッセージ送信者はメッセージ受信者に公開鍵を送信します。
  • メッセージ送信者は自分の秘密鍵でメッセージを暗号化し、署名情報を得ます。
  • メッセージ送信者は、メッセージ受信者に署名とともにメッセージを送信します。
  • メッセージ受信者は、メッセージ送信者の公開鍵を使って署名されたメッセージを解読し、署名内のメッセージを取得します。
  • メッセージの受信者は、復号化されたメッセージと直接のメッセージを比較し、両者が同一であれば、署名の検証は成功です。

しかし、このような署名プロセスは非常に時間がかかります。なぜなら、署名情報は元のメッセージを暗号化することで得られるため、メッセージのサイズが1Mであれば、暗号化された署名のサイズも1Mとなり、メッセージ受信者に送信される最終的なメッセージは2Mとなります。

デジタル署名プロセスの改善

一方向ハッシュ関数を使用した電子署名プロセスの改善。

  • まずメッセージ送信者は、一方向ハッシュ関数を用いてメッセージのハッシュを計算します。
  • メッセージ送信者は、最初のステップで得られたハッシュ値を自分の秘密鍵で暗号化し、署名メッセージを生成します。
  • メッセージ送信者は、メッセージと共に署名情報をメッセージ受信者に送信します。
  • メッセージ受信者は、メッセージ送信者の公開鍵を使って署名メッセージを復号化し、復号化されたハッシュ値を得ます。
  • メッセージ受信者はメッセージに対して一方向ハッシュ計算を行い、ハッシュ値を取得します。
  • メッセージの受信者は、署名の復号によって得られたハッシュ値と、ハッシュ関数を直接実行して得られたハッシュ値とを比較し、それが一致すれば署名の検証は成功です。

デジタル署名の役割

これらの点を総合すると、デジタル署名の有用性は要約できます:

  • メッセージが完全であることを確認
  • メッセージ内容が改ざんされているかどうかの識別
  • メッセージ送信者がメッセージの送信を拒否できないようにします。

デジタル署名の問題点

  • まず、もし誰かが文書の内容や署名の内容を改ざんしたらどうなるか考えてみてください。その結果、署名検証は失敗し、ファイルの内容が改ざんされたことが証明されます。
  • さらに、デジタル署名のプロセスは、メッセージの平文をメッセージの受信者に直接送信するものであり、メッセージのセキュリティを保証することはできません。デジタル署名はデータの機密性を保証するものではなく、単にメッセージの内容が改ざんされているかどうかを識別できることを目的としています。

デジタル署名を正しく使用するためには、署名された公開鍵が本当の送信者に属するものでなければならないことを検証する必要があります。これは、次のステップで説明するように、メッセージの送信者とメッセージの受信者の間で中間者攻撃に遭遇する可能性があるためです:

  • メッセージ受信者は公開鍵をメッセージ送信者に送信します。
  • 仲介者は通信を盗聴し、メッセージの受信者が送信した公開鍵を取得します。
  • 仲介者はメッセージ受信者の公開鍵を傍受し、自身の公開鍵をメッセージ送信者に送信します。
  • メッセージ送信者は、メッセージ受信者から送られた公開鍵を間違い、受信した公開鍵を用いてメッセージを暗号化し、暗号文をメッセージ受信者に送信します。
  • 仲介者は暗号文を傍受し、自分の秘密鍵を使って復号し、平文のメッセージを入手します。そして、傍受したメッセージの受信者の公開鍵を使ってメッセージを暗号化し、偽造した暗号文をメッセージの受信者に送信します。
  • メッセージの受信者は暗号文を受信し、秘密鍵で復号し、最終的に平文でメッセージを受け取ります。

上記のメッセージの受け渡しプロセスでは、メッセージの送信者とメッセージの受信者は中間業者の存在を検出できませんが、メッセージは漏れています。

上記の通信プロセスは、中間者攻撃(man-in-the-middle attack)を受けています。

  • 公開鍵は中間業者によって偽造されました。
  • デジタル署名の失敗

したがって、署名を検証する際には、まず公開鍵の正当性を検証する必要があります。公開鍵の正当性を検証するには?それは証明書を使う必要があります。

証明書

証明書というと、運転免許証や卒業証明書など、権威ある機関が認証したものを思い浮かべるでしょう。暗号における証明書の正式名称は公開鍵証明書といいます。運転免許証や学生証と同じようなものです。

  • 証明書には、氏名やメールアドレスなどの個人情報と、その人の公開鍵が記載されています。
  • 認証局によって電子署名され

CAとは、「公開鍵がこの人のものである」と判断し、電子署名を生成することができる個人または組織のことです。

  • 国際的な組織、政府によって設立された組織があります。
  • 認証サービスを提供することで利益を上げているビジネスがあります。
  • 個人が認証機関を設立することも可能

証明書の使用

証明書を使用するにはいくつかのステップがあります:

  1. メッセージ受信者が鍵ペアを生成 2. メッセージ受信者が公開鍵を認証局に登録
  2. 認証局は、メッセージ受信者の公開鍵に自らの秘密鍵で電子署名を施し、証明書を生成します。
  3. メッセージ送信者は、認証局からメッセージ受信者の公開鍵と認証局のデジタル署名を受信します。
  4. メッセージ送信者は、認証局の公開鍵を使用してデジタル署名を検証し、メッセージ受信者の公開鍵の正当性を確認します。
  5. メッセージ送信者は、メッセージ受信者の公開鍵を使ってメッセージを暗号化し、メッセージ受信者に送信します。
  6. メッセージの受信者は、自分の秘密鍵を使って暗号文を復号し、最終的なメッセージを得ます。

メッセージ送信者とメッセージ受信者の間では、認証局認証処理を追加した後、公開鍵の授受処理は行わず、メッセージ送信者が認証局からメッセージ受信者の公開鍵を取得することで、中間者攻撃による公開鍵偽造の問題を解消します。

証明書の登録およびダウンロードの手順は以下のとおりです。

  • メッセージ受信者は、認証局に行って公開鍵を登録します。
  • 認証局は、メッセージ受信者の公開鍵にデジタル署名し、リポジトリに格納される証明書を生成します。
  • メッセージ送信者は、認証局のリポジトリから証明書をダウンロードします。
  • メッセージ送信者は、認証局の公開鍵を使用して証明書を検証し、メッセージ受信者の公開鍵を取得します。
Read next

Reactを使い始める

JSXは、UIをより適切に記述し、開発効率を向上させるために内部で実装される関数の単なる構文上の糖分です。

Oct 29, 2020 · 3 min read