当前位置: 首页 > 知识库问答 >
问题:

AES加密/解密:给定的最终块未正确填充

常永长
2023-03-14

我正在尝试编写方法来加密或解密字符串(大部分是数字)。它适用于某些文本(例如-'1010000011'、'1010000012'、'1010000013'),但也适用于其他文本(例如-'1010000014'、'1010000018'):

javax.crypto.BadPadding异常:给定最后一个块没有正确填充

这是我的代码:

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

共有1个答案

柳胜
2023-03-14

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

加密:明文-

解密:Base64文本-

 类似资料:
  • 首先,我会告诉你我的主要目标是什么。在客户端使用AES加密部分内容,然后使用RSA公钥加密重要的AES规范,并将AES加密数据和RSA加密的AES规范发送到服务器端。所以在服务器端,我将使用RSA私钥解密AES密钥规范,然后使用这些AES规范,我将解密AES加密数据。通过测试加密和解密,我成功地使RSA部分工作。在此实现RSa之前,我必须使AES art工作。 对于客户端,我使用crypto-js

  • 我正在做一个简单的加密文件传输系统,现在停止运行时异常: 我试图用一个字符串调试我的代码,用相同的密钥加密和解密,它是有效的。然而,当我试图从文件传输流时,这个异常总是出现。 以下是双方的代码。首先,他们将通过RSA交换对称密钥(AES密钥),然后通过AES加密传输大型文件。我们可以关注每段代码的最后一部分,其中文件通过AES密钥进行加密和解密。 服务器端: 客户端:

  • 问题内容: 我需要有关此错误的帮助:给最终块未正确填充。从标题中可以看到,我正在使用AES。 这是错误的行代码: 这是完整的代码: } 问题答案: 根据您的评论,您几乎可以使加密工作。 您需要将IV生成代码从您的加密/解密方法移动到其他地方,就像这样 然后将该ivspec传递到加密和解密方法中(使它们看起来像),这样您就可以为加密和解密使用相同的iv。 另外,不要调用decryptedByteAr

  • 我想加密EnteredDetails(java bean)类型的arraylist,并将其序列化到一个文件中。我正在关注AES-128位加密的链接:http://www . code 2 learn . com/2011/06/encryption-and-decryption-of-data-using . html 要使用aes class的encrypt方法,我必须将arrarylist转换

  • 问题内容: 我正在尝试实现基于密码的加密算法,但出现此异常: javax.crypto.BadPaddingException:给定的最终块未正确填充 可能是什么问题? 这是我的代码: (JUnit测试) 问题答案: 如果尝试使用错误的密钥解密填充了PKCS5的数据,然后取消填充(由Cipher类自动完成),则很可能会收到BadPaddingException(可能略小于255/256,约为99.