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

AES/CBC/PKCS5padding错误的解密:给定的最终块没有正确填充

汪博达
2023-03-14

加密

void encrypt() throws Exception{
    char[] password = passwordText.getText().toCharArray();
    byte[] salt = new byte[8];

    /* Creating and saving salt */
    salt = saveSalt(salt);

    /* Securing password */
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
    SecretKey tmp = factory.generateSecret(spec);
    SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

    if (choosedFile != null) {
        /* Choosing algorithm for decryption */
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        /* Getting plain file */
        CipherInputStream fis = new CipherInputStream(new  FileInputStream(choosedFile), cipher);
        CipherOutputStream fos = new CipherOutputStream(new FileOutputStream(choosedFile+".encrypted"), cipher);

        /* Encrypting and Measuring */
        long startTime = System.currentTimeMillis();
        cipher.init(Cipher.ENCRYPT_MODE, secret);
        byte[] rawText = new byte[128];
        int count;
        while((count = fis.read(rawText)) > 0) {
            System.out.println(count);
            byte[] encryptedText = cipher.doFinal(rawText);
            fos.write(encryptedText, 0, count);
        }
        long stopTime = System.currentTimeMillis();

        fis.close();
        fos.close();

        /* Creating initialization vector and storing*/
        byte[] iVector = cipher.getIV();
        saveIVector(iVector);

        text.setText(text.getText() + "File was encrypted in " + (stopTime - startTime) + "ms.\n");
    }

}

解密:

    void decrypt() throws Exception {
    /* Getting salt */
    byte[] salt = getSalt();
    /* Getting initialization vector */
    byte[] iVector = getIVector();
    /* Getting user password */
    char[] password = passwordText.getText().toCharArray();


    /* Securing password */
    SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
    KeySpec spec = new PBEKeySpec(password, salt, 65536, 128);
    SecretKey tmp = factory.generateSecret(spec);
    SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

    if (choosedFile != null) {

        /* Choosing algorithm for decryption */
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        /* Getting ciphered file */


        CipherInputStream fis = new CipherInputStream(new  FileInputStream(choosedFile), cipher);
        CipherOutputStream fos = new CipherOutputStream(new FileOutputStream(choosedFile+".decrypted"), cipher);

        /* Decrypting and Measuring */
        long startTime = System.currentTimeMillis();
        cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iVector));
        byte[] rawText = new byte[128];
        int count;
        while((count = fis.read(rawText)) > 0) {
                byte[] encryptedText = cipher.doFinal(rawText);
                fos.write(encryptedText, 0, count);
            }

        long stopTime = System.currentTimeMillis();

        fis.close();
        fos.close();

共有1个答案

上官和惬
2023-03-14

担心“直到我不得不把大文件切成固定大小的块”。

使用“chunk”代替上面的“block”,因为“block”在像AES这样的分组密码中有特定的含义。

玩具用这些块做什么,把它们连接起来?

在CBC模式下,在第一个块之后,上一个加密的块值被有效地用作下一个块的IV。因此,在拆分和连接块时,前一个块的最后一个块的值是下一个块的IV。

参见CBC模式。

还是你在做完全不同的事情?

 类似资料:
  • 我正在尝试编写方法来加密或解密字符串(大部分是数字)。它适用于某些文本(例如-'1010000011'、'1010000012'、'1010000013'),但也适用于其他文本(例如-'1010000014'、'1010000018'): javax.crypto.BadPadding异常:给定最后一个块没有正确填充 这是我的代码: 要加密的字符串从文件中读取,并在加密后写入其他文件。这些加密的文

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

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

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

  • 现在在php部分,我的代码是: 它给我一个警告:警告:openssl_encrypt():IV传递的是24字节长,比所选密码预期的16字节长,在第68行的C:\xampp2\htdocs\standardfinalinserting.php中截断 在Java部分,我的解密方法与我的问题的答案完全相同,但在运行后,它给我一个错误:Java.security.invalidkeyexception:行

  • 我正在加密字符串并将其存储在客户端的cookie中。。但是,当我从js向java代码发送完全加密的字符串时,它给出了前面提到的异常。 我用于加密和解密的代码是: 你能告诉我问题是什么吗??我尝试过stackoverflow上提到的解决方案。com和其他一些解决方案,但都不起作用。。我收到这个错误是因为我将加密字符串发送到JS,而它正在更改字符串的填充吗?