3

我在我的应用程序中使用以下代码来加密和解密密码。它工作正常,直到突然我注意到它失败了。我记得做的唯一改变是几天前将我的 ADT 和 Eclipse 更新到最新版本。不知道为什么现在失败了。如果我创建新的加密,它会起作用。但是,如果我使用之前生成的任何加密密码并将其传递给下面的代码进行解密,则会出现错误。它在“byte[] plainBytes = cipher.doFinal(cipherBytes);”行中失败了

我的解密代码如下

        String keyword  = "keyword";
        int iterationCount = 1000; 
        int keyLength = 256;
        String[] fields = encryptedPassword.split("]");
        byte[] salt = fromBase64(fields[0]);
        byte[] cipherBytes = fromBase64(fields[1]);
        KeySpec keySpec = new PBEKeySpec(keyword.toCharArray(), salt, iterationCount, keyLength);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC");
        SecretKey key = keyFactory.generateSecret(keySpec);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        PBEParameterSpec pbeSpec = new PBEParameterSpec(salt, iterationCount);
        cipher.init(Cipher.DECRYPT_MODE, key, pbeSpec);
        byte[] plainBytes = cipher.doFinal(cipherBytes);
        plainStr = new String(plainBytes, "UTF-8").trim();
        return plainStr;

我得到的错误如下

java.lang.RuntimeException: javax.crypto.BadPaddingException: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

任何人都可以在这里帮忙吗

4

2 回答 2

0

弄清楚问题出在哪里。我已将 jdk 版本从 1.6 更新到 1.7。那是罪魁祸首。由于我使用的是 javax.crypto 类,因此任何版本更改都会导致加密也略有变化。

于 2013-10-07T20:39:05.923 回答
0

我不是安全专家,但我相信PBEWithSHA256And256BitAES-CBC-BC是 PKCS #12,而您使用 PKCS #5 派生密钥。也许如果您需要在Cipher.getInstance().

于 2013-11-21T11:03:53.127 回答