Decryption error on Android 4.4

匿名 (未验证) 提交于 2019-12-03 08:44:33

问题:

I have algorithm of encryption\ decryption files:

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

It works great, but on Android 4.4 (api 19) I have strangely exception

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

What is it?

回答1:

Here what I got: 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;     }  } 

So you have to create a initialVectorString (example: "fedcba9876543210"). Hope this help.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!