【问题标题】:AES-128-CBC is different in Java and LinuxAES-128-CBC 在 Java 和 Linux 中是不同的
【发布时间】: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 库来实现此目的,但它也给出了不同的结果。

我做错了什么?或者您可能有建议选择不同的跨平台算法进行加密。

【问题讨论】:

标签: java android encryption openssl aes


【解决方案1】:

-K-iv 参数需要十六进制编码的字符串。您的密钥长度为 32 个字符,因此它是 16 个字节或 128 位。您的 IV 有 16 个字符长,因此它是 8 个字节或 64 位。 AES/CBC 的 IV 必须正好是 128 位长。如果不是,则必须以某种方式对其进行填充。您的 IV 很可能用 0x00 字节填充以达到 128 位。你必须在 Java 中做同样的事情。

另一个问题是您将十六进制编码的密钥和 IV 视为文本,这意味着您将其视为 Java 中的 256 位密钥和 128 位 IV。这可能不是你想要的。您必须在使用前从十六进制解码字符串。

让我们使用byte[] fromHex(String hexStr)的假想实现:

byte[] ivBytes = new byte[16];
byte[] ivBytesShort = fromHex(initVector);
System.arraycopy(ivBytesShort, 0, ivBytes, 0, ivBytesShort.length);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
SecretKeySpec skeySpec = new SecretKeySpec(fromHex(key), "AES");

【讨论】:

  • 是的,我最初的 iv 是 32 个字符长,但它给了我关于 iv 长度的错误,现在我明白了为什么。是的, fromHex() 正在工作并且它给出了正确的结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 2021-09-13
  • 2013-08-11
  • 2018-12-31
  • 2018-04-04
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多