Android javax.crypto.BadPaddingException:pad块损坏

时间:2017-08-28 02:49:11

标签: java android encryption

我正在尝试使用以下代码解密文件:

    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();
}

显示文件是使用内容提供程序访问的,并存储在String变量中,实际上存储了正确的字符串值(加密数据)。 解密它的方法是获取种子(在这种情况下是空白空间),然后使用MD5摘要,然后使用该值加密/解密明文。 但是每当代码到达时:String decoding = new String(paramstring2,“UTF-8”);错误消息:抛出了pad block corrupted。 我有什么想法我做错了吗?

2 个答案:

答案 0 :(得分:0)

避免使用默认填充密码,因为它可能在不同的环境中有所不同。

请尝试以下代码:

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

也使用相同的填充来加密文件。

您可以使用以下方法:

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);
}

答案 1 :(得分:0)

这不是与编码有关的问题。 请忽略这个问题