TERM GUIDE · SECURITY

暗号化

「暗号化」とは

暗号化とは、データをそのままでは内容を読み取れない形に変換することです。

暗号化する前のデータを平文、暗号化した後のデータを暗号文といいます。また、暗号文を元の平文に戻すことを復号といいます。

暗号化や復号では、通常、と呼ばれる情報を使用します。

平文「HELLO」
↓ 鍵を使って暗号化
暗号文「意味の分からない文字列」
↓ 正しい鍵を使って復号
平文「HELLO」

暗号化の主な目的は、第三者にデータを入手された場合でも、内容を簡単には読まれないようにすることです。情報セキュリティの三要素では、主に機密性を高めるための技術に当たります。

情報セキュリティの目的と対策例
目的主な対策の例
内容を他人に読まれにくくする暗号化、アクセス制御
データの改ざんを検出するデジタル署名など
データを失っても復旧できるようにするバックアップ
障害が起きても利用を続けやすくする冗長化

共通鍵暗号方式

共通鍵暗号方式は、暗号化と復号に同じ秘密の鍵を使用する方式です。

例えば、AさんがBさんへデータを送る場合、次のようになります。

Aさん
平文 → 【共通鍵K】 → 暗号文

Bさん
暗号文 → 【共通鍵K】 → 平文

AさんとBさんは、同じ鍵Kをあらかじめ共有しておく必要があります。

共通鍵暗号方式は比較的高速に処理できるため、大量のデータの暗号化に適しています。代表例としてAESがあります。

一方、問題になるのが鍵の共有です。

AさんがBさんに「暗号化したデータと、復号に使う鍵を一緒に送ります」としてしまえば、途中で両方を盗まれた場合、暗号化した意味がなくなります。

そのため、共通鍵暗号方式は高速ですが、共通鍵を相手と安全に共有する方法が必要になります。

公開鍵暗号方式

公開鍵暗号方式では、互いに対応する二つの鍵を使用します。

  • 公開鍵:他人に公開してよい鍵

  • 秘密鍵:本人だけが厳重に管理する鍵

秘密の文章を送るための暗号化では、この公開鍵と秘密鍵はともに受信者が用意します。

例えばAさんがBさんだけに読めるデータを送りたい場合、次のようになります。

Aさん
平文

【Bさんの公開鍵】で暗号化

暗号文

Bさん
暗号文

【Bさんの秘密鍵】で復号

平文

Bさんの公開鍵は誰でも入手できるので、Aさんは秘密の鍵を事前にBさんから受け取る必要がありません。

一方、Bさんの秘密鍵はBさんだけが持っているため、暗号文を入手した第三者は簡単には復号できません。

ハイブリッド暗号方式

ハイブリッド暗号方式は、共通鍵暗号方式と公開鍵暗号方式を組み合わせる方式です。

例えば、単純化したモデルでは、次のように行います。

  1. 送信者が共通鍵を作成する

  2. 送信者が受信者の公開鍵を使って、作成した共通鍵を暗号化する(共通鍵もデータなので暗号化できます)

  3. 暗号化した共通鍵を受信者へ送信する

  4. 受信者は受信者の秘密鍵を使って、暗号化された共通鍵を復号する

  5. 安全に共通鍵を共有できたので、以降の通信はこの共通鍵を使った共通鍵暗号方式で行う

この方式には、次の利点があります。

  • 大量のデータは高速な共通鍵暗号で処理できる

  • 共通鍵そのものは公開鍵暗号などによって安全に確立・配送できる

共通鍵暗号方式と公開鍵暗号方式の違い

共通鍵暗号方式と公開鍵暗号方式の比較
項目共通鍵暗号方式公開鍵暗号方式
同じ秘密鍵を共有する公開鍵と秘密鍵を使う
暗号化・復号比較的高速一般に共通鍵方式より計算量が大きい
大量データ向いている通常は本文全体の暗号化には使わない
鍵の共有安全に共有する必要がある公開鍵は公開できる
主な利用データ本体の暗号化鍵の確立・配送、認証、署名など

実際のシステムでは、どちらか一方だけを使うのではなく、両者の長所を組み合わせることが多くあります。

