4

在此代码中,此行导致异常:

clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));

javax.crypto.BadPaddingException: pad block corrupted

我的代码来自: http ://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

有任何想法吗?

    private String decrypt (String encryptedText) {
        byte[] clearText = null;
        try {
            SecretKeySpec ks = new SecretKeySpec(getKey(), "AES");
            Cipher c = Cipher.getInstance("AES");
            c.init(Cipher.DECRYPT_MODE, ks);
            clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
            return new String(clearText, "UTF-8");
        } catch (Exception e) {
            return null;
        }
    }

详细信息:我也在 android 上对其进行加密

4

4 回答 4

10

owlstead 的建议很有帮助,但对于这种情况,在使用代码时

Android 开发者注意:保持用户数据安全 http://www.techrepublic.com/blog/software-engineer/attention-android-developers-keep-user-data-safe/

我对代码进行了一些更改,这些更改将来可能对其他人有所帮助。我完全删除了getkey方法。

private static String seed;

/**
 * Encrypts the text. 
 * @param clearText The text you want to encrypt
 * @return Encrypted data if successful, or null if unsucessful
 */
protected String encrypt(String clearText) {
    byte[] encryptedText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, ks);
        encryptedText = c.doFinal(clearText.getBytes("UTF-8"));
        return Base64.encodeToString(encryptedText, Base64.DEFAULT);
    } catch (Exception e) {
        return null;
    }
}

/**
 * Decrypts the text
 * @param encryptedText The text you want to encrypt
 * @return Decrypted data if successful, or null if unsucessful
 */
protected String decrypt (String encryptedText) {
    byte[] clearText = null;
    try {
        byte[] keyData = seed.getBytes();
        SecretKey ks = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.DECRYPT_MODE, ks);
        clearText = c.doFinal(Base64.decode(encryptedText, Base64.DEFAULT));
        return new String(clearText, "UTF-8");
    } catch (Exception e) {
        return null;
    }
}   
于 2013-11-18T16:55:15.963 回答
6

Java + Android + Encryption + Exception 通常只意味着一件事,有人SecureRandom再次使用该类作为密钥派生函数。SecureRandom当 的实现与"SHA1PRNG"Sun 在 Java SE 中的实现不同时,这将失败。特别是如果种子被添加到随机数生成器的状态中,而不是将种子用作 PRNG 的起点。

基本上,只需使用SecretKey aesKey = new SecretKeySpec(byte[] keyData, "AES"),或者 - 如果您从密码开始 - 尝试使用 PBKDF2 生成密钥。

于 2013-11-13T22:24:17.507 回答
1

对我来说,问题出在getKey()

确保两次调用getKey()返回相同的值。

我曾经new SecureRandom(password.getBytes())生成密钥。它在 Windows 上工作,但在 Android 上,它为不同的调用返回不同的值。

于 2017-09-21T09:00:09.880 回答
-1

我从这里引用: https ://androidfreetutorial.wordpress.com/2017/03/14/android-encryptiondecryption-with-aes-algorithm/

从“ AES/ECB/PKCS7Padding ”更改为“ AES ”;

于 2017-03-14T14:12:19.910 回答