Welcome to Our Website

暗号化101:対称暗号化

この暗号の基礎に関する3部シリーズの最初の投稿です。 シリーズは次のように概説されています。

  1. 対称暗号化
  2. データ整合性&認証された暗号化
  3. 公開/秘密キーペアによる非対称暗号化

コンピュータサイエンスの世界に飛び込むことは困難な作業になる可能性があります。 特に一人で!, このブログシリーズでは、必ずしもどこから始めるべきかわからないトピックをさらに掘り下げようとしている人のために、暗号の基本に関する高 この概要は、Courseraで利用可能なDan Bonehによって教えられたStanfordのCryptography Iコースからの私の主なテイクアウトに特に基づいています。

私は伝統的なcomp-sciの背景から来ていないブロックチェーン開発者であるため、このコースを受講することにしました。 私は大学で経済学を学んだが、私は私のキャリアを始めたとして、コンピュータプログラミン, 私がコーディングを始めて以来、私は”コンピュータに近づく”ことを使命にしてきました—私はweb開発者として楽しんだ抽象化の層を剥がし、フードの下で何が起こっているのかを理解するために。 ウェブ開発からcryptocurrencyと分散システムに移行することは、多くの点でその方向への野生で素晴らしいステップでしたが、少なくともそのうちの暗号の概念にもっと慣れてきました。 しかし、私はより強固な基盤を望んでいました。, それは非常に広大なフィールドだから、私はそれが特別にスタンフォード大学からキュレーションフォーラムでこの情報を消費するために$70をドロップ また、無料で課題を渡すことなく、このコースを監査することができます。 インターネットの不思議!

始めましょう。

基本的に、暗号化は、潜在的な第三者の敵の存在下での安全な通信の実践です。 安全な通信の概念は、2つの主要なポイントで構成されています:

  1. 盗聴に対するセキュリティ:これは、データの機密性を保証します。,
  2. データ操作に対するセキュリティ:これにより、誰もあなたが送信したデータを操作し、操作されたデータを有効として受け入れるように受信者を欺くこと

データの機密性は暗号化によって達成されます。

  • 対称暗号化では、通信しているすべての参加者の間で共有する必要がある単一のキーを使用します。
  • 非対称暗号化では、個人キーを使用します。, 各参加者は、通信時にメッセージを暗号化および復号化するための独自の公開鍵と秘密鍵のペアを持っています。

(注:このブログ記事では、対称暗号化の文脈での暗号化について説明します。 フォローアップ記事では、非対称暗号化について説明します。)

データ暗号化:暗号の二つのタイプ

暗号化は、データの機密性を保証し、二つの重要なコンポーネントを含みます:

  1. 秘密鍵:対称暗号化のコンテキストでは、我々は、私たちの参加者、アリスとボブは、共有秘密鍵を持っていると仮定することができます。,
  2. 暗号:アルゴリズムのセット、暗号化のためのものと復号化のためのもの。

暗号化および復号化アルゴリズムは公に知られていることに注意することが重要です。 秘密にされている唯一のものは鍵です。

ストリーム暗号とブロック暗号の二つのタイプの暗号です。 これらの暗号の両方を適切に理解するための潜在的な前提条件は、ビットごとの演算(ビットに対して実行される演算)の知識です。 より具体的には、排他的論理和(xor)の概念である。 私はビット単位の操作の非常に明確な説明を与えるためにこのblogpostを見つけました。, または、下の図を使用してXORの概念を理解しようとすることもできます。 基本的に二つのビットが組み合わされ、それらが異なる場合(一つの0と1)、それらが同じ場合(両方の0または両方の1)、それらは0になります。 ここから、読者がXORの概念を理解しており、XORの普遍的な表記法は次のとおりであると仮定します。⊕

Stream Cipher

ストリーム暗号は対称鍵暗号であり、平文(バイト形式)は暗号化された暗号文を生成するための鍵(バイト形式)でビットごとにXORされます。, 同じプロセスが暗号文を復号化するために使用されます。 XOR操作の性質を考えると、暗号文を鍵でXORすると、元の平文に戻ります。

