2016-08-03 68 views
0

我有这个加密代码,这没有问题。我可以解密用另一种语言加密的文本,但我现在需要用java解密它。使用AES/ECB/PKCS5Padding进行加密时不能解密 - 输入长度必须是16的倍数

private static final String AES = "AES"; 
    private static final String CBC_BLOCK = "CBC"; 
    private static final String ECB_BLOCK = "ECB"; 
    private static final String PADDING = "PKCS5Padding"; 
    private static final String AES_CBC_PCKS5_CIPHER_CONFIG = AES + "/" + CBC_BLOCK + "/" + PADDING; 
    private static final String AES_ECB_PCKS5_CIPHER_CONFIG = AES + "/" + ECB_BLOCK + "/" + PADDING; 

public static String encryptInAesEcbPkcs5Padding(String salt, String message) { 
     String encryptedMessage = ""; 
     SecretKeySpec key = null; 
     try { 
      if (message != null && !message.equals("")) { 
       key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES); 
       Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG); 
       cipher.init(Cipher.ENCRYPT_MODE, key); 
       encryptedMessage = convertMessageToBase64(cipher.doFinal(message.getBytes(StandardCharsets.UTF_8))); 
      } 
     } catch (NoSuchAlgorithmException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e); 
     } catch (NoSuchPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e); 
     } catch (IllegalBlockSizeException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e); 
     } catch (BadPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e); 
     } catch (InvalidKeyException e) { 
      LOGGER.error("Invalid key [" + key + "]", e); 
     } 
     return encryptedMessage; 
    } 

试图用此代码解密。我使用的是完全相同的盐作为加密和传递的字符串中的加密创建的“消息”

public static String decrypt(String message, String salt) throws InvalidAlgorithmParameterException { 
     SecretKeySpec key = null; 
     String string = null; 
     try { 
      if (message != null && !message.equals("")) { 
       key = new SecretKeySpec(salt.getBytes(StandardCharsets.UTF_8), AES); 
       Cipher cipher = Cipher.getInstance(AES_ECB_PCKS5_CIPHER_CONFIG); 
       cipher.init(Cipher.DECRYPT_MODE, key); 
       byte[] decrypted = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8)); 
       string = new String(decrypted); 
      } 
     } catch (NoSuchAlgorithmException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such algorithm [" + AES + "]", e); 
     } catch (NoSuchPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "No such padding for algorithm [" + AES + "]", e); 
     } catch (IllegalBlockSizeException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid block size for [" + AES + "/" + ECB_BLOCK + "]", e); 
     } catch (BadPaddingException e) { 
      LOGGER.error(LogPreFix.ERROR + "Invalid padding [" + PADDING + "]", e); 
     } catch (InvalidKeyException e) { 
      LOGGER.error("Invalid key [" + key + "]", e); 
     } 
     return string; 
    } 

,但我得到这个错误,我究竟做错了什么?似乎它应该工作。我试着用“=”填充加密的文本,直到它被16整除,但是返回一个错误的填充错误。

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750) 
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2087) 
+1

这可能是有帮助的:http://stackoverflow.com/a/5760584/1416629 – pratnala

+2

为什么不在解密之前执行base64解码? – Robert

+0

^这也是。做base64解码并取回 – pratnala

回答

1

首先进行Base64解码以反转原始加密过程中执行的Base64编码。

相关问题