トップ > 付録 >
OpenVPNの暗号化と復号ついて

  

共通鍵方式と公開鍵方式での暗号化について

OpenVPNはSSL-VPN方式のVPNであり、SSL(TLS)の仕組みを使って暗号化通信を行っています。

SSL(TLS)では、共通鍵方式と公開鍵方式の両方を使って暗号化を行います。

共通鍵方式とは

共通鍵方式とはビット演算によって暗号化/復号を行う暗号方式です。 入力されたパスワードをビット列に変換し、そのビット列で排他的論理和(XOR)を行うことで暗号化されます。

暗号化された結果に再度同じビット列で排他的論理和を行うことで復号を行うことができます。

つまり、同じパスワードで暗号化も復号も行うことができます

演算 結果
0 XOR 0 → 0
0 XOR 1 → 1
1 XOR 0 → 1
1 XOR 1 → 0

上記のように排他的論理和は論理和に近いですが、1 と 1 を排他的論理和すると 0 になるという点が異なります。

  
排他的論理和の結果に、再度同じビット列で排他的論理和を行うと元に戻るという特性を利用した暗号化技術です。

例えば、入力データが、

  • (A) 01001101

で、パスワードから求めたビット列が、

  • (B) 01010101

の場合、暗号化後のデータは、

  • (C) 00011000

となります。

(A) 0 1 0 0 1 1 0 1
XOR
(B) 0 1 0 1 0 1 0 1
(C) 0 0 0 1 1 0 0 0

暗号化後のビット列である、

  • (C) 00011000

に、再度、パスワードから求めたビット列である、

  • (B) 01010101

を使用して、排他的論理和の演算を行うと、

  • (A) 01001101

に戻ります。

(C) 0 0 0 1 1 0 0 0
XOR
(B) 0 1 0 1 0 1 0 1
(A) 0 1 0 0 1 1 0 1
  
共通鍵方式の欠点は、鍵(パスワード)を他人に知られてはいけないという点です。 鍵が知られてしまうとその鍵で暗号化した全ての情報が解読されてしまうためです。 つまり、暗号化されていない経路には共通鍵の情報は流せないということになります。
  
OpenVPNでは、公開鍵方式で安全な経路を確立した後に共通鍵を交換して暗号化/復号を行っています。
  
実際の共通鍵方式での暗号化はもっと複雑です。 ビットを入れ替える転置などの処理も行われます。

公開鍵方式とは

公開鍵方式とはメールの暗号化やHTTPSで利用される暗号方式で、インターネット等の盗聴の危険性のある経路で情報を送受信する際に利用されます。 身近なところでは、インターネット上のショッピングサイトでクレジットカード番号を入力する際に使用されます。

公開鍵方式では、秘密鍵と公開鍵の鍵ペアによって暗号化/復号が行われます。 秘密鍵は2つの素数を含み、公開鍵は秘密鍵の2つの素数をかけた値を持ちます。

ネットワーク上には秘密鍵は決して流さず、通信相手には公開鍵のみを通知します

通信相手は公開鍵を使って暗号化を行い、データを送信します。 受け取った側は秘密鍵に含まれる2つの素数から復号します。

復号には秘密鍵に含まれている2つの素数が必要なため公開鍵が盗聴されても機密は保たれます。

例えば、秘密鍵の素数(pとq)が5と11、公開鍵の素数(n)が55の場合、2つの素数(5と11)のそれぞれから-1した値の最小公倍数(L)を求めます。

  1. L = 20 (4と10の最小公倍数)

次に、Lより小さくLと互いに素(最大公約数が1)の数(e)を決定します。

  1. e = 3

求めたeの値から公開鍵は以下になります。

  1. 公開鍵(n, e) = 55, 3

上の公開鍵はインターネットを経由して通信相手に渡されます。 通信相手は、

  1. (平文^e) % n

で暗号化を行います。

  
式中の^はべき乗を、%は剰余を表しています。

例えば、8 7 4 を暗号化すると、

  1. (8^3) % 55 → 17
  2. (7^3) % 55 → 13
  3. (4^3) % 55 → 9

となります。 これを復号するには、まず、eを掛けてLで割った余りが1となる、1より大きくLより小さい数(d)を求めます。

  1. d = 7

求めたdから、

  1. (暗号文^d) % n

で復号します。 暗号化された 17 13 9 を復号すると、

  1. (17^7) % 55 → 8
  2. (13^7) % 55 → 7
  3. (9^7) % 55 → 4

となり、元に戻すことができます。

  
公開鍵方式の欠点は、公開鍵に含まれている素数を素因数分解されると暗号を解読されてしまう点です。 今回の例では、55を5と11に素因数分解されると、dを求めることができ、暗号を解読されてしまいます。
  
  

SSL(TLS)での実際の流れ

SSL(TLS)での実際の暗号化通信の流れは以下のようになります。

  1. クライアントからサーバへ接続要求が送られる
  2. サーバはクライアントへサーバの証明書(*1)を送る
  3. クライアントは共通鍵を生成しサーバの公開鍵で暗号化してサーバへ送る(*2)
  4. 共通鍵で暗号通信を行う
*1

サーバの証明書とは認証局によって署名されたサーバの公開鍵のこと。

*2

実際には共通鍵が通信によって送受信されることはない

*2

共通鍵はDH鍵交換方式によってサーバとクライアントの双方で生成される

メニュー