1

每次运行此程序时都会出现错误

“错误:给定最终块未正确填充”

基本上我试图暴力破解密钥的最后 3 个字节,前 13 个字节是正确的。知道我在做什么错吗?我尝试删除填充并且它可以工作,但它找不到我确定它存在并包含单词“Mary had”的明文。注意:我正在使用 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

您的代码犯了很多错误,我不知道您要完成什么。因此,我将解释为什么您可能会收到BadPaddingExceptionCBC 密码:

  • 你的密钥不正确
  • 最后两个密文块中的一个或两个已被更改
  • 已从密文末尾删除一个或多个块
  • 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 0xFF 0xFF 0xFF。随机消息中发生正确填充的几率是 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 回答