AES暗号化モード(CBC ECB CTR OCB CFB)の選択方法は?


480

それらのどれがどのような状況で好まれますか?

さまざまなモードの評価基準のリストと、各基準の適用可能性についての説明をご覧ください。

たとえば、基準の1つは暗号化と復号化の「コードのサイズ」であると思います。これは、802.11ネットワークアダプターなどのマイクロコード組み込みシステムにとって重要です。CBCの実装に必要なコードがCTRに必要なコードよりもはるかに小さい場合(これが本当かどうかはわかりませんが、これは単なる例です)、小さいコードのモードが望ましい理由を理解できました。しかし、サーバーで実行するアプリを作成していて、使用しているAESライブラリがいずれにせよCBCとCTRの両方を実装している場合、この基準は無関係です。

「評価基準と各基準の適用可能性のリスト」の意味を参照してください??

これは実際にはプログラミング関連ではありませんが、アルゴリズム関連です。


22
「これは実際にはプログラミング関連ではありませんが、アルゴリズム関連です。」∵アルゴリズムは数学で表すことができます。∵コンピュータプログラミングは数学で表すことができます。∴あなたの質問はコンピュータプログラミングについてです。
タイラー

41
「これは実際にはプログラミング関連ではありませんが、アルゴリズム関連です。」∵アルゴリズムは数学で表すことができ、株式市場は数学で表すことができます。あなたの質問は株式市場についてです。/皮肉に申し訳ありませんが、結論は非常に明白でしたが、議論は非常に明らかに間違っていました
Shien

サブスクライブする関係の理解に依存します。何かが必ずしも1つの概念にのみ関連している必要はありません。
ブライアングレース

回答:


325
  • 同じキーで複数のデータブロックを暗号化する場合は、ECBを使用しないでください。

  • CBC、OFB、CFBは似ていますが、暗号化のみが必要であり、復号化は必要ないため、コードスペースを節約できるため、OFB / CFBの方が優れています。

  • CTRは、CBC / OFB / CFBではなく、適切な並列化(速度)が必要な場合に使用されます。

  • XTSモードは、ランダムアクセス可能なデータ(ハードディスクやRAMなど)をエンコードする場合に最も一般的です。

  • OCBは、単一のパスで暗号化と認証を行うことができるため、断然最良のモードです。しかし、米国ではそれに関する特許があります。

あなたが本当に知っておくべき唯一のことは、あなたが1ブロックだけを暗号化しているのでない限り、ECBは使用されないということです。ストリームではなくランダムにアクセスされるデータを暗号化する場合は、XTSを使用する必要があります。

  • 暗号化するたびに常に一意のIVを使用する必要があり、それらはランダムである必要があります。それらがランダムであることを保証できない場合は、OCBを使用してください。これは、IVではなくナンスのみが必要であり、明確な違いがあるためです。ナンスは、人々は、次のいずれかを推測することができれば、セキュリティが低下しないIVは、この問題を引き起こす可能性があります。

65
CBC、OFB、CFBはまったく同じとは言えません。
ジョナサンレフラー、

22
メッセージをチャンクに分割し、各チャンクに一連のカウンター値が関連付けられ、各チャンクを個別に暗号化(または復号化)できるため、CTRは並列化に適しています。対照的に、CFBは次の入力の1つとして前のブロックからの出力に依存しているため、厳密にシーケンシャルであり、本質的に並列化できません。上記の他のモードについても同様です。
ジョナサンレフラー、

9
1つのブロックのみを暗号化する場合でも、同じキーでその1つのブロックを複数回(場合によっては複数回)暗号化する場合は、ECBを使用しないでください。
yfeldblum 2010年

23
...「CBC、OFB、CFBは同一である」という回答には、単一の反対票はありませんか?
Michael Mrozek

30
GCMはOCB(パフォーマンスおよびその他のプロパティ)に非常に似ていますが、特許によって妨げられていないため、最良の選択です。唯一の欠点は、実装が非常に複雑であるという事実ですが、ライブラリを使用する場合、そのことを心配する必要はありません。
ntoskrnl 2013

409

独自の暗号化の実装を回避できない場合は、長くて難しいことを考慮してください