HTTPSとTLS

WebサイトのURLがhttps://で始まっている場合、ブラウザとWebサーバの間ではTLSという仕組みを利用して安全な通信路を作ります。

TLSには主に、次の役割があります。

  • 通信内容を第三者に読まれにくくする

  • 通信内容が途中で改ざんされたことを検出する

  • 通常は、接続しているサーバが正当なサーバであることを確認する

つまりHTTPSでは、

ブラウザ ⇄ Webサーバ

双方向の通信が保護されます。

これは通信を暗号化して安全に行うための仕組みであり、そのWebサイトの内容の安全性や正確性を保証するものではありません。https://となっていても、フィッシングサイトなど危険なサイトである可能性があります。

電子証明書

HTTPSでは通常、Webサーバが電子証明書を提示します。

電子証明書には、ドメイン名などの情報と公開鍵に関する情報が含まれており、ブラウザは認証局などによる署名を検証することで、接続先の確認に利用します。

そのため、

HTTPS = 単にデータを暗号化するだけ

ではありません。サーバの認証、通信内容の機密性、改ざんの検出などを組み合わせて、安全な通信路を作る仕組みです。

なお、現在でも「SSL/TLS」という表現が使われることがありますが、SSLは古い方式であり、現在実際に利用されるのはTLSです。

デジタル署名

デジタル署名は、メッセージが署名者(送信者)のものであり、改ざんされていないことを確認する技術です。真正性、完全性の確認に加え、署名者が後になってメッセージを否定することを防ぐ否認防止にも関係します。

一つの方法のモデルとして、次のように行います。

  1. 署名者は、元のデータからハッシュ値を計算し、署名者の秘密鍵で変換する(署名する)

  2. 元のデータと署名を送信する

  3. 受信者は、受信したデータからハッシュ値を計算する。また、署名者の公開鍵を使って受信した署名を再変換し、この二つの値を比較する(検証する)

これによって、次のことを確認できます。

  • 署名後にデータが変更されていないか(変更されていればハッシュ値が変わる)

  • 署名者が署名したものか(署名者の秘密鍵は署名者しか持っていない)

したがって、デジタル署名は主として完全性や送信元の真正性の確認に利用されます。デジタル署名は、第三者に内容を読ませないための暗号化とは目的が異なります。

古典的な共通鍵暗号方式の代表例

現代のコンピュータで使われる暗号方式とは別に、古くから使われてきた暗号の方法もあります。

  • シーザー暗号:アルファベットを一定数だけずらす。例えば3文字ずらすと、A→D、B→E、…、X→Aとなる

  • 単一換字式暗号:各文字を別の文字に対応させて置き換える。例えばA→Q、B→M、C→Tのような対応表を使う

  • 転置式暗号:文字そのものは変えず、並び順を入れ替える。例えば一定の行列に書き込んで、縦方向に読み出すなどの方法がある

  • スキュタレー暗号:古代スパルタで使われたとされる転置式暗号。細長い革や紙を棒に巻き付けて文字を書き、同じ太さの棒に巻かなければ正しく読みにくくする

公開鍵暗号方式の代表例:RSA暗号

RSA暗号は、公開鍵暗号方式の代表例の一つです。

RSA暗号では、公開鍵として二つの整数の組(N,E)を、秘密鍵として二つの整数の組(N,D)を用意します。

鍵の作成

まず、異なる大きな二つの素数pqを用意し、次のようにNを定めます。

N=pq

次に、p−1q−1の最小公倍数をLとします。ここで、lcmは最小公倍数を表します。

L=lcm(p−1, q−1)

公開鍵に用いる整数Eは、次の条件を満たすように選びます。つまり、ELは互いに素です。

1<E<L
gcd(E,L)=1

続いて、秘密鍵に用いる整数Dを、次の条件を満たすように選びます。これは、EDLで割った余りが1になるようなDを選ぶという意味です。

ED≡1(mod L)

こうして、次の鍵が得られます。

  • 公開鍵:(N,E)
  • 秘密鍵:(N,D)

暗号化と復号

平文は、そのまま文字列として計算するのではなく、0≤M<Nを満たす整数Mとして表されているものとします。

