BadPadding Exception使用相同的密码实例

时间:2016-08-03 20:15:00

标签: java encryption

我有这个加密代码没有问题。我可以用另一种语言解密它加密的文本,但我现在需要在java中解密它。

 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("")) {
  String decoded = convertBase64ToMessage(message.getBytes(StandardCharsets.UTF_8));
                    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(decoded.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;
        }

但是我收到了这个错误,因为我使用的是与加密时相同的Cipher实例,我不知道为什么我无法解密该消息。

javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
    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 个答案:

答案 0 :(得分:3)

convertBase64ToMessage不应返回String,而应返回byte[],因为密文不能用可打印的字符串表示(概率很高)。