web-dev-qa-db-ja.com

AES-ECBは長い秘密の平文攻撃を選択

私が行っている暗号の演習の方法を理解するのに問題があります。演習の目的は、ECBモードのAESに対する選択されたキー攻撃によって暗号化された秘密文字列を回復することです。

文字列を入力として受け取り、秘密の文字列を追加し、静的にランダムに生成されたキーを使用して、AES-ECB-128暗号化文字列を返すOracle関数があります。

Oracle("text goes here!!") -> AES.encrypt("text goes here!!somesecretsomesecret", "staticrandomkey!")

ここで説明する方法 を使用して秘密のフレーズの平文を取得する方法を理解しており、16バイトの秘密の文字列の復元に成功しています。

私が理解していないのは、その方法を16バイトより長い秘密の文字列にどのように適用できるかです。明らかなものがない場合を除き、追加された秘密の最初のブロックを回復するためにのみ機能します。

6
user88602

あなたはすでにあなたの投稿で解決策を言ったと思いますが、それを再指摘しましょう。

  1. AESは16バイト(128ビット)のブロックサイズで動作します
  2. シークレットは、選択したテキストに追加されます。
  3. ???
  4. 秘密の文字列の文字を1つずつ見つけます

エクササイズではなかった場合、詳細をお知らせします...

[〜#〜]編集[〜#〜]

最初の16バイトが見つかったら、次の操作を行うだけです。

まったく同じですが、2番目のブロックを見てください。

ソリューション...

  1. 最初の秘密のブロックを入手する

15文字を入力し、最初の16エンコードバイトを取得します。次に、最初の16エンコードバイトが15文字の場合と同じ結果が得られるまで、最後の16文字を変更して16文字を入力します。その16番目の文字は、あなたの秘密の最初の文字です。次に、14文字を入力して同じ手順で2番目の秘密の文字を見つけることで、プロセスを繰り返すことができます。

  1. 2番目の秘密ブロックを取得する

最初の16個のシークレットバイトは既に見つかりました。次に15文字を入力して、エンコードされたバイトの2番目のブロックの結果を見つけます。バイト17〜32。次に、32文字を入力し、最後の文字だけを変更して、シークレット文字列で17番目のシークレット文字を見つける。次に、18バイト目以降を検索するために繰り返します。

5
Gudradain