問題の醜い真実は、あなたがこの質問をしているなら、おそらく安全なシステムを設計して実装することができないだろうということです。

私の要点を説明します。Webアプリケーションを構築していて、セッションデータを保存する必要があるとします。各ユーザーにセッションIDを割り当て、セッションデータをセッションデータにマッピングするハッシュマップにサーバー上のセッションデータを格納できます。しかし、サーバーでこの厄介な状態に対処する必要があり、ある時点で複数のサーバーが必要になると、事態が複雑になります。そのため、代わりに、クライアント側のCookieにセッションデータを保存するという考えがあります。もちろん暗号化して、ユーザーがデータを読み取ったり操作したりできないようにします。それでは、どのモードを使用する必要がありますか?ここに来ると、あなたはトップの答えを読みます(myforwikを1つにまとめてごめんなさい)。最初に取り上げた-ECB-はあなたには向いていません、複数のブロックを暗号化したい、次は-CBC-いいですね、CTRの並列処理は必要ありません、ランダムアクセスは必要ありません。つまり、XTSと特許はPITAではないため、OCBはありません。暗号ライブラリーを使用すると、暗号化できるのはブロックサイズの倍数に限られるため、いくつかのパディングが必要であることがわかります。選んでPKCS7は、いくつかの深刻な暗号化規格で定義されているためです。CBCはおそらく安全であることをどこかで読んだ後ランダムIVと安全なブロック暗号で使用された場合、クライアント側に機密データを格納していても安心できます。

サービスが実際にかなりの規模に成長した数年後、ITセキュリティの専門家が責任ある開示について連絡します。彼女はパディングオラクル攻撃を使用してすべてのCookieを復号化できるとあなたに言っていますパディングが何らかの形で壊れている場合、コードがエラーページを生成するため。

これは架空のシナリオではありません。 。Microsoftには、数年前までASP.NETにこの正確な欠陥がありました。

問題は、暗号化に関して多くの落とし穴があり、素人には安全に見えるが、知識豊富な攻撃者にとっては破りやすいシステムを構築することは非常に簡単であるということです。

データを暗号化する必要がある場合の対処法

ライブ接続の場合はTLSを使用します(証明書のホスト名と発行者チェーンを確認してください)。TLSを使用できない場合は、システムがタスクに提供する必要がある最高レベルのAPIを探し、それが提供する保証を理解し、保証されていないことがより重要であることを確認してください。上記の例のように、Playのようなフレームワークはクライアント側のストレージ機能を提供しますが、しばらくしても保存されたデータを無効にしません。また、クライアント側の状態を変更した場合、攻撃者は気付かずに以前の状態を復元できます。

高レベルの抽象化が利用できない場合は、高レベルの暗号化ライブラリを使用します。顕著な例はNaClであり、多くの言語バインディングを備えた移植可能な実装はSodiumです。です。このようなライブラリーを使用すると、暗号化モードなどを気にする必要はありませんが、nonceを2回使用しないなど、より高いレベルの抽象化よりも使用法の詳細にさらに注意する必要があります。

何らかの理由で、たとえば既存のシステムと特定の方法でやり取りする必要があるために、高レベルの暗号化ライブラリを使用できない場合、徹底的に教育する方法はありません。Ferguson、Kohno、Schneierによる暗号工学を読むことをお勧めします。必要なバックグラウンドがなくても安全なシステムを構築できると信じ込んでください。暗号化は非常に微妙であり、システムのセキュリティをテストすることはほぼ不可能です。

モードの比較

