Java的3DES加密在加密数据末尾产生垃圾
Java's 3DES encryption generates trash at the end of encrypted data
我有一个像这样初始化的 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 中产生错误。
我们如何防止 Cipher 注入这些额外的字节?
DES 的块大小为 64 位或 8 字节。当明文大小是明文的倍数时,使用的填充会将另一个数据块添加到用 0x08 填充的明文中。这就是 PKCS#5/PKCS#7 填充的工作原理。
您的 HSM 似乎希望不使用填充。此外,从评论中可以明显看出 "DESede"
默认为 ECB 模式,因此完全限定的密码将是:
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
请注意,ECB 模式在语义上并不安全。如果可能,请使用不同的模式,如 CBC 和密文上的 HMAC,或者只是像 GCM 这样的身份验证模式。
当您使用 NoPadding 时,明文将填充 0x00 字节,您必须 trim 自己解密明文,方法是删除末尾的所有 0x00 字节。为此,请确保明文末尾实际上不包含 0x00 字节,否则您将删除实际的明文字节。
我有一个像这样初始化的 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 中产生错误。
我们如何防止 Cipher 注入这些额外的字节?
DES 的块大小为 64 位或 8 字节。当明文大小是明文的倍数时,使用的填充会将另一个数据块添加到用 0x08 填充的明文中。这就是 PKCS#5/PKCS#7 填充的工作原理。
您的 HSM 似乎希望不使用填充。此外,从评论中可以明显看出 "DESede"
默认为 ECB 模式,因此完全限定的密码将是:
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
请注意,ECB 模式在语义上并不安全。如果可能,请使用不同的模式,如 CBC 和密文上的 HMAC,或者只是像 GCM 这样的身份验证模式。
当您使用 NoPadding 时,明文将填充 0x00 字节,您必须 trim 自己解密明文,方法是删除末尾的所有 0x00 字节。为此,请确保明文末尾实际上不包含 0x00 字节,否则您将删除实际的明文字节。