はじめに
仮想通貨(暗号通貨)は、ご存知の通り英語に直すとCryptocurrencyです。"Crypto"と頭についている通り、その実現にはいくつもの暗号技術が使われています。暗号通貨を実現せしめるテクノロジーは、もちろん暗号技術だけに限りません。しかし、暗号技術が暗号通貨の根幹を支える重要なテクノロジーの一つであることは間違いありません。
例えば、ビットコインにおいて送受信先となる「アドレス」や、ブロックチェーン上に記録されているアドレスにあるコインを動かす唯一の権利である「秘密鍵」は暗号技術の産物と言えます。
暗号技術によってもたらされる核心となるメリットは「情報の秘匿」でしょう。一般には通信内容の秘匿に使用され、こと暗号通貨においては例えば送受信先に利用することによって通信者の秘匿(=匿名性)等を担保しようとしています。
しかし、暗号通貨の将来性に期待し、さらには各通貨のホワイトペーパーを読むような人たちであっても、そこで述べられている暗号技術が一体どのようなものであるかを理解していることはあまりないのではないでしょうか。
暗号技術のメリットを理解することは"暗号通貨全体"の根底にあるコンセプトを理解する上で重要ですが、一歩踏み込んで暗号技術を具体的に知ることは"その通貨の単位"でコンセプトと仕組みを理解する上で大切です。これができれば、将来性のある通貨とない通貨を見分ける判断の一助となりえるでしょう。
今回の暗号化のお勉強シリーズでは、「暗号技術の違いが概念的に分かる程度に具体的に知ること」を目標に、初歩的なところから始めて、いくつかのテクノロジーを取り上げて理解を深めていきたいと思います。
スポンサードサーチ
暗号化とは
暗号化とは、平文をある規則に基づいて暗号文に変換することを指します。この"ある規則"を暗号アルゴリズムと言います。また、暗号文を平文に戻すことを復号と言います。一般に、復号には鍵が必要となります。
通信内容は第三者に傍受・盗聴される恐れがあります。傍受・盗聴されても差し支えない情報ならばよいのですが、そうでない情報もあります。第三者に傍受・盗聴される可能性のある環境にあって、仮に傍受・盗聴された場合でも第三者が元の情報を容易に分からないようにする技術が暗号化です。
~最低限押さえておきたい用語~
- 平文(plain text):暗号化される前の文。元データ。
- 暗号文(cipher text):平文を暗号アルゴリズムに基づいて変換したデータ。
- 暗号アルゴリズム(cryptographic algorithm):平文を暗号文にするための変換規則(計算手順)。
- 鍵(key):暗号化、または復号に際して変換に用いるデータ。
- 暗号化(encryption):暗号アルゴリズムに従って、鍵を使って平文を暗号文に変換する作業。
- 復号(decryption):暗号アルゴリズムに従って、鍵を使って暗号文を平文に変換する作業。
暗号アルゴリズムの大まかな分類
共通鍵暗号方式
暗号化と復号に用いる鍵が同一である暗号方式です。対称暗号、秘密鍵暗号方式とも言われます。
共通鍵暗号方式による手順を大まかに書くと次のようになります。
- 共通鍵を生成する。
- 共通鍵を通信相手に配布する。
- 送信者は、平文を共通鍵で暗号化し、受信者へ暗号文を送信する。
- 受信者は、受け取った暗号文を共通鍵で復号する。
共通鍵暗号方式は、後述する公開鍵暗号方式に比べて一般に処理速度は速いと言われています(もちろん、アルゴリズムの種類、実装方法、処理環境などで速度は変化しますので一般的な記述に留めます)。
一方で、大きく2つの欠点があります。
一つ目は鍵配送問題と言われるものです。鍵が第三者に渡ってしまえば平文も分かってしまうので、予め安全に鍵を共有しなければなりません。相手に秘匿情報を送信したいのに、そのための鍵を第三者に漏れないように予め相手に共有しておかなければならないという困難さがあります。
鍵が漏洩した場合は使えなくなってしまうので、かつては秘匿して特使を使って相手先に運搬するような物理的な方法が取られていました。これには、運搬するためのコストや相手先に届くまでの物理的なコストがかかってしまいます。
二つ目は、鍵の管理の問題です。当然共通鍵は使い回すことはできませんから、情報を秘匿してやり取りを行いたい相手の数だけ共通鍵を作成する必要があります。1つならまだしも、複数の鍵を安全に管理するのは容易ではありません。
公開鍵暗号方式
暗号化に使う鍵と復号に使う鍵が異なる暗号方式です。非対称暗号とも言います。
暗号化に使う鍵を公開鍵と言い、これは一般に公開してもよい(=漏洩しても差し支えない)鍵です。一方で、復号に使う鍵を秘密鍵と言い、こちらは情報の受け手のみが所有する鍵で、自分以外の誰にも知られてはなりません。
公開鍵暗号方式による手順を大まかに書くと次のようになります。
- 受信者は、鍵ペア(秘密鍵と公開鍵のペア)を作成する。
- 受信者は、公開鍵を送信者に配布する。
- 送信者は、平文を取得した公開鍵で暗号化し、受信者へ暗号文を送信する。
- 受信者は、受け取った暗号文を秘密鍵で復号する。
公開鍵暗号方式は、共通鍵暗号方式で大きな問題となっていた「鍵配送問題」を解決している点がメリットです。復号に必要となる秘密鍵は自分だけのところにあるので、何らかの方法で秘密鍵が漏洩しない限り、自分以外の誰にも平文は分かりません。
また、自身が管理しなくてはならない秘密鍵が通信相手の数に関わらず1つだけでよい点もメリットと言えるでしょう。
一方で、共通鍵暗号方式と比べて複雑な演算を必要とすることから処理速度が遅くなりがちという欠点もあります。
(参考)ワンタイムパッド
平文と同じ長さの乱数を1度のみ使用して暗号化する方式です。正しく運用された場合に限り、解読不能であることが証明されています。
真にランダムでない乱数(疑似乱数)を使用していたり、乱数を使いまわしている場合、解読される可能性があります(解読の例としてVenona Projectがある)。また、乱数列が予め安全に配布されている必要がありますが、これを実現することも困難を伴います。
解読不能とされる理由は、解読の過程で複数の意味のある文章が出てきてしまい、平文が何であるのかを一意に定めることができないからです。
column~暗号化とハッシュ化の違い~
暗号化とハッシュ化は混同されるきらいがあります。例えば、次のような点で両者は似ていると言えるでしょう。
- どちらも、元のデータに何らかの処理を行って別のデータに置換している
- どちらも、処理後のデータを入手してもそれ単体では理解できない
- どちらも、セキュリティ分野で利用されている
- どちらも、攻撃によって元のデータが割り出される場合がある
しかし、両者の間には次のような違いがあります。
- 可逆か不可逆かの違い
暗号化は鍵により元データに復号することが可能です。つまり、可逆です。
一方、ハッシュ化は一方向関数により元データを固定長のハッシュ値にしますが、ハッシュ値を元データに戻すことは不可能です。つまり、不可逆です。
ハッシュ化は不可逆なのにどうして元のデータが割り出される場合があるのか、という点が疑問に映りますが、これは予め「任意の文字列」とそれをハッシュ関数によって演算した「ハッシュ値」のセットをデータベースとして所有しておき(参考:レインボーテーブル)、そこに検索をかけることによって見つかる可能性があるのであり、ハッシュ値から演算によって元のデータを割り出しているわけではありません。
(なお、必要な計算量をこなすのにかかる時間を度外視するのであれば、ワンタイムパッドを除く暗号化とハッシュ化後のデータは、どちらも総当たり攻撃により原理的に解読されてしまいます。) - 目的・用途の違い
暗号化は情報の秘匿を目的としています。当然、「元に戻す必要がある」場合に用いられます。通信はその一例と言えるでしょう。
一方、ハッシュ化はデータの置換自体を目的としています。これは「元に戻す必要がないか、元に戻してはいけない」場合に用いられます。身近なところではウェブサービスによるパスワードの保存に用いられています。また、マルウェアのハッシュを登録しておき、アンチウイルスソフトで検出した怪しいファイルのハッシュと照合することでウィルスを検出することなどに用いられています。