暗号化のみ:

  • パディングを必要とするモード:この例のように、パディングはオラクル攻撃のパディングの可能性を開くため、一般に危険な場合があります。最も簡単な防御策は、復号化する前にすべてのメッセージを認証することです。下記参照。
    • ECBはデータの各ブロックを個別に暗号化し、同じ平文ブロックは同じ暗号文ブロックになります。これが深刻な問題である理由を確認するには、ECBウィキペディアのページで ECB暗号化されたTuxイメージを見てください。ECBが受け入れられるユースケースは知りません。
    • CBCにはIVがあるため、メッセージが暗号化されるたびにランダム性が必要です。メッセージの一部を変更すると、変更後にすべてを再暗号化する必要があります。1つの暗号文ブロックの送信エラーにより、平文が完全に破壊され、次のブロックの復号化が変更され、復号化されます。並列化できる/暗号化できない、プレーンテキストはある程度柔軟である- これは問題になる可能性がある
  • ストリーム暗号モード:これらのモードは、プレーンテキストに依存する場合としない場合がある、データの疑似ランダムストリームを生成します。ストリーム暗号一般と同様に、生成された疑似ランダムストリームはプレーンテキストとXORされて、暗号テキストが生成されます。ランダムストリームのビットを好きなだけ使用できるので、パディングはまったく必要ありません。この単純さの欠点は、暗号化が完全に順応性があることです、つまり、平文p1、暗号文c1、および疑似ランダムストリームrのように、攻撃者が好きな方法で復号化を変更できることを意味し、攻撃者は、暗号文c2 =c1⊕dの復号化となるように差分dを選択できます。 p2 =c2⊕r=(c1⊕d)⊕r = d⊕(c1⊕r)なので、p2 =p1⊕dです。また、2つの暗号文c1 =p1⊕rとc2 =p2⊕rの場合と同じ擬似ランダムストリームを2回使用することはできません。攻撃者は、2つの平文のxorをc1⊕c2=p1⊕r⊕p2⊕r=として計算できます。 p1⊕p2。また、元のメッセージが攻撃者によって取得された可能性がある場合、メッセージの変更には完全な再暗号化が必要であることも意味します。次のSteam暗号モードはすべて、ブロック暗号の暗号化操作のみを必要とするため、暗号によっては、非常に制限された環境で(シリコンまたはマシンコード)スペースを節約できる場合があります。
    • CTRはシンプルで、プレーンテキストから独立した疑似ランダムストリームを作成します。異なる疑似ランダムストリームは、最大のメッセージ長を掛けた異なるnonces / IVからカウントアップすることで取得され、noncesメッセージの暗号化を使用して、オーバーラップが防止されます。メッセージごとのランダム性なしで可能、復号化と暗号化は並列化可能、伝送エラーは間違ったビットにのみ影響し、それ以上は影響しません
    • OFBは、平文から独立した疑似ランダムストリームも作成します。メッセージごとに異なるノンスまたはランダムIVで開始することにより、異なる疑似ランダムストリームが取得されます。ノンスメッセージを使用するCTRはメッセージごとに暗号化できないため、暗号化も復号化も並列化できません。 CTR送信エラーと同様に、ランダム性は間違ったビットにのみ影響し、それ以上は影響しません
    • CFBの疑似ランダムストリームは平文に依存し、メッセージごとに異なるノンスまたはランダムIVが必要です。たとえば、CTRやOFBを使用すると、メッセージごとのランダム性なしでメッセージの暗号化が可能で、復号化は並列化可能/暗号化は不可能で、伝送エラーは完全に次のブロックを破棄しますが、現在のブロックの誤ったビットにのみ影響します
  • ディスク暗号化モード:これらのモードは、ファイルシステムの抽象化以下のデータの暗号化に特化しています。効率上の理由から、ディスク上の一部のデータを変更するには、最大で1つのディスクブロック(512バイトまたは4kib)の再書き込みのみが必要です。使用シナリオが他と大きく異なるため、この回答の範囲外です。ブロックレベルのディスク暗号化以外には使用しないでください。一部のメンバー:XEX、XTS、LRW。

認証された暗号化:

オラクル攻撃のパディングや暗号文の変更を防ぐために、暗号文のメッセージ認証コード(MAC)を計算し、改ざんされていない場合にのみ復号化できます。これは、encrypt-then-macと呼ばれ、他のどの順序よりも優先されます。ごく少数の使用例を除いて、信頼性は機密性と同じくらい重要です(後者は暗号化の目的です)。認証された暗号化スキーム(関連データ(AEAD)付き)は、暗号化と認証の2つの部分のプロセスを1つのブロック暗号モードに結合し、そのプロセスで認証タグも生成します。ほとんどの場合、これにより速度が向上します。

  • CCMは、CTRモードとCBC-MACの単純な組み合わせです。ブロックごとに2つのブロック暗号化暗号化を使用すると、非常に遅くなります。
  • OCBはより高速ですが、特許によって妨げられています。ただし、無料(自由の場合と同様)または非軍事ソフトウェアの場合、特許権者は無料のライセンスを付与しています。
  • GCMは非常に高速ですが、CTRモードと2 ^ 128要素のガロア体上のMACであるGHASHの間違いなく複雑な組み合わせです。TLS 1.2などの重要なネットワーク標準で広く使用されていることは、GHASHの計算を高速化するためにIntelが導入した特別な指示に反映されています。

