有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android 4.4上的java解密错误

我有加密\解密文件的算法:

    private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}


private static byte[] getRawKey(byte[] seed) throws Exception {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = new SecureRandom();
    sr.setSeed(seed);
    kgen.init(sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    return raw;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;

}

它工作得很好,但在安卓4.4(api 19)上,我有一个奇怪的例外

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

这是什么


共 (1) 个答案

  1. # 1 楼答案

    这是我得到的:http://www.logikdev.com/2010/11/01/encrypt-with-php-decrypt-with-java/

       public class AES2 {
    
        private static final String TRANSFORMATION = "AES/CFB8/NoPadding";
        private static final String ALGO_MD5       = "MD5";
        private static final String ALGO_AES       = "AES";
    
        /**
         * See http://www.logikdev.com/2012/12/12/md5-generates-31-bytes-instead-of-32/ form more detail.
         * 
         * @param input
         * @return
         * @throws NoSuchAlgorithmException
         */
        private static String md5(String input) throws NoSuchAlgorithmException {
            MessageDigest md = MessageDigest.getInstance(ALGO_MD5);
            byte[] messageDigest = md.digest(input.getBytes());
            BigInteger number = new BigInteger(1, messageDigest);
            return String.format("%032x", number);
        }
    
        public static String decrypt(String encryptedData, String initialVectorString, String secretKey) {
            String decryptedData = null;
            try {
                String md5Key = md5(secretKey);
                SecretKeySpec skeySpec = new SecretKeySpec(md5Key.getBytes(), ALGO_AES);
                IvParameterSpec initialVector = new IvParameterSpec(initialVectorString.getBytes());
                Cipher cipher = Cipher.getInstance(TRANSFORMATION);
                cipher.init(Cipher.DECRYPT_MODE, skeySpec, initialVector);
                byte[] encryptedByteArray = Base64.decode(encryptedData.getBytes(), Base64.DEFAULT);
                byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray);
                decryptedData = new String(decryptedByteArray);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidAlgorithmParameterException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            }
    
            return decryptedData;
        }
    
    }
    

    因此,您必须创建一个initialVectorString(例如:“fedcba9876543210”)。希望这有帮助