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

Java AES解密导致BadPaddingException

朱海超
2023-03-14

我正在尝试创建AES加密/解密方法,但是如果不使用AES / ECB / NoPadding,我似乎无法获得原始输入。现在我正在尝试使用AES / CBC / PKCS7Padding。我已经确认在文件中读取和写入字节工作正常。使用PKCS7填充,我从中得到一个糟糕的填充异常

cipher.doFinal(encrypted)

在解密方法中。没有填充,没有例外 - 但是输出是混乱的。我花了很多时间浏览有关此完全相同问题的其他帖子,但我似乎找不到适合我问题的解决方案。

我如何解读输出?

protected boolean encrypt(String place, String encrypt) {
    try {

        // encrypt the text
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(encrypt.getBytes());

        Context context = HomeViewActivity.hva.getApplicationContext();
        FileOutputStream writer = context.openFileOutput(file_name.get(place.toUpperCase()), Context.MODE_PRIVATE);
        writer.write(encrypted);
        writer.close();
        return true; //successfully wrote encrypted string to file
    }catch(Exception e) {
        e.printStackTrace();
    }
    return false;
}
protected String decrypt(String place){
    String decrypted = null;
    try{
        Context context = HomeViewActivity.hva.getApplicationContext();
        // decrypt the text
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        FileInputStream reader = context.openFileInput(file_name.get(place.toUpperCase()));
        byte[] encrypted = new byte[reader.available()];
        reader.read(encrypted);
        reader.close();
        decrypted= new String(cipher.doFinal(encrypted));
    }catch(FileNotFoundException e){return null;}
    catch(IllegalBlockSizeException |
            BadPaddingException |
            InvalidKeyException |
            NoSuchAlgorithmException |
            IOException |
            NoSuchPaddingException e){e.printStackTrace();}
    return decrypted;
}

编辑1:使从文件中读入的加密数组具有适当的大小

编辑2:在构造函数中初始化密钥和密码,而不是每个方法

共有1个答案

轩辕远
2023-03-14

问题是欧洲央行不使用IV,而CBC和大多数其他操作模式确实使用IV值。Java在没有明确给出IV值时随机化,这意味着解密后的明文不正确。

对于AES CBC模式,这意味着明文的前16个字节(初始块)包含随机字符。由于初始块之后的块包含普通明文,因此在代码中不会出现BadPaddingException

这个问题的正常解决方案是先将IV值作为密文的前缀或将其写入底层流。不用说,您必须在解密期间检索IV并通过更改缓冲区中的偏移量或推进流来跳过解密期间的IV值(对于您可能不想复制整个密文的文件)。

 类似资料:
  • 我有一个应用程序,需要在配置文件中存储一些秘密密码,如数据库和ftp密码/详细信息。我环顾四周,发现了许多使用AES的加密/解密解决方案,但我似乎不知道如何在不改变密钥的情况下使其工作。这意味着我可以加密和解密(使用相同的秘密密钥),但在重启等过程中保持持久性。我似乎无法让秘密钥匙保持不变。下面的示例显示了我的工作方法: 到目前为止还不错。然而,如果我运行它一次,我可能会得到'2Vhht/L80U

  • 以下示例有什么问题? 问题是解密字符串的第一部分是无意义的。不过,其余的都很好,我明白了...

  • 我已经决定在我的服务中实现文件传输的加密。在此之前的文件传输是没有加密的,它们的发送和接收都是完美无缺的,字节数完全相同。 现在,我将和加密引入到混合加密中,以便在数据通过TCP协议时对其进行加密。我使用进行初始握手,将密钥传递给由公钥加密的另一方。从那时起,文件的接收方定期调用发送方,发送方生成一个新的,用密钥加密数据,并发送给接收方,由接收方使用IV和相同的密钥解密。 我使用的块大小为2MB,

  • 我试图加密,然后解密文件使用Crypt::CBC 在perl。当加密后解密我的密文时,我在恢复的明文末尾丢失了一些字节。 加密方法: 我的纯文本如下所示: 然后我用以下方法解密我的密文: 以及随后的明文:

  • 我试图解组xml导致saxparser异常,因为元素的值有一个未正确关闭的标记元素。这是我得到的,我必须处理的。 这里是示例xml- 上面的xml和其他字符串一起作为命令的值,标签没有正确关闭,导致以下异常- [org.xml.sax.saxpasseeption;行号:1;列号:212;元素类型“ctag”后面必须跟有属性规范,” 将xml输入作为字符串阅读器提供给unMarshall 我有两个

  • 使用EVP_BytesToKey()返回错误的key和iv可能出了什么问题? 我试过用iter计数值做实验,但似乎没有一个能产生工作键和IV。我假设命令行默认的iter计数是1。 同样确认的是,如果我用命令行显示的工作键和iv覆盖从EVP_BytesToKey()返回的内容和硬代码无符号char数组,我的其余代码工作正常,解密正确。 有人能帮忙吗?