gpt4 book ai didi

Java的3DES加密在加密数据末尾产生垃圾

转载 作者:行者123 更新时间:2023-12-01 11:56:07 26 4
gpt4 key购买 nike

我有一个 3des Cipher 对象,其初始化如下:

KeySpec keySpec= new DESedeKeySpec(bytesKey);
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey secretKey= secretKeyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(modo, secretKey);

使用该对象加密数据时,不会抛出异常,算法成功结束:

String unencryptedText = "192 character length text in clear....        ";
byte[] bytesUnencryptedText = unencryptedText.getBytes("UTF8");
byte[] bytesEncryptedData = cipher.doFinal(bytesUnencryptedText);

当我们查看 doFinal 生成的加密数据时,我们注意到返回了 200 个字节,而不是我们预期的 192 个字节。这些额外的 8 个字节采用以下十六进制值:08。

前 192 字节是正确的,我们已经能够解密它们并获取原始数据。但额外的 8 个字节在我们的 HSM 中产生错误。

我们如何防止密码注入(inject)这些额外的字节?

最佳答案

DES 的 block 大小为 64 位或 8 字节。当明文大小是明文的倍数时,使用的填充将向用 0x08 填充的明文添加另一个数据 block 。这就是 PKCS#5/PKCS#7 填充的工作原理。

您的 HSM 似乎希望不使用填充。另外,从评论中可以明显看出 "DESede" 默认为 ECB 模式,因此完全限定的密码将是:

Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");

请注意,ECB 模式在语义上并不安全。如果可能,请使用不同的模式,例如在密文上使用 HMAC 的 CBC,或者仅使用经过身份验证的模式,例如 GCM。

当您使用 NoPadding 时,明文会被 0x00 字节填充,您必须自己删除末尾的所有 0x00 字节来修剪解密的明文。为此,请确保明文末尾实际上不包含 0x00 字节,否则您将删除实际的明文字节。

关于Java的3DES加密在加密数据末尾产生垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28438124/

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