平文Mを暗号化するときは、公開鍵(N,E)を使って、次の計算を行います。

C≡ME(mod N)

ここで、Cが暗号文です。

暗号文Cを復号するときは、秘密鍵(N,D)を使って、次の計算を行います。

M≡CD(mod N)

この計算によって、元の平文Mを得ることができます。

RSA暗号で復号できる数学的な理由

なぜ、C≡ME(mod N)と暗号化したものに対して、CD(mod N)を計算すると元のMに戻るのでしょうか。その背景にあるのが、オイラーの定理カーマイケルの定理です。

オイラーの定理では、正の整数nと、それと互いに素な整数aについて、次の関係が成り立ちます。

aφ(n)≡1(mod n)

ここでφ(n)は、1以上n以下の整数のうち、nと互いに素な整数の個数を表すオイラーのφ関数です。

RSA暗号では、N=pqであり、pqは異なる素数です。1以上N以下の整数のうちNと互いに素でないものは、pの倍数またはqの倍数です。

pの倍数はq個、qの倍数はp個あります。ただし、N=pqは重複して数えられているため、

φ(N)
=N−(p+q−1)
=(p−1)(q−1)

となります。

一方、RSA暗号では、オイラーのφ関数そのものではなく、次のLを利用できます。

L=lcm(p−1,q−1)

これはカーマイケル関数λ(N)の値であり、次のように表せます。

λ(N)=lcm(p−1,q−1)=L

MNが互いに素であれば、カーマイケルの定理によって、

ML≡1(mod N)

が成り立ちます。

秘密鍵Dは、

ED≡1(mod L)

となるように選びました。したがって、ある整数kを使って、

ED=kL+1

と表すことができます。

暗号文を復号すると、次のようになります。

CD
≡(MED
=MED
=MkL+1(mod N)

ここで、

MkL+1=(MLkM

であり、ML≡1(mod N)なので、

(MLkM
≡1kM
≡M(mod N)

となります。したがって、

CD≡M(mod N)

となり、元の平文Mを復元できます。

ここまでの説明では、MNが互いに素である場合を扱いました。MNが互いに素でない場合でも、pを法とした場合とqを法とした場合をそれぞれ考えることで、

MED≡M(mod p)
MED≡M(mod q)

が成り立つことを示せます。

pqは互いに素であるため、中国剰余定理から、

MED≡M(mod pq)
すなわち、MED≡M(mod N)

となります。このため、0≤M<Nのどの平文についても、秘密鍵による復号によって元の平文を得ることができます。

RSA暗号の安全性

公開鍵(N,E)は誰にでも公開できますが、秘密鍵Dは公開しません。

秘密鍵を求めるには、L=lcm(p−1,q−1)などに関する情報が必要です。そのためには、Nを構成する大きな素数pqを知ることが重要になります。

しかし、十分に大きな二つの素数の積として作られたNから、その素因数pqを求めることは、現在知られている古典的なコンピュータ上の方法では非常に困難です。

RSA暗号は、このような計算上の困難さを利用した公開鍵暗号方式です。

EXAMPLE

例題

暗号化 · EXAMPLE応用情報技術者H22秋期午前 問40(改題)

公開鍵暗号方式を使って、受信者だけが内容を読めるようにメッセージを送る。鍵の使い方として最も適当なものはどれか。

  1. 0

    送信者の公開鍵で暗号化し、受信者の公開鍵で復号する

  2. 1

    受信者の公開鍵で暗号化し、受信者の秘密鍵で復号する

  3. 2

    認証局の公開鍵で暗号化し、送信者の秘密鍵で復号する

  4. 3

    公開鍵と秘密鍵を同じ値にして、どちらでも暗号化と復号ができるようにする

解答・解説を確認

正解1.受信者の公開鍵で暗号化し、受信者の秘密鍵で復号する

解説

公開鍵暗号方式で秘匿したいときは、受信者の公開鍵で暗号化し、対応する受信者の秘密鍵で復号します。秘密鍵を持つ受信者だけが読めます。

出典
応用情報技術者H22秋期午前 問40(改題)

PRACTICE

暗号化の問題に挑戦