密码功能:错误的最终块长度Android Studio

时间:2017-04-04 16:12:32

标签: java android encryption aes

堆栈上有很多线程溢出这个主题,并且总是相同的解决方案,但这些对我来说不起作用。我正在寻找一种解密加密值byte[]并返回byte[] decodingBytes的方法。

使用AESCrypt方法。我使用compile 'com.scottyab:aescrypt:0.0.1'

private void testAES() {
    try {

       final byte[] encrypted = Base64.decode("R3JhbmRlIFZpY3RvaXJlICE=", Base64.NO_WRAP);

       byte[] keyBytes = Base64.decode("L/91ZYrliXvmhYt9FKEkkDDni+PzcnOuV9cikm188+4=", Base64.NO_WRAP);
       final byte[] ivBytes = Base64.decode("gqjFHI+YQiP7XYEfcIEJHw==".getBytes(), Base64.NO_WRAP);

       final SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

       byte[] decodedBytes = AESCrypt.decrypt(keySpec, ivBytes, encrypted);

   } catch (Exception e) {
       e.printStackTrace();
   }
 }

使用Cipher值,我会这样使用它。

private static byte[] testCipher() {

    try {

        final byte[] encrypted = Base64.decode("R3JhbmRlIFZpY3RvaXJlICE=", Base64.NO_WRAP);

        byte[] keyBytes = Base64.decode("L/91ZYrliXvmhYt9FKEkkDDni+PzcnOuV9cikm188+4=", Base64.NO_WRAP);
        byte[] ivBytes = Base64.decode("gqjFHI+YQiP7XYEfcIEJHw==".getBytes(), Base64.NO_WRAP);

        final IvParameterSpec ivSpecForData = new IvParameterSpec(ivBytes);

        SecretKeySpec decodedKeySpec = new SecretKeySpec(keyBytes, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, decodedKeySpec, ivSpecForData);

        byte[] decodedBytes = cipher.doFinal(encrypted); // I have the error here //

        return decodedBytes;

    } catch (Exception e) {
        e.printStackTrace();
    }

    return null;
}

无论我做什么,我总是有同样的错误:

error:1e06b07b:Cipher functions:EVP_DecryptFinal_ex:WRONG_FINAL_BLOCK_LENGTH

我尝试放入Cipher.getInstance(AES / CBC / NoPadding,AES / CBC / PKCS5Padding,AES / CBC / PKCS7Padding),但没有任何改变。 你有什么想法帮助我吗?

1 个答案:

答案 0 :(得分:1)

"R3JhbmRlIFZpY3RvaXJlICE="解码为17个十六进制字节4772616E646520566963746F6972652021这是ASCII文本:“Grande Victoire!”。

17字节不是AES的有效大小,AES是一种块密码,要求加密数据是16字节块大小的倍数。

只有Base64编码没有加密。