勧告:

認証の重要性を考慮すると、ほとんどのユースケース(ディスク暗号化の目的を除く)では、次の2つのブロック暗号モードをお勧めします。


214
「この質問をする必要がある場合、安全なシステムを実装するための暗号化について十分に理解していないと思います。」-あなたは正しいですが、質問をすることは人々がどのように学ぶのかを理解していますか?少しリラックスしてください。
Robert MacLean 2014

70
@RobertMacLean真ですが、ITの他の多くのフィールドとは異なり、試行錯誤によってセキュリティを正しく設定することはできません。Webデザイン、アプリケーションのスケーラビリティなどでは、要件を積極的にチェックし、セキュリティの側面をテストすることは困難から不可能までさまざまです。残念ながら、それはめったに教えられないレッスンです。ほとんどのリソースは、暗号化がどのように機能するかを示しており、実際にそれが気付かれることなく失敗する無数の方法ではありません。唯一の方法は、主題について多くを知ることです。そして、それはポストの士気です:
ペルセウス14

8
暗号を完全に理解するのに十分な時間を費やすか、暗号を可能な限り避けて、強力な抽象化を使用します。そして、暗号化が最初の段落をどのように破るかを学習するというテーマでは、モードの説明よりもはるかに主題に沿っています。
ペルセウス2014

33
マイナス1:最初の見出しは間違っています。それは「この質問をしているなら、あなたは正しい方向に進んでいるなら、それを続けてください、そしてあなたは卓越します!」と言うべきです。
Henrik

11
@FerminSilva:真実ですが、議論のもう1つの側面は、暗号化コードをコピーして貼り付けるよりも、真のテスト済みソリューションを使用する簡単なことが多いということです。たとえば、スマートフォンアプリからサーバーと通信するだけの場合、Apacheリバースプロキシを設定してLet's Encrypt TLS証明書を設定し、https://your.serverアプリ内のどこにでも書き込む方が、いくつかの鍵交換プロトコルを発明するよりもはるかに簡単です。両側の暗号化ライブラリーをスムーズに連携させる。
Perseids

36

ここで、2011年にPhil Rogawayが正式な分析を行いました。セクション1.6では、私がここに書き写した要約を示し、自分自身を太字で強調します(せっかちな場合は、CTRモードを使用することをお勧めしますが、メッセージの整合性と暗号化の比較については、以下の段落をお読みになることをお勧めします)。

これらのほとんどはIVをランダムにする必要があることに注意してください。これは予測不可能であるため、暗号化セキュリティで生成する必要があります。ただし、一部には「ノンス」のみが必要であり、そのプロパティを要求せず、再利用しないことのみが必要です。したがって、ナンスに依存する設計は、ノンスに依存する設計よりもエラーが発生しにくい(そして、私を信じて、CBCが適切なIV選択で実装されていない多くのケースを見てきました)。したがって、Rogawayが「IVがnonceの場合、機密性は達成されない」と言っている場合は、太字を追加したことがわかります。つまり、IVを暗号的に安全(予測不可能)に選択した場合、問題はありません。しかし、そうしないと、優れたセキュリティ特性が失われます。 これらのモードでIV再利用しないでください。

また、メッセージの整合性と暗号化の違いを理解することも重要です。暗号化はデータを隠しますが、攻撃者は暗号化されたデータを変更できる可能性があり、メッセージの整合性を確認しないと、結果がソフトウェアに受け入れられる可能性があります。開発者は「しかし、変更されたデータは復号化後にガベージとして返されます」と言いますが、優れたセキュリティエンジニアは、そのガベージがソフトウェアに悪影響を与える可能性を見つけ、その分析を実際の攻撃に変えます。暗号化が使用された多くのケースを見てきましたが、メッセージの完全性は暗号化よりも本当に必要でした。必要なものを理解します。

