共有キー暗号方式のアルゴリズムでは、単一の共有キーを使用したデータの暗号化と復号化が行われます。キーを取得した人はだれでもデータを復号化したり、独自のデータを暗号化したりできるため、承認されていないエージェントがアクセスしてデータの作成者になりすますことができないように、キーを保護する必要があります。
共有キー暗号方式は対称暗号化方式とも呼ばれます。これは、暗号化と復号化で同じキーが使用されるためです。共有キー暗号化アルゴリズムは (公開キー アルゴリズムと比較して) 非常に高速であり、大量のデータ ストリームに対して暗号変換を実行する場合に適しています。RSA などの非対称暗号化アルゴリズムは、暗号化できるデータ量に数学的に制限があります。通常、対称暗号化アルゴリズムではこれらの問題は発生しません。
データをブロック単位で暗号化するときには、ブロック暗号と呼ばれる共有キー アルゴリズムの種類が使用されます。DES (Data Encryption Standard)、TripleDES、AES (Advanced Encryption Standard) などのブロック暗号では、n バイトの入力ブロックが、暗号化されたバイト数の出力ブロックに変換されます。バイト シーケンスを暗号化または復号化する場合は、ブロック単位で行う必要があります。n は小さいため (DES および TripleDES では 8 バイト、AES では 16 バイト (既定)、24 バイト、または 32 バイト)、n よりも大きいデータ値は 1 ブロックずつ暗号化する必要があります。n よりも小さいデータ値を処理するためには、n に拡張する必要があります。
ブロック暗号の 1 つに、ECB (Electronic Codebook) モードと呼ばれる単純な形式があります。ECB モードは、初期化ベクタを使用して最初の平文ブロックを初期化しないため、安全とは見なされません。共有キーを k とする場合、初期化ベクタを使用しない単純なブロック暗号では、同じ平文の入力ブロックは同じ暗号文の出力ブロックに暗号化されます。したがって、入力平文ストリーム内に重複するブロックがある場合、暗号文ストリームにも重複するブロックが生成されることになります。このような重複する出力ブロックが存在すると、アルゴリズムで弱い暗号化が使用されていて、攻撃が可能なモードであることが、承認されていないユーザーにわかります。このため、ECB 暗号モードは分析に対してきわめて脆弱で、最終的にキーが検出されます。
基本クラス ライブラリに用意されているブロック暗号クラスでは、暗号ブロック チェイン (CBC: Cipher Block Chaining) と呼ばれる既定のチェイン モードが使用されます。ただし、この既定のモードは必要に応じて変更できます。
CBC 暗号は、初期化ベクタ (IV: Initialization Vector) を使用して平文の最初のブロックを暗号化することにより、ECB 暗号に関連する問題を回避します。平文の後続の各ブロックは、前の暗号文ブロックを使用してビットごとの排他的 OR (XOR) 演算を実行してから、暗号化されます。このため、各平文ブロックは、前のすべてのブロックに依存します。このシステムを使用した場合は、承認されていないユーザーが共通メッセージ ヘッダーを知っていたとしても、その情報からキーをリバース エンジニアリングすることはできません。
CBC 暗号によって暗号化されたデータを解読する 1 つの方法は、考えられるすべてのキーを徹底的に探索することです。ただし、暗号化の実行時に使用したキーのサイズによっては、どれほど高速なコンピュータを使用してもかなりの時間がかかるため、この探索方法は現実的ではありません。キーのサイズを大きくするほど、復号化は困難になります。暗号化することにより、暗号データの復号化が理論的に不可能になるわけではありませんが、復号化にかかるコストを大きくできます。3 か月をかけて徹底的な探索を行っても、取得されたデータが数日間しか意味を持たないとすると、その探索方法は実用的とはいえません。
共有キー暗号方式の弱点は、両者のキーと IV を一致させ、それぞれの値を転送しておく必要がある点です。IV は秘密情報とは見なされないため、平文のメッセージで転送できます。しかし、キーは承認されていないユーザーから保護する必要があります。このような問題のため、共有キー暗号方式は公開キー暗号方式と併用されることがよくあります。公開キー暗号方式は、キーと IV の値を秘密に通信するために使用されます。
安全でないチャネルを経由して Alice と Bob が通信しようとしている場合は、次のように共有キー暗号方式を使用することが考えられます。Alice と Bob は、特定の 1 つのアルゴリズム (たとえば AES) と、特定のキーおよび IV を使用することに合意します。Alice はメッセージを作成し、メッセージを送信するためのネットワーク ストリーム (名前付きパイプやネットワーク電子メールが考えられます) を作成します。次に、キーと IV を使用してテキストを暗号化し、暗号化されたメッセージと IV をインターネット経由で Bob に送信します。暗号化されたテキストを受信した Bob は、IV とあらかじめ決めてあるキーを使用して復号化を行います。通信が傍受されたとしても、傍受した人にはキーがわからないため、元のメッセージが復元されることはありません。このシナリオでは、秘密にしておく必要があるのはキーだけです。実際のシナリオでは、Alice または Bob のどちらかが共有キーを生成し、公開キー (非対称) 暗号方式を使用して相手に共有 (対称) キーを転送することになります。公開キー暗号方式の詳細については、次のセクションを参照してください。
.NET Framework には、共有キー暗号化アルゴリズムを実装する次のクラスが用意されています。