Pet*_*zki 3 java encryption cryptography block aes
我正在使用一种非常标准的Java AES加密/解密方式.
byte[] key = hexStringToByteArray("C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF");
byte[] message = hexStringToByteArray("01A0A1A2A3A4A5A6A703020100060001");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encrypted = cipher.doFinal(message);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] original = cipher.doFinal(encrypted);
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用的是128位密钥和128位消息.我总是得到我期望的结果,但加密结果总是256位长.第二个128位始终相同.截断结果除外,如何确保密码只返回前128位,而不更改前128位?我觉得我有点混淆块大小的定义.
laz*_*laz 11
在接近你的问题之前,有几个必须要做的事情要做.我在此代码中看到的一个有潜在危险的事情是,未使用显式模式和填充指定密码.这意味着它取决于提供程序默认值.如果这是当前与Oracle JVM一起分发的提供程序,则这些默认值为ECB和PKCS5Padding.如果您想要使用它们,请以这种方式指定它们:
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
Run Code Online (Sandbox Code Playgroud)
第二个是ECB使用模式不是很好的选择,因为它不是很安全.CBC是一个更好的选择,因为它使用初始化向量.
关于这个问题.在这种情况下,加密文本大小的原因是由填充方案引起的PKCS5.填充是确保纯文本具有算法可以处理的长度所必需的.对于AES,它必须是16个字节的倍数.在未加密数据的长度已经是16个字节的倍数的情况下,填充必须添加额外的16个字节(请参阅jbtule的注释).初始化Cipher类似产生16字节的加密数据:
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
Run Code Online (Sandbox Code Playgroud)
这要求未加密的数据已经是16字节长度的倍数,因为它根本不会填充它.如果不是,则抛出异常.
了解您正在尝试做什么以提供好的建议可能是有益的.
| 归档时间: |
|
| 查看次数: |
10187 次 |
| 最近记录: |