GCMは暗号化とメッセージの整合性の両方を備えていますが、非常に壊れやすい設計であると言う必要があります。IVを再利用すると、ねじ込まれます-攻撃者はキーを回復できます。他のデザインは壊れにくいので、私は実際に私が実際に見た貧しい暗号化コードの量に基づいてGCMを勧めることを恐れています。

メッセージの整合性と暗号化の両方が必要な場合は、2つのアルゴリズムを組み合わせることができます。通常、CBCとHMACが使用されますが、CBCに縛られる理由はありません。知っておくべき重要なことは、最初に暗号化し、次に暗号化されたコンテンツMACを適用することです。また、IVはMAC計算の一部である必要があります。

IPの問題を認識していません。

ロガウェイ教授からの良いものに:

暗号モードをブロックし、メッセージの整合性は暗号化しない

ECB:ブロック暗号。モードは、nビットの各部分を個別に暗号化することにより、nビットの倍数であるメッセージを暗号化します。セキュリティのプロパティは弱く、ブロックの位置と時間の両方でブロックの等価性がリークします。かなりのレガシーな価値があり、他のスキームのビルディングブロックとして価値がありますが、モード自体は一般的に望ましいセキュリティ目標を達成しないため、十分に注意して使用する必要があります。ECBは「汎用」の機密保持モードと見なされるべきではありません

CBC:IVベースの暗号化スキーム。このモードは確率論的暗号化スキームとして安全であり、ランダムIVを想定して、ランダムビットと区別がつかないようにします。IVが単なるnonceである場合や、標準で誤って提案されているように、スキームで使用されているのと同じ鍵で暗号化されたnonceである場合、機密性は達成されません。暗号文は非常に順応性があります。暗号文攻撃(CCA)のセキュリティは選択されていません。多くのパディング方法の正しいパディングオラクルが存在する場合、機密性は失われます。暗号化は本質的にシリアルであるため非効率的です。広く使用されているこのモードのプライバシーのみのセキュリティプロパティは、頻繁に誤用されます。CBC-MACアルゴリズムのビルディングブロックとして使用できます。CTRモードに勝る重要な利点は特定できません。

CFB:IVベースの暗号化スキーム。このモードは確率論的暗号化スキームとして安全であり、ランダムなIVを想定して、ランダムなビットと区別がつかないようにします。IVが予測可能である場合、またはスキームで使用されているのと同じキーで暗号化されたナンスによって機密性が作成されている場合は、標準で誤って行われているように、機密性は達成されません。暗号文は順応性があります。CCAセキュリティーはありません。暗号化は本質的にシリアルであるため非効率的です。スキームは、パラメーターs、1≤s≤nに依存します。通常はs = 1またはs = 8です。sビットのみを処理するために1つのブロック暗号呼び出しを必要とするのは非効率的です。このモードは、興味深い「自己同期」プロパティを実現します。暗号文に任意の数のsビット文字を挿入または削除しても、正しい解読が一時的に中断されるだけです。

OFB:IVベースの暗号化スキーム。このモードは確率論的暗号化スキームとして安全であり、ランダムIVを想定して、ランダムビットと区別がつかないようにします。IVがナンスの場合、機密性は達成されませんが、IVの固定シーケンス(カウンターなど)は正常に機能します。暗号文は非常に順応性があります。CCAセキュリティーはありません。暗号化と復号化は、本質的にシリアルであるため効率が悪い。任意のビット長の文字列をネイティブに暗号化します(パディングは不要)。CTRモードに勝る重要な利点は特定できません。

CTR:IVベースの暗号化スキーム。このモードでは、ナンスIVを想定したランダムビットと区別がつきません。安全なnonceベースのスキームとして、このモードはランダムIVを伴う確率的暗号化スキームとしても使用できます。nonceが暗号化または復号化で再利用される場合、プライバシーの完全な失敗。多くの場合、モードの並列化可能性により、他の機密性モードよりも、一部の設定でははるかに高速になります。認証された暗号化スキームのための重要なビルディングブロック。全体として、通常、プライバシーのみの暗号化を実現するための最良かつ最新の方法です。

