Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

上記の暗号化アルゴリズムの

などのポイント解説と、

.NETのライブラリとして提供されている「暗号化アルゴリズム」を纏める。

参考

暗号についての概要や体系や、各種の「暗号化アルゴリズム」の詳細については、
説明しないので、これについては、下記のサイトや、他の情報源を参照のこと。

なお、各種の「暗号化アルゴリズム」の「安全性」の問題については、
日々、調査・研究が進められていため、NIST やCRYPTREC などから
公にアナウンスされる情報源を確認のこと。

ハッシュ化

ハッシュ化とは、「暗号学的ハッシュ関数」を用いて指定のメッセージのハッシュ値を求める行為である。

また、「暗号学的ハッシュ関数」には、次のようなことが求められているため、
既成の「暗号学的ハッシュ関数」を使用した場合、これらは満たされているものとして利用できる。

暗号学的ハッシュ関数

暗号学的ハッシュ関数

情報セキュリティ分野で

など、様々に利用されている。

また、通常のハッシュ関数としても利用でき、

などの用途にも利用されている 。

暗号学的ハッシュ関数の安全性

キーなし方式・あり方式

「暗号学的ハッシュ関数」には、

「暗号学的ハッシュ関数」自体は不可逆であるものの、
「キーなし方式」の場合、辞書攻撃 により、容易にメッセージが割れる可能性がある。
このため、辞書攻撃を防ぐ場合、「キーあり方式」を採用する。

衝突耐性

「暗号学的ハッシュ関数」を使用する際は、
最新の「ハッシュの衝突耐性」の情報を入手する事が推奨される。
これは、例えば、2010/5現在、MD5、SHA-0、SHA-1について
「強衝突耐性」が突破される脆弱性が発見されているためである。

ただし、「強衝突耐性」が突破されても、直ちに、これらの「暗号学的ハッシュ関数」を用いている
暗号化通信が盗聴・改竄されたり、電子署名の有効性が無くなったりすると言うわけではない。
これは、将来的な「弱衝突耐性」の突破を示唆し、「弱衝突耐性」が突破された場合は、
暗号化通信や電子署名の無改竄性を証明できなくなる。

.NETにて提供されている「暗号学的ハッシュ関数」のプロバイダ

.NETの署名・暗号化アルゴリズム」も参考になります。

キーなし方式

基本クラス = HashAlgorithm?クラス

キーあり方式

基本クラス = KeyedHashAlgorithm?クラス

参考

ハッシュ値

「メッセージ ダイジェスト」、あるいは単に「ダイジェスト」と呼ぶことがある。
認証アルゴリズムの「ダイジェスト認証」や、「チャレンジ&レスポンス認証」で使用されている。

目的によってはハッシュ値のことを「フィンガープリント」、「チェックサム」とも呼ぶ。

辞書攻撃

あらかじめメッセージ(例えば、ここでは、メッセージ = パスワードとする)として
利用され易いキーワードを、暗号化プロバイダ毎にハッシュ化し、ハッシュ値をDBに格納しておく。
次に入手したパスワードのハッシュを、このDB上で検索すると、元のパスワードを引く事が出来る。

暗号化

暗号化の方式には、大きく分けて、

の2つの方式がある。

以下の表に「秘密鍵・暗号化方式」と、「公開鍵・暗号化方式」との比較を示す。

なお、両者のメリット・デメリットを考慮し、両者を組み合わせたハイブリッドの方式もある。
これについては、「ハイブリッド・暗号化方式」の項にて説明する。

暗号化方式の比較

秘密鍵・暗号化

.NETにて提供されている「秘密鍵・暗号化方式」のプロバイダ

公開鍵・暗号化

以下の図に、その処理方式の概要図を示す。

公開鍵・暗号化方式

処理シーケンスは次のようになる。

  1. 送信側は、「受信側の公開鍵」を取得する。
  2. 送信側は、平文を「受信側の公開鍵」で暗号化する。
  3. 上記、暗号化された平文を送付する。
  4. 受信側は、平文を、「受信側の秘密鍵」で復号化する。

