【问题标题】:AES Encryption/Decryption : Given final block not properly paddedAES 加密/解密:给定最终块未正确填充
【发布时间】:2015-05-22 13:50:53
【问题描述】:

我正在尝试编写加密或解密字符串的方法(主要是数字)。它适用于某些文本(例如 - '1010000011'、'1010000012'、'1010000013'),但会出现以下错误(例如 - '1010000014'、'1010000018'):

javax.crypto.BadPaddingException:给定的最终块不正确 填充

这是我的代码:

public static SecretKey secKey;
private static IvParameterSpec ivspec;
static {
    try {
        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
        KeySpec spec = new PBEKeySpec("i15646dont6321wanna".toCharArray(),
                "ahhalkdjfslk3205jlk3m4ljdfa85l".getBytes("UTF-8"), 65536, 256);
        SecretKey tmp = factory.generateSecret(spec);
        secKey = new SecretKeySpec(tmp.getEncoded(), "AES");
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        ivspec = new IvParameterSpec(iv);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException | UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

public static String encryptData(String textToEncrypt) {

    byte[] encryptedBytes = null;
    String encryptedText = "";
    try {
        byte[] byteToEncrypt = textToEncrypt.getBytes(Charset.defaultCharset());
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secKey, ivspec);
        encryptedBytes = cipher.doFinal(byteToEncrypt);
        encryptedText = new String(encryptedBytes);
    } catch (NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException
            | InvalidKeyException | NoSuchPaddingException | InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }
    return encryptedText;
}

public static String decryptData(String textToDecrypt) {

    byte[] decryptedBytes = null;
    String decryptedText = "";
    try {
        byte[] byteToDecrypt = textToDecrypt.getBytes(Charset.defaultCharset());
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secKey, ivspec);
        decryptedBytes = cipher.doFinal(byteToDecrypt);
        decryptedText = new String(decryptedBytes);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
            | IllegalBlockSizeException | BadPaddingException
            | InvalidAlgorithmParameterException e) {
        e.printStackTrace();
    }
    return decryptedText;
}

要加密的字符串从文件中读取,加密后写入其他文件。这个加密的文本必须在以后解密。我以下列方式调用这些方法:

String[] lineArray = line.split(" | "); //line is read from a file. 
String encryptedText = AESEncryption.encryptData(lineArray[0]);
String decryptedText = AESEncryption.decryptData(encryptedText);
System.out.println("Original Text: " + lineArray[0] + " | Encrypted text: "
                + encryptedText + " | Decrypted again: " + decryptedText);

【问题讨论】:

  • 在将字符串转换为字节数组时,如果我使用 UTF-8 或 UTF-16,解密时会抛出异常: javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded密码

标签: java encryption cryptography aes badpaddingexception


【解决方案1】:

您正在尝试将加密数据作为字符串传递。这是致命的。加密数据是字节,而不是字符串。使用 Base64 转换实用程序将加密字节转换为 Base64 字符串。

加密:明文 -> 加密字节 -> Base64 文本。

解密:Base64 文本 -> 加密字节 -> 解密文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 2015-10-07
    • 2017-03-17
    • 2014-01-22
    • 2014-07-26
    • 2013-12-02
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多