XTS:IVベースの暗号化スキーム。このモードは、調整可能なブロック暗号(強力なPRPとして安全)を各nビットチャンクに適用することで機能します。nで割り切れない長さのメッセージの場合、最後の2つのブロックは特別に扱われます。このモードを使用できるのは、ブロック構造のストレージデバイス上のデータを暗号化する場合のみです。基礎となるPRPの幅が狭いことと、最終ブロックの断片の扱いが悪いことが問題です。(ワイドブロック)PRPセキュアブロック暗号よりも効率的ですが、望ましくありません。

MAC(メッセージの整合性はあるが暗号化は不可)

ALG1–6:MACのコレクション。すべてCBC-MACに基づいています。スキームが多すぎます。VIL PRFとして証明できるほど安全であるもの、FIL PRFとして証明されるもの、証明可能なセキュリティを持たないものもあります。一部のスキームでは、有害な攻撃を認めています。一部のモードには日付が付いています。鍵の分離は、それを備えているモードでは不十分です。まとめて採用するべきではありませんが、「最良の」スキームを選択的に選択することは可能です。CMACを支持して、これらのモードをどれも採用しないことも問題ありません。一部のISO 9797-1 MACは、特に銀行業務で広く標準化され使用されています。標準の改訂版(ISO / IEC FDIS 9797-1:2010)がまもなくリリースされます[93]。

CMAC:CBC-MACに基づくMAC。モードは(VIL)PRFとして(誕生日の境界まで)証明できるほど安全です(基礎となるブロック暗号が優れたPRPであると想定)。CBCMACベースのスキームでは、本質的に最小限のオーバーヘッド。一部のアプリケーションドメインでは本質的にシリアルな性質の問題があり、64ビットブロック暗号で使用すると、時々再キーイングが必要になります。MACのISO 9797-1コレクションよりもクリーンです。

HMAC:ブロック暗号ではなく暗号ハッシュ関数に基づくMAC(ほとんどの暗号ハッシュ関数自体はブロック暗号に基づいています)。メカニズムは、好ましい仮定からではないが、強力な証明可能なセキュリティ限界を享受します。文献に密接に関連する複数のバリアントは、何が知られているのかを理解することを複雑にします。有害な攻撃は提案されていません。広く標準化され使用されています。

GMAC:GCMの特殊なケースであるnonceベースのMAC。GCMの良い特徴と悪い特徴の多くを継承します。ただし、MACではnonce要件は不要であり、ここではほとんどメリットがありません。タグが64ビット以下に切り捨てられ、復号化の範囲が監視および削減されていない場合の実用的な攻撃。nonce-reuseの完全な失敗。とにかくGCMが採用されている場合、使用は暗黙的です。個別の標準化にはお勧めしません。

認証された暗号化(暗号化とメッセージの整合性の両方)

CCM:CTRモードの暗号化と生のCBC-MACを組み合わせたnonceベースのAEADスキーム。本質的にシリアルであり、状況によっては速度が制限されます。基盤となるブロック暗号が優れたPRPであると想定して、十分に安全であることが証明されています。明らかに仕事をしている不合理な建設。GCMよりも実装が簡単です。nonceベースのMACとして使用できます。広く標準化され使用されています。

GCM:CTRモードの暗号化とGF(2128)ベースのユニバーサルハッシュ関数を組み合わせたノンスベースのAEADスキーム。一部の実装環境に適した効率特性。最小限のタグの切り捨てを想定した、証明可能な安全な結果。大幅なタグの切り捨てが存在する場合の攻撃と証明可能なセキュリティの限界。GMACと呼ばれるnonceベースのMACとして使用できます。96ビット以外のノンスを許可する疑わしい選択。nonceを96ビットに、タグを少なくとも96ビットに制限することをお勧めします。広く標準化され使用されています。


1
GCMモード:ほとんどのSOは暗号化の知識がほとんどないかまったくないため、通常は認証を使用せず、ECBモードを頻繁に使用するモードを正しく使用しません。GCMモードがおそらくここでの最良の選択です。残念ながら、プラットフォームの実装の欠如、場合によっては(iOS)ベンダーのサポートがない、多くの場合不十分な検証、ハードウェアのサポートの欠如が現在問題となっています。それ以外の場合は、認証が組み込まれており、将来のように思われるため、暗号化の初心者には適しています。
zaph 2017年

