1

これを実行するたびにエラーが発生します

「エラー:指定された最後のブロックが適切に埋め込まれていません」

基本的に、キーの最後の3バイトをブルートフォースしようとしていますが、最初の13バイトは正しいです。私が間違っていることは何ですか?パディングを削除しようとしましたが、機能しますが、「メアリーが持っていた」という単語が含まれていると確信しているプレーンテキストが見つかりませんでした。注:sun.misc.BASE64Decoderを使用しています

これが私のコードの一部です。

        String myiv = new String(new byte[] {
                0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x31,0x30,0x31,0x31,0x31,0x32,0x33
        });

        char [] mykeyarray = new char[] {0x86,0xe5,0x30,0x90,0xff,0x62,0xa0,0x9a,0x81,0x00,0xad,0x9e,0x8f,0x00,0x00,0x00};
        String encoded = "dm8cfvs+c7pKM+WR+fde8b06SB+lqWLS4sZW+PfQSKtTfgPknzYzpTVOtJP3JBoU2Uo/7XWopjoPDOlPr24duuck0z+vAx91bYTwQo4INnIIBkj/lhJMWmvAKaUIO3qzBoGg8ynQOhuG6LY7Wo0uww==";

        IvParameterSpec ivspec = new IvParameterSpec(myiv.getBytes());

        byte [] decoded;    
        FileWriter fstream = new FileWriter("out.txt");
        BufferedWriter out = new BufferedWriter(fstream);
        String mykey;
        int repeat = 256;

        outerloop:
        for(int i=0;i<repeat;i++){
            for(int j=0;j<repeat;j++){
                for(int k=0;k<repeat;k++){

                    mykey = new String(mykeyarray);

                    SecretKeySpec keyspec = new SecretKeySpec(mykey.getBytes(), "AES");

                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

                    System.out.println("I: "+i+" J: "+j+" K: "+k); 

                    decoded = new BASE64Decoder().decodeBuffer(encoded); 

                    cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

                         byte [] decrypted = cipher.doFinal(decoded);
                         String dec = new String(decrypted);

                         if(dec.contains("Mary")){
                             out.write(dec);
                            out.write("\n");
                            System.out.println(dec);
                            break outerloop;
                         }

                            mykeyarray[15]++;
                }
                mykeyarray[14]++;
                mykeyarray[15]=0x00;
            }
            mykeyarray[13]++;
            mykeyarray[14]=0x00;
            mykeyarray[15]=0x00;
        }
            out.close();
    }

    catch(Exception e){
        System.out.println("Error: " + e.getMessage());
    }
}

}

4

3 に答える 3

1

あなたのコードは多くの間違いを犯します、そして私はあなたが何を成し遂げようとしているのか分かりません。BadPaddingExceptionそこで、CBC暗号のを受け取る理由を説明します。

  • キーが正しくありません
  • 暗号文の最後の2つのブロックの一方または両方が変更されました
  • 暗号文の末尾から1つ以上のブロックが削除されました
  • IVが正しくなく、暗号文が単一のブロックで構成されている

例外の原因を突き止めて頑張ってください。

于 2012-10-23T18:12:01.217 に答える
0

ランダムキーを使用して復号化するとランダムメッセージが表示されるため、通常、正しいパディングは取得されません。例外をキャッチして次に進みます。

PKCS5のパディングされたメッセージをブルートフォースする場合、約93%の確率でパディングエラーが発生します。PKCS5パディングは、パディングの長さを含むバイトでメッセージをパディングします。したがって、有効なパディングは0x01、0x2 0x02、0x03 0x03 0x03、....、0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF0xFF0xFFです。ランダムメッセージで正しいパディングが発生する確率は、1/16 +(1/16)^ 2 ...(1/16)^16<.067です。つまり、約1-%6.7 = 93%の確率で誤ったパディングが発生します。

于 2012-10-27T21:26:29.047 に答える
0

PKCS#5のパディングについて詳しく学んでみてください。これは、暗号化のにプレーンテキストに追加される特別なバイトです。テキストが間違ったキーで復号化された場合、それは正しくありません。キーをブルートフォースすると、正しいキーを除く各キーでこのエラーが発生します。

于 2012-10-23T06:20:33.117 に答える