質問: aes暗号化モードを選択する方法(cbc ecb ctr ocb cfb) どの状況でそれらのどれが好ましいですか?さまざまなモードの評価基準のリストと、各基準の適用可能性についての議論を参照してください。たとえば、暗号化と復号化の「コードのサイズ」が基準の1つであると考えています。これは、802.11ネットワークアダプタなどのマイクロコード組み込みシステムにとって重要です。 cbcの実装に必要なコードがctrに必要なコードよりはるかに小さい場合(これは本当だとはわかりません。これは単なる例です)、小さいコードのモードが優先される理由を理解できます。しかし、私がサーバー上で動作するアプリケーションを作成していて、私が使用しているaesライブラリがとにかくcbcとctrの両方を実装している場合、この基準は無関係です。私が「評価基準のリストと各基準の適用性」とはどういう意味かを見てください。これは実際にはプログラミング関連ではありませんが、アルゴリズム関連です。
回答: 独自の暗号化の実装を回避できない場合は、長くて難しいことを検討してください問題のい真実は、この質問をしている場合、おそらく安全なシステムを設計および実装できないことです。私のポイントを説明しましょう:webアプリケーションを構築していて、セッションデータを保存する必要があるとします。各ユーザーにセッションidを割り当て、セッションidをセッションデータにマッピングするハッシュマップでサーバーにセッションデータを保存できます。しかし、その後、サーバー上でこの厄介な状態に対処する必要があり、ある時点で複数のサーバーが必要になると、事態は面倒になります。そのため、代わりに、セッションデータをクライアント側のcookieに保存するという考えがあります。もちろん、ユーザーがデータを読み取って操作できないように暗号化します。それでは、どのモードを使用する必要がありますか?ここに来ると、一番上の答えが表示されます(myforwikを1つだけ削除して申し訳ありません)。最初の1つ-ecb-はあなたのためではありません、あなたは複数のブロックを暗号化しますxtsと特許はpitaなので、ocbはありません。暗号ライブラリを使用すると、ブロックサイズの倍数しか暗号化できないため、パディングが必要であることがわかります。 pkcs7 を選択します。これは、いくつかの重大な暗号化規格で定義されているためです。 cbcが provably secure である場所を読んだ後、ランダムivおよび安全なブロック暗号を使用すると、クライアント側に機密データを保存していても安心します。 。サービスが実際にかなりの規模に成長した数年後、itセキュリティスペシャリストが責任を持って開示します。彼女は、 padding oracle attack を使用してすべてのcookieを復号化できると言っています。これは、パディングが何らかの理由で壊れている場合、コードでエラーページが生成されるためです。これは架空のシナリオではありません: microsoftは数年前までasp.netにこの正確な欠陥がありました。 問題は、暗号に関して多くの落とし穴があり、素人には安全に見えるが、知識のある攻撃者にとっては簡単に破れるシステムを構築することは非常に簡単です。データを暗号化する必要がある場合の対処方法ライブ接続にはtlsを使用します(証明書と発行者チェーンのホスト名を必ず確認してください)。 tlsを使用できない場合は、システムがタスクに対して提供する必要がある最高レベルのapiを探し、システムが提供する保証と、保証しないものをより重要に理解してください。上記の例では、playのようなフレームワークは client side storage facilities を提供しますが、しばらくすると保存されたデータは無効になりませんただし、クライアント側の状態を変更した場合、攻撃者は気付かずに以前の状態を復元できます。高レベルの抽象化が利用できない場合は、高レベルの暗号化ライブラリを使用します。顕著な例は nacl であり、多くの言語バインディングを備えたポータブルな実装は sodium です。このようなライブラリを使用すると、暗号化モードなどを気にする必要はありませんが、nonceを2回使用しないなど、より高いレベルの抽象化よりも使用の詳細に注意する必要があります。何らかの理由で、たとえば特定の方法で既存のシステムとやり取りする必要があるために、高レベルの暗号ライブラリを使用できない場合、徹底的に自分自身を教育する方法はありません。 ferguson、kono、schneierによる cryptography engineeringを読むことをお勧めします 。必要なバックグラウンドがなくても安全なシステムを構築できると信じ込まないでください。暗号化は非常に微妙であり、システムのセキュリティをテストすることはほとんど不可能です。モードの比較暗号化のみ: パディングが必要なモード:例のように、パディングは一般的に危険です。なぜなら、パディングはoracle攻撃のパディングの可能性を開くからです。最も簡単な防御策は、復号化の前にすべてのメッセージを認証することです。下記参照。 ecbはデータの各ブロックを個別に暗号化し、同じ平文ブロックは同じ暗号文ブロックになります。 ecb wikipediaページ でecb暗号化tuxイメージを見て、なぜこれが深刻な問題なのかを確認してください。 ecbが受け入れられるユースケースは知りません。 cbcはivであるため、メッセージが暗号化されるたびにランダム性が必要です。メッセージの一部を変更するには、変更後にすべてを再暗号化する必要があります。ある暗号文ブロックの送信エラーは、平文を完全に破壊し、次のブロックの復号化を変更します。復号化は並列化できます/暗号化はできません。平文はある程度可鍛性があります- 問題 。 ストリーム暗号モード:これらのモードは、プレーンテキストに依存する場合としない場合があるデータの擬似ランダムストリームを生成します。一般にストリーム暗号と同様に、生成された擬似ランダムストリームはプレーンテキストとxorされて、暗号テキストが生成されます。ランダムストリームのビットを好きなだけ使用できるので、パディングはまったく必要ありません。この単純さの欠点は、暗号化が完全に malleable であるということです。これは、平文p1、暗号文c1に関して、攻撃者が好きな方法で解読を変更できることを意味します。疑似ランダムストリームrと攻撃者は、暗号文c2 =c1⊕dの復号化がp2 =p1⊕dになるように、p2 =c2⊕r=(c1⊕d)⊕r = d⊕( c1⊕r)。また、2つの暗号文c1 =p1⊕rおよびc2 =p2⊕rの場合と同じ疑似ランダムストリームを2回使用してはなりません。攻撃者は2つの平文のxorをc1⊕c2=p1⊕r⊕p2⊕r=として計算できますp1⊕p2。また、元のメッセージが攻撃者によって取得された可能性がある場合、メッセージを変更するには完全な再暗号化が必要であることを意味します。以下のsteam暗号モードはすべて、ブロック暗号の暗号化操作のみを必要とするため、暗号によっては、非常に制限された環境で(シリコンまたはマシンコード)スペースを節約できます。 ctrは単純で、プレーンテキストに依存しない擬似ランダムストリームを作成します。異なるノンス/重複を防ぐために最大メッセージ長を乗算したiv、メッセージごとのランダム性なしでノンスメッセージ暗号化を使用可能、復号化と暗号化は並列化可能、送信エラーは間違ったビットにのみ影響を与える ofbは、プレーンテキストに依存しない疑似ランダムストリームも作成します。メッセージごとに異なるノンスまたはランダムivで開始することにより、異なる疑似ランダムストリームが取得されます。 、暗号化も復号化も並列化できません。ノンスメッセージ暗号化を使用したctrでは、メッセージごとのランダム性がなくても、ctr送信エラーは間違ったビットにのみ影響し、 cfbの擬似ランダムストリームはプレーンテキストに依存し、ctrやofbでノンスを使用する場合と同様に、すべてのメッセージに異なるナンスまたはランダムivが必要ですメッセージの暗号化は、メッセージごとのランダム性なしで可能であり、復号化は並列化可能/暗号化は不可能であり、伝送エラーは次のブロックを完全に破壊しますが、現在のブロックの誤ったビットのみに影響します ディスク暗号化モード :これらのモードは、ファイルシステム抽象化の下でデータを暗号化するために特化されています。効率上の理由から、ディスク上の一部のデータを変更するには、最大で1つのディスクブロック(512バイトまたは4kib)の書き換えのみが必要です。使用シナリオは他とは大きく異なるため、これらはこの回答の範囲外です。 ブロックレベルのディスク暗号化 以外には使用しないでください。一部のメンバー:xex、xts、lrw。 認証された暗号化:パディングoracle攻撃と暗号文への変更を防ぐために、暗号文で message認証コード (mac)を計算し、改ざんされていない場合にのみ暗号化を解除できます。これはencrypt-then-macと呼ばれ、 は他の注文より優先されるべきです 。ごく少数のユースケースを除いて、信頼性は機密性と同じくらい重要です(後者は暗号化の目的です)。認証済み暗号化スキーム(関連データ(aead)を使用)は、暗号化と認証の2つの部分のプロセスを1つのブロック暗号モードに結合し、プロセスで認証タグも生成します。ほとんどの場合、これにより速度が向上します。 ccmは、ctrモードとcbc-macの単純な組み合わせです。ブロックごとに2つのブロック暗号暗号化を使用すると、非常に遅くなります。 ocbは高速ですが、特許によって妨げられています。ただし、無料(自由の場合)または非軍事ソフトウェアの場合、特許所有者 は無料ライセンスを付与しました 。 gcmは、ctrモードと、2 ^ 128要素のガロア体上のmacであるghashの非常に高速ですが、おそらく複雑な組み合わせです。 tls 1.2などの重要なネットワーク標準で広く使用されていることは、 special instruction に反映されています。intelはghashの計算を高速化するために導入しました。 勧告:認証の重要性を考慮すると、ほとんどのユースケースで次の2つのブロック暗号モードをお勧めします(ディスク暗号化の目的を除く)。データが非対称署名で認証される場合はcbcを使用し、そうでない場合はgcmを使用します。