3
CTRモード:実際には多くの障害があり、主にIVの再利用が行われるため、CTRモードは最良の選択ではありません。マイクロソフトでさえ、少なくとも数回これを台無しにしています。
zaph 2017年

1
CBCモード:おそらく最も一般的なモードであり、SO、ECB(使用すべきではない)で最も使用されているモードを除きます。主要な使用上の欠陥はランダムではないIVですが、CSPRNGでより正確な使用が見られます。Oracleのパディングは問題ですが、パディングエラーを無視して戻さないことで簡単に修正できます。一部の実装(例:Common Crypto)では、APIレベルでパディングエラーを回避するという本質的に成功した方法でパディングエラーを報告しません。
zaph 2017年

1
IMO CTRは、CBCが他のいくつかのモードと同様にブロックからブロックへと伝播する単純なXORであるため、さらに悪くなります。簡単に思えるかもしれませんが、マスマーケットコードには大きな失敗がありました。
zaph 2017年

1
リンクされた論文を読むと、認証キーのみが取得され、nonce再利用の暗号化キーは取得されていないようです。これは、暗号化キーが取得されたというコメントの主張ではないようです。認証キーを取得するとメッセージを改ざんできますが、メッセージを回復することはできません。どこが間違っているか指摘してください。
zaph 2017年

30
  1. ECB以外。
  2. CTRを使用する場合は、メッセージごとに異なるIVを使用する必要があります。そうしないと、攻撃者は2つの暗号文を取得し、暗号化されていない平文を組み合わせて取得できます。その理由は、CTRモードは基本的にブロック暗号をストリーム暗号に変換するためです。ストリーム暗号の最初のルールは、同じKey + IVを2回使用しないことです。
  3. モードの実装がどれほど難しいかについては、それほど大きな違いはありません。一部のモードでは、暗号化の方向で動作するためにブロック暗号のみが必要です。ただし、AESを含むほとんどのブロック暗号は、復号化を実装するのにそれほど多くのコードを必要としません。
  4. すべての暗号モードで、メッセージの最初の数バイトが同一である可能性があり、攻撃者がこれを知られたくない場合は、メッセージごとに異なるIVを使用することが重要です。

ポイント1をサポートするには(そのための+1):codinghorror.com/blog/archives/001267.html
Michael Stum

1
前のメッセージの一部と衝突する可能性は少し高くなりますが、乱数からCTRを開始しないでください。代わりに単調にインクリメントし(これは永続ストレージのどこにいるのかを覚えていることを意味する場合があります)、カウンターが足りなくなったら(いつ)キーを再入力します。
カフェ

@Theran-ポイント2-メッセージごとに異なる乱数?いいえ、それは正しくないと思います。カウンターを常にゼロから始めても問題ないという印象を受けています。@ caf、Theranが「メッセージ」と言ったとき、彼は「ブロック」を意味しないと思います。もちろん、カウンターは、暗号を通過する特定のメッセージのブロックごとに増加します。Theranが言っているように見えるのは、各メッセージはカウンターの異なる初期値で始まる必要があるということです。そして、これは正しくないと思います。
Cheeso 2009

1
re:ポイント3-たとえば、復号化は暗号化と同じ変換であるため、CTRモードの方が実装が小さいという論文を読んだことがあります。したがって、半分のコード。しかし、私が言うように、サーバークラスのマシンには関係ありません。
Cheeso 2009

はい、間違えました。CTRモードで変更する必要があるのはIV /ノンスですが、暗号化する前にカウンターと組み合わせられるため、カウンターのランダムな開始点と考える傾向があります。暗号化方向でスペースを節約するために暗号を使用する必要がある限り、多くの暗号では、復号化するためにサブキーを逆にするだけで済みます。AESは復号化に少しかさばりますが、128バイトのRAMを備えたuCに実装することはできません。サブキーはそれより多くのRAMを使用します!
2009

13

