1

我有一个密钥,并且我想使用这个密钥解密数据,但是出现 Given final block not proper padded 错误。

 Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));
    byte[] encryptedBytes_updates = cipher.update(encryptedBytes);
    String decryptedText = new String(cipher.doFinal(encryptedBytes_updates));

我尝试了一些来自论坛的建议,但没有运气。

可能有人可以帮忙吗?

4

1 回答 1

4

如果您正在解码的消息小于 16 字节,则问题之一可能是您使用了错误的 IV。具体来说,这一行是不正确的:

cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));

您正在IvParameterSpec从全 0 的字节数组创建一个(因为您刚刚创建了它,但没有用任何数据填充它)。如果您在加密时做同样的事情,这就是加密/解密在本地为您工作的原因。

您需要做的是IvParameterSpec使用包含服务器发送给您的 IV 的字节数组来创建。如果服务器没有在单独的字段中向您发送 IV,则可能是 IV 已预先或附加到您收到的加密数据中(这是一种相当普遍的做法)。我会尝试提取加密数据的第一个块(16 个字节)并将其用作 IV。如果这不起作用,请尝试最后一个加密数据块。或者更好的是,询问运行服务器的人或阅读手册以确定从何处获取 IV。

此外,这看起来也不正确:

byte[] encryptedBytes_updates = cipher.update(encryptedBytes);
String decryptedText = new String(cipher.doFinal(encryptedBytes_updates));

你为什么要把encryptedBytes_updates它反馈给密码?update解密数据,然后您尝试再次使用doFinal. 改为这样做:

String decryptedText = new String(cipher.doFinal(encryptedBytes));
于 2013-08-08T11:36:17.173 回答