.NETにて提供されている「公開鍵・暗号化方式」のプロバイダ

.NETにて提供されるRSACryptoServiceProvider?を使用した場合、

なお、リプレイ攻撃とは、ユーザがログインするときにネットワークを流れる電文を盗聴し、
これを自分の送信する電文として利用することでシステムへ不正にログインしようとする行為を指す。

ハイブリッド・暗号化

両者のメリットとデメリットを考慮し、
組み合わせた「ハイブリッド・暗号化方式」もある。

以下の図に、その処理方式の概要図を示す。

ハイブリッド・暗号化方式

処理シーケンスは次のようになる。

  1. 送信側は、「受信側の公開鍵」を取得する。
  2. 送信側は、「送信側の秘密(共通)鍵」を、「受信側の公開鍵」で暗号化する。
  3. 上記、暗号化された「送信側の秘密(共通)鍵」を送付する。
  4. 受信側は、「送信側の秘密(共通)鍵」を、「受信側の秘密鍵」で復号化する。
  5. 送信側は、平文を「送信側の秘密(共通)鍵」で暗号化する。
  6. 上記、暗号化された平文を送付する。
  7. 受信側は、平文を、「送信側の秘密(共通)鍵」で復号化する。

※「秘密鍵・暗号化方式」と「公開鍵・暗号化方式」の鍵を区別しやすくするように、
ここでは、「秘密鍵・暗号化方式」の秘密鍵を、秘密(共通)鍵と記述した。

「公開鍵・暗号化方式」で「送信側の秘密(共通)鍵」を共有し、
平文自体は速度の速い「秘密鍵・暗号化方式」で暗号化・復号化するため、
「安全性」を落とさずに、処理速度を稼ぐことができる。

また、「送信側の秘密(共通)鍵」(セッション鍵)をセッション毎に変更すれば、
万一共通鍵での暗号部分が解読されても短い時間しかクラッキングできなくなる。

なお、SSL暗号化なども、この「ハイブリッド・暗号化方式」を採用している。

デジタル署名

概要

「デジタル署名」は、元となるメッセージのハッシュを秘密鍵で暗号化したものである。

送信元が、この「デジタル署名」を、元となるメッセージと同梱して送付することにより、
送信先は、元となるメッセージの正当性を(= 改ざんされていない事を)検証できる。

以下の図に「デジタル署名」の処理方式の概要図を示す。

デジタル署名

処理シーケンスは次のようになる。

  1. 送信側は、「メッセージ」から「メッセージのハッシュ」を求め、
    これを「送信側の秘密鍵」で暗号化することで、「デジタル署名」を生成する。
  2. 送信側は、「メッセージ」、「デジタル署名」を送付する。
  3. 受信側は、「デジタル署名」を、「送信側の公開鍵」を使用して、
    復号化することで、「メッセージのハッシュ」を求め、メッセージを検証する。

このことから、「デジタル署名」は、
「公開鍵・暗号化方式」とは逆の「非対称アルゴリズム」を
使用していることが分かる(秘密鍵で暗号化し、公開鍵で復号化)。

.NETにて提供されている「デジタル署名」のプロバイダ

「デジタル署名」では、秘密鍵・公開鍵のキー・ペアを、
下記のプロバイダを使用して生成する必要がある。

デジタル証明書

デジタル証明書」の検証は、「送信側の公開鍵」を拠り所にしていると言えるが、提供される「送信側の公開鍵」の出所が、正規の出所か、検証できない(場合がある)という問題がある。
このため、この問題を解決するための、「認証局」と呼ばれる、信頼のおける第三者が発行した「デジタル証明書」を使用して「送信側の公開鍵」が信頼できるものであるかを検証する機構がある。

Open棟梁の暗号化クラスを使用したサンプル・コード


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS