【发布时间】:2017-08-06 12:14:48
【问题描述】:
我想在 JAVA 和 Linux 中进行 aes-128-cbc 加密,但它总是给我不同的结果。 例如我想解码字符串“my.txt”。在 Linux 中,我是这样做的:
echo -n my.txt | openssl aes-128-cbc -K 6f838655d1bd6312b224d3d1c8de4fe1 -iv 9027ce06e06dbc8b -a
我还将它编码为 base64,它给了我这个结果:86M5fwdUpQ3tbFrz0ddHJw==
在 Java 中我使用这种方法:
public static String encrypt(String key, String initVector, String value) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string: "
+ Base64.encodeToString(encrypted, Base64.DEFAULT));
return Base64.encodeToString(encrypted, Base64.DEFAULT);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
使用相同的数据,它会给我完全不同的结果:vgk6yxCrQ5iLFvHxMtQO7w==
我还尝试使用具有 32 个符号长度 iv 的 aes-256-cbc。在 Linux 中,我使用 aes-256-cbc,在 Android 中,我使用 Spongy Castle 库来实现此目的,但它也给出了不同的结果。
我做错了什么?或者您可能有建议选择不同的跨平台算法进行加密。
【问题讨论】:
-
既然AES是一个定义明确且众所周知的标准,算法其实是一样的。我敢肯定,问题在于输入。各种输入(键、iv、数据)的实际字节是否都相同?请注意,字节和字符不是一回事。字符集或编码是它们之间的关系。还要验证您对两者使用相同的填充。
标签: java android encryption openssl aes