抜け目のない読者はこの説明から実現するかもしれませんキー(上記の図では”cipher stream”としてラベル付けされています)と平文は、共通して非常に重要なものを持っている必要があります。 そうだ! キーと平文は同じ長さでなければなりません。, もちろん、これは非常に実用的ではありません。

ストリーム暗号をより実用的にするために、擬似乱数生成器のアイデアが導入されています。 擬似乱数ジェネレータは、入力を受け取り、さらに長い擬似乱数結果を出力する決定論的手順です。 決定論的手順であることは、同じ入力が与えられた場合、常に同じ正確な出力を返すことを意味します(つまり、”abc123″は毎回”8474f24e0d72e1b949ffd2…”になり, Pseudorandomという言葉は、出力が実際にはランダムではないが(特定の入力に基づいて決定されるため)、実際には真にランダムな文字列と区別できないことを 言い換えれば、入力と出力のサンプルが与えられると、どの出力が特定の入力に対応するかについての手がかりがなく、その逆もまた同様であるため、 共有秘密鍵を入力として使用して、さらに長い擬似乱数鍵を生成して、同じように長い平文でXORされる長い鍵として機能することが可能です。,

これまでに説明したストリーム暗号のこの特定の実装は、”ワンタイムパッド”と呼ばれています。 ワンタイムパッドの非常に重要な特徴は、ワンタイムパッドキーが一度だけ使用できることです。 もう一度使用すると、これらのメッセージのセキュリティが侵害されます。

下の写真はコースからのスライドです。 PRG(K)は、共有鍵Kから生成された擬似乱数列を示します。 cは暗号文を示します。 mはメッセージ(または平文)を示します。,

基本的に、このスライドはciphertextsを一緒にxorすることができ、それは二つの平文を一緒にxor’ingすることとまったく同じです。 英語には十分な冗長性があるため、精通した攻撃者はこの情報を使用してメッセージを完全に回復することができます。

一つの共有秘密鍵を維持するために、nonceの概念を使用して、ワンタイムパッド鍵を繰り返さないようにすることができます。, ノンスは、暗号通信で一度だけ使用できる任意の数です。 暗号文を送信するとき、送信者は、秘密鍵と組み合わせるためにノンスを送信して、暗号化ごとに別個の擬似乱数鍵を生成するための入力として使用

(上のスライドにAttack1と書かれていることに気づいたかもしれません。, 余談ですが、攻撃2が何であるか疑問に思っている人のために、攻撃2は、ストリーム暗号はデータの機密性を提供していますが、最初のセクションで定義されているようにデータの整合性を提供していないという事実です)

ブロック暗号

第二のタイプの暗号はブロック暗号です。 ブロック暗号は、固定長入力を受け取り、各ラウンドに対して異なる鍵(”ラウンド鍵”)を使用して平文を何度も繰り返し暗号化し、最終的に同じ長さの暗号文を出力する。 3DESとAESは、それぞれ48ビットと128ビットの入力を取るブロック暗号の二つの例です。,

上のスライドは、ブロック暗号の基本的なアーキテクチャを示しています—– できるキーの拡張機構を採用しており、新しいキーを毎きます。 メッセージに対して(m)と表記される平文は、最終的に同じ長さの対応する暗号文(c)が返されるまで、何度も何度も暗号化されます。

簡潔にするために、このブログ記事でAESについて説明します。, DES/3DESは歴史的に重要ですが、今日ではAESがより広く使用され、受け入れられています。

AESは置換置換ネットワークとして構築されています。 AESは128ビットブロックで動作し、16バイトに等しい。 左上に描かれているように、16バイトを4×4行列として書き込みます。 この行列は、データのシャッフルに適したデータ構造として機能します。, 各ラウンドでは、プロセスは次のとおりです。

  1. 最初に(k0)ラウンドキーを現在のメッセージでXORします。
  2. 次に、データブロックが与えられた置換テーブルに基づいて他のブロックに置き換えられる置換プロセスを経ます(上の(1)ByteSubの図)。ビットが順列されてシャッフルされる順列レイヤーを通過します(上の写真(2)ShiftRow&(3)MixColumn)。
  3. 次に、このプロセスを10ラウンド繰り返します。,

上の写真では、最後のラウンドはMix列のステップをスキップし、xorは最終的なラウンドキーで結果を出力し、結果の暗号文を出力します。 復号化するために、我々は単にプロセスを逆にするだけです。 このコースでは、この暗号化プロセスの高いレベルの概要を提供し、興味がある場合は、学生がそれをより深く見ることを奨励します。 したがって、私はAESの内部の仕組みをこれに任せます。 私は人々が異なるブロック暗号の比較とコントラストを楽しむために3DESのFiestelネットワーク手順を調べることをお勧めします。,

ハードウェアに関しては、Intel Westmereの発売以来、IntelはAES最適化のための特別な命令をハードウェアに組み込んだプロセッサを設計し、AMDはその後まもなく

ブロック暗号の動作モード

ストリーム暗号とは異なり、ブロック暗号は固定長入力のみを受け取ります。 明らかに、一度に16バイトを超えるデータを処理したいと考えています。 したがって、次に、ブロック暗号を使用して大量のデータセットを暗号化できる操作モードを理解することが重要です。, このブロック暗号を大規模なデータセットに適用するために、最初に思い浮かぶ操作モードは”Electronic Code Book”(ECB)と呼ばれます。 ECBは、データを16バイトのブロックに分割し、AES暗号化を均一に実行します。 それは並行して行うことさえできます。 非常に速い! しかし、実際にはあまり安全ではありません。

16バイトのメッセージが繰り返されると、安全ではありません。暗号文には繰り返されるデータも含まれます。, これにより、当社のデータに関する情報が潜在的な攻撃者に漏れます。 ECBでイメージを暗号化する場合にこの脆弱性を適用することができます。 以下のように、私たちのイメージがヘッドショットであることは明らかです。 大きく黒い領域では、黒い髪とシャツを介してシルエットを見ることができます。

暗号化スキームが意味的に安全であることが重要です。, セマンティックセキュリティとは、二つの異なる平文のいずれかに対応する暗号文がある場合、敵は暗号文が対応する平文の1/2よりも良い確率で推測できないという概念である。 明らかに、ECBは意味的に安全ではありません。 暗号化された画像は、対応するプレーン画像を推測するための多くの情報を提供します。ECBは、ワンタイムキー動作モードの一例です(つまり、ワンタイムパッドのように、キーは一度だけ使用できます)。 もう一つのより安全なワンタイムキー動作モードは、決定論的カウンタモードです。 あなたは自分でそれを調べるのは自由です。, 私は多くの時間のキーを有効にする操作のセキュアモードに移動します!

Cipher Block Chaining(CBC)は、ブロック暗号暗号化(すなわちAES)を実行する前に、前の平文の暗号文を現在の平文にXOR’ingすることによって、平文の各16バイトブロックを 以下の画像は、この概念を明確にしています。

ランダムivで。, IVは初期化ベクトルの略で、反復プロセスを開始するために使用される初期値として定義することができます。 CBCの場合、IVはランダムでなければならない(したがって予測できない)ため、各取引に対して一意でなければならない。 暗号文の残りの部分を生成するために、まず、ランダムIVは平文(m)の最初のブロックとXORされます。 その結果は、暗号化された暗号文(c)の最初のブロックを返すために、丸いキー kで暗号化されます。, その暗号文は次に平文(m)の次のブロックとXOR’dを取得し、結果は丸いキー kで暗号化され、暗号化された暗号文(c)の第二のブロックを返します。 この処理を続けまですべてのブロック暗号化して送信します。

復号化するには、プロセスを逆にします。

CBC暗号化にとって重要な要素は、ランダムIVが予測不可能であることです。, IVが予測可能になると、私たちの暗号化方式は選択された平文攻撃に対して脆弱になります。 選択された平文攻撃(cpa)は、攻撃者が任意の平文に対する暗号文を取得し、これらを使用して暗号化されたメッセージに関する情報を明らかにすることができると仮定する攻撃モデルである。 そのため、予断を許さIVを確実にするために必要な公認会計士ます。

この攻撃がどのように機能するかを説明しようとすると、xorの性質上、予測可能なIVの存在下で選択された平文攻撃を実行することが可能です。, 同じ値を一緒にXORすると(0101≤0101)、常に0に等しくなるため、キャンセルされます。 したがって、観測された暗号文cが特定の平文mに対応していると思われる場合は、予測可能なIVで仮説をテストすることができます。c=E(k,m≤IV1)となるように、問題の平文がIV1で暗号化されている場合は、暗号化される新しい平文を送信し、一致する結果が得られるかどうかを確認できます。c.IVがIV2になると予測できるので、m≤IV1≤IV2を送信します。, CBCプロセスは、この入力を次のIV、IV2でXORし、c=E(k、m≤IV1≤IV2≤IV2)となるようにします。IV2はキャンセルされ、再びe(K、IV1≤m)を暗号化します。Cで再び結果となり、これが発生した場合、以前にIV1で暗号化されたものを推測することができました。

本当に素晴らしい仕事あなたがそれを乗り越えたなら—^

それで、私はこの3部シリーズの最初のブログ記事を終わらせるもう一つのブロック暗号モードを見直したいと思います。 それはここまでそれを作るために大きな努力されている場合は、今継続する前に、迅速な休憩のための良い時間かもしれません!,ECB、CBC、およびその脆弱性をレビューしましたが、最後に、おそらく最も重要なことは、ランダム化カウンタモード(CTR)を導入することです。 これは最新の最も安全な動作モードであり、CBCよりも効率的です。

ランダム化カウンタモードは、ランダムなIVを取りますivはここでは別の目的を果たします。 私たちのキーは結合されます(例:, 上記のIV:反復バージョンでは、反復ごとにIVに1を追加し続けます。 私たちは平文のメッセージと同じくらいパッドがあるまでこれを行います。 ワンタイムパッドストリーム暗号と同じように、平文メッセージを擬似乱数パッドでXORして暗号文になります。 ハードウェアに複数のAESエンジンがある場合、並列化可能であるため、これは非常に効率的です。 CBCでは、各暗号文は以前の暗号文ブロックに依存していたため、並列化することは不可能でした。,

IVとキーを擬似乱数パッドに組み合わせるために、必ずしもブロック暗号を必要とするわけではありません。 ブロック暗号は可逆的である必要があります。 ランダム化されたカウンタモードの仕組みをよく見ると、復号化ではF(k, IV)を逆にする必要はないことがわかります。 XORの性質を考えると、私たちがする必要があるのは、同じ擬似乱数パッドを再生成し、それを暗号文でXORすることだけです。 したがって、復号化するためには、操作を繰り返す必要があり、逆にする必要はありません。,

抽象的に言えば(これまで私は抽象的な概念を避けてきました)、つまり、秘密鍵とIVを組み合わせるために使用する手順F(k, IV)擬似乱数置換(PRP)ではなく、擬似乱数関数(PRF)でなければなりません。 私たちは実際にこのblogpost全体でこれらの概念を適用してきました。 PrpとPrfはどちらも確定的な手順であり、特定の入力が与えられると擬似乱数出力が得られます。 (すなわち、AES、XOR)。 しかし、PRPは可逆的でなければならないという意味でより厳密です。, 実際、PRPとブロック暗号(AESなど)という用語は同義語で使用されることがよくあります。 しかしながら、PRFは可逆的である必要はない。 この記事に表示されている以前のスライドに戻ると、prfとPRPの表記がわかります。

これで対称暗号化の概要は終わりです! ストリーム暗号とブロック暗号について説明しました。 次に、ブロック暗号は一度に約16バイトでしか実行できないため、大きな平文でブロック暗号を実行するために使用される動作モードについて説明し また,Prps対Prfsの概念を明らかにした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です