ウィキペディアのブロック暗号モードの動作に関するこの情報を読むことから始めましたか?次に、ウィキペディアのNIST:ブロック暗号モードの運用に関する推奨事項への参照リンクをたどってください。


6
この回答はStackoverflowの品質基準を満たしていません。回答では、すべての外部リンクが無効になっていると想定し、完全なコピーでなくても、関連情報を、理想的には元の質問に最もよく回答するように設計された方法で要約してください。
mirabilos 14

5
@mirabilos 5年近く経って、当時は存在しなかった規範や基準に言及したのですか?私は特に、両方とも実際にはまだライブであり、問​​題のサイトがさらに5年間存在し続ける可能性がある場合に、デッドリンクについて話すのが好きです。しかたがない。
KTC 2014

3
@mirabilos 間違いなく正しいかもしれませんが、基準が異なる5年前に行われたと思われる回答に対する苦情は適用されません。君は間違いを認めるべきだった。それが事実ではなく、その代わりに更新または変更する必要があることを示唆している場合でも、それは義務ではありません。答えはそれがどうだったかで十分だった。
konsolebox 2015年

@KTC政府がシャットダウンし、サイトがオフラインの場合を除きます。あなたの答えは有用な情報だったかもしれませんが、現時点では完全に欠落しています。したがって、この質問とその回答の読者は、2014年に更新された内容(回答が不完全だったため)と現在の状況(NIST Webサイトが政府により閉鎖されたため)の両方に疑問を抱いています。ただし、不足している情報を追加したいのですが...
G DeMasters

11

広く入手できるものに基づいて選択することもできます。私は同じ質問をしました、そして、これは私の限られた研究の結果です。

ハードウェアの制限

STM32L (low energy ARM cores) from ST Micro support ECB, CBC,CTR GCM
CC2541 (Bluetooth Low Energy) from TI supports ECB, CBC, CFB, OFB, CTR, and CBC-MAC

オープンソースの制限

Original rijndael-api source  - ECB, CBC, CFB1
OpenSSL - command line CBC, CFB, CFB1, CFB8, ECB, OFB
OpenSSL - C/C++ API    CBC, CFB, CFB1, CFB8, ECB, OFB and CTR
EFAES lib [1] - ECB, CBC, PCBC, OFB, CFB, CRT ([sic] CTR mispelled)  
OpenAES [2] - ECB, CBC 

[1] http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library

[2] https://openaes.googlecode.com/files/OpenAES-0.8.0.zip


1
ST Micro:EBCはECBである必要があります。参考:STM32L4A6は、128ビットおよび256ビットのAESをサポートし、ECB、CBC、CTR、GCM、ガロアメッセージ認証コード(GMAC)または暗号メッセージ認証コードモードのCMACチェーンアルゴリズムもハードウェアでサポートされています。
トムカッシェル2018年

-3

私は1つの側面を知っています。CBCはブロックごとにIVを変更することでセキュリティを向上させますが、ランダムにアクセスされる暗号化されたコンテンツ(暗号化されたハードディスクなど)には適用できません。

したがって、シーケンシャルストリームにはCBC(およびその他のシーケンシャルモード)を使用し、ランダムアクセスにはECBを使用します。


もちろん、そうです。CBCは、以前の暗号文ブロックと暗号化前の平文ブロックをXORします。最初のブロックはIVを使用します。したがって、ブロックを復号化するには、以前のすべてのブロックを正常に復号化する必要があります。OK、それは良い洞察です。
Cheeso 2009

6
いいえ、以前の暗号文にアクセスする必要があるだけで、以前のブロックを復号化する必要はありません。
カフェ、

ああ、それはCBCがランダムアクセスで問題ないことを意味しますね。
Cheeso 2009

4
@Cheeso:CBCはランダム読み取りアクセスでは問題ありませんが、ランダム書き込みアクセスでは問題ありません。そこでCTRを使用します。
–PaŭloEbermann、2011

3
@PaŭloEbermannランダムアクセスの場合、CTRは攻撃者が2つのバージョンの暗号文を観察した場合に深刻な攻撃を許すため、良い考えではありません。代わりにXTSまたは調整可能なブロック暗号を使用してください。
CodesInChaos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.