gpt4 book ai didi

Java CryptoCipher 不消耗所有输入字节

转载 作者:行者123 更新时间:2023-12-01 17:59:31 25 4
gpt4 key购买 nike

我正在尝试从使用 Chilkat 的专有解密库转换为 Apache 的公共(public)加密。我正在使用 2 个加密输入示例。第一个是 16 字节,第二个是 96 字节。第一个效果很好,但在第二个上,CryptoCipher 似乎没有消耗最后 16 个字节。

以下是设置和解密以及输出的一些示例代码:

   Properties properties = new Properties();
CryptoCipher crypt = CryptoCipherFactory.getCryptoCipher("AES/CBC/PKCS5Padding", properties);
MessageDigest digest = MessageDigest.getInstance("SHA-256");

byte[] hashedKeyBytes = digest.digest("SHARED_SECRET".getBytes(
StandardCharsets.UTF_8));
MessageDigest ivDigest = MessageDigest.getInstance("MD5");

byte[] ivBytes = ivDigest.digest("SHARED_SECRET".getBytes(StandardCharsets.UTF_8));
final SecretKeySpec key = new SecretKeySpec(hashedKeyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);

crypt.init(Cipher.DECRYPT_MODE, key, iv);

ByteBuffer encBuffer = ByteBuffer.allocateDirect(enc.length);
System.out.println("--" + enc.length);
encBuffer.put(enc);
encBuffer.flip();
System.out.println("encln " + encBuffer.limit());

ByteBuffer decoded = ByteBuffer.allocateDirect(bufferSize);
CryptoCipher crypt = init();

System.out.println("consume " + crypt.update(encBuffer, decoded));
System.out.println("finish " + crypt.doFinal(encBuffer, decoded));
decoded.flip();
return asString(decoded);

这会为 2 个输入产生这 2 个输出:

简短输入:

--16
encln 16
consume 0
finish 13

长输入:

--96
encln 96
consume 80
finish 3

正如您所看到的,它只消耗了输入中的 80 个字节...由于与 Chilkat 生成的输出相比,较短的输入会产生正确的输出,因此我不确定如何处理它才能使其与更长的输入。

最佳答案

crypt.update()crypt.doFinal(..) 返回的数字是解密的字节数,而不是操作消耗的字节数。当您的数据被填充时(或者至少您将其指定为PKCS5Plated),您的加密数据将始终比解密版本大一点。对于 PSCS5AES,填充将添加 1 到 16 个字节的填充到最接近的 16 字节的乘数,即 AES 的 block 大小。

在第一个示例中,13 字节的明文数据有 3 字节的填充,提供 16 字节的加密数据(或一个完整的 AES block )。在第二个示例中,您有 83 字节的明文数据和 13 字节的填充(提供 6 个 16 字节的 AES block )。

关于Java CryptoCipher 不消耗所有输入字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42147559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com