简体   繁体   English

Android javax.crypto.BadPaddingException:填充块已损坏

[英]Android javax.crypto.BadPaddingException: pad block corrupted

I am trying to decrypt a file using the following code: 我正在尝试使用以下代码解密文件:

    Uri targURI = Uri.parse("content://xxxx/yyy.txt");
    try {
        InputStream content = getContentResolver().openInputStream(targURI);
        BufferedReader reader1 = new BufferedReader(new InputStreamReader(content));
        String line1;
        String text = "";
        while ((line1 = reader1.readLine()) != null) {
            text+=line1;
        }
        Log.i("FILE ENCRYPTED", text);
        String DECRYPTED = "";
        DECRYPTED = decrypt(text);
        Log.i("FILE DECRYPTED:", DECRYPTED);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public String decrypt(String paramString) throws Exception {
        String md5_pin1 = "";
        String md5_pin = MD5(md5_pin1);
        SecretKeySpec keySpec = new SecretKeySpec(md5_pin.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, keySpec);
        byte[] paramString1 = Base64.decode(paramString.getBytes(), 0);
        byte[] paramstring2 = cipher.doFinal(paramString1);
        String decoded = new String(paramstring2, "UTF-8");
        return decoded;
    }

@NonNull
public static String MD5(String paramString) throws Exception {
    MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
    digest.update(paramString.getBytes());
    byte messageDigest[] = digest.digest();
    StringBuffer hexString = new StringBuffer();
    int i=0;
    while( i < messageDigest.length) {
        String str = Integer.toHexString( messageDigest[i] & 0xFF );
        if (str.length() == 1) {
            hexString.append("0");
        }

        hexString.append(str);
        i += 1;
    }
    return hexString.toString();
}

as it is showed the file is accessed using a content provider, and stored in a String variable, and actually the correct string value is stored (encrypted data). 如图所示,使用内容提供程序访问文件并将其存储在String变量中,并且实际上存储了正确的字符串值(加密数据)。 The way to decrypt it is to get a seed (empty space in this case), and then use MD5 digest, then use that value to encrypt/decrypt the cleartext. 解密它的方法是获取一个种子(在这种情况下为空白),然后使用MD5摘要,然后使用该值对明文进行加密/解密。 However whenever the code reaches: String decoded = new String(paramstring2, "UTF-8"); 但是,只要代码到达:解码的字符串=新的字符串(paramstring2,“ UTF-8”); the error message: pad block corrupted is thrown. 错误消息:填充垫块已损坏。 Any ideas what I am doing wrong? 有什么想法我做错了吗?

Avoid using default padding for cipher as it may be different on different environment. 避免对密码使用默认填充,因为默认填充在不同环境下可能会有所不同。

Try the following code: 尝试以下代码:

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

Also use the same padding for encrypting the file. 也使用相同的填充来加密文件。

You can use the following methods: 您可以使用以下方法:

private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] iv = new byte[cipher.getBlockSize()];
    IvParameterSpec ivParams = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"), ivParams);
    return cipher.doFinal(data);
}

private static byte[] decrypt(byte[] encrypted, byte[] key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] ivByte = new byte[cipher.getBlockSize()];
    IvParameterSpec ivParamsSpec = new IvParameterSpec(ivByte);
    cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"), ivParamsSpec);
    return cipher.doFinal(encrypted);
}

This was not a problem related to coding. 这不是与编码有关的问题。 Please disregard this question 请忽略这个问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 javax.crypto.BadPaddingException:pad块损坏 - javax.crypto.BadPaddingException: pad block corrupted 错误:javax.crypto.BadPaddingException:解密时填充块损坏 - Error : javax.crypto.BadPaddingException: pad block corrupted while Decryption 文件解密失败:javax.crypto.BadPaddingException:填充块已损坏 - Decryption of file fails: javax.crypto.BadPaddingException: pad block corrupted javax.crypto.BadPaddingException:填充块损坏的异常 - javax.crypto.BadPaddingException: pad block corrupted exception javax.crypto.BadPaddingException:填充块有时损坏 - javax.crypto.BadPaddingException: pad block corrupted sometimes 解密图像时,给出javax.crypto.BadPaddingException:填充块损坏的Android - When Decrypting Image, gives javax.crypto.BadPaddingException: pad block corrupted Android 函数解密引发javax.crypto.BadPaddingException:android中的类SimpleCrypto中的填充块已损坏 - function decrypt throws javax.crypto.BadPaddingException: pad block corrupted in class SimpleCrypto in android AES128解密:javax.crypto.badpaddingexception pad块损坏 - AES128 Decryption :javax.crypto.badpaddingexception pad block corrupted Java Blowfish CBC 解密 javax.crypto.BadPaddingException:填充块已损坏 - Java Blowfish CBC Decryption javax.crypto.BadPaddingException: pad block corrupted javax.crypto.BadPaddingException:未知的块类型 - javax.crypto.BadPaddingException: unknown block type
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM