繁体   English   中英

Java密码AES不加密整个字符串

[英]Java Cipher AES not encrypting whole String

我正在尝试使用带有 AES 算法的 java Cipher 加密和解密字符串。 但不知何故它不想加密整个字符串。 我的目标不是安全地加密某些特定的东西,我希望有人不能很容易地读取字符串(后来存储在文件中)。

要加密,我使用以下代码:

Cipher cipher = Cipher.getInstance("AES");
byte[] input = plain.getBytes();
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(input);

return new String(encrypted);

为了解密,我使用以下代码:

Cipher cipher = Cipher.getInstance("AES");
byte[] input = encrypted.getBytes();
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decrypted = cipher.doFinal(input);

return new String(decrypted);

为了测试上面提到的代码,我使用了以下参数:

SecretKeySpec key = new SecretKeySpec(new byte[]{103,38,125,-67,-71,-23,-119,102,78,-3,-33,-23,-5,32,-112,-124}, "AES");
String plain = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur auctor ornare bibendum."

该测试导致加密然后再次解密的字符串:

�T���Ѩ�%���Kr sit amet, consectetur adipiscing elit. Curabitur auctor ornare bibendum.

有几个问题:

byte[] encrypted = cipher.doFinal(input);
return new String(encrypted);

问题是你不能只是“字符串化”一个字节数组,你需要用不同的格式来表示字节数组,比如 Base64 或 Hex。 字符串仅用于可打印字符。

将字节数组转换为字符串并返回到字节数组的问题

byte[] encrypted = cipher.doFinal(input);
return Base64.getEncoder().encodeToString(encrypted);

同样的方式 - 您需要在解密之前将编码的字符串解码为字节数组。

编辑:

另一个问题 - 您应该指定完整 的操作模式

默认情况下,如果提供了 IV(初始化向量),则“AES”参数应使用 CBC 模式,如果未定义 IV,则应使用 ECB 模式(据我所知,这至少是 Oracle JDK 的工作方式)。

不能保证所有运行时。 您使用的是哪个平台/jre? . 由于您的第一个字节块被打乱,我假设实现使用的是随机 IV(您可以使用 cipher.getIV()),并且您必须在解密时传递 IV。

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec ivParamSpec = new IvParameterSpec(iv);
SecretKey symmetricKey = new 
SecretKeySpec(encryptionParams.getKey(), SYMMETRIC_KEY_ALG);

cipher.init(Cipher.ENCRYPT_MODE, symmetricKey, ivParamSpec);

对于 CBC,IV 必须是 AES 块大小(128 位 = 16 字节)长度的随机字节数组,通常的做法是在密文前添加 IV。

请务必了解有关正确使用加密的知识,否则您最终可能会得到不安全的解决方案。

我有一个您可以尝试使用的小型参考项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM