【问题标题】:AES 256 encryption by passing IV通过 IV 进行 AES 256 加密
【发布时间】:2014-06-29 13:02:07
【问题描述】:

我厌倦了将加密逻辑转换为用 C# 编写的 java。我将自定义 IV 作为参数传递。

 private static byte[] iv = new byte[] { 116,209,63,154,85,66,37,82,96,104,131,192,103,140,125,176 };

但是,在 java 中,一个字节数组不能容纳超过 128 个。在 C# 中是可能的。

        this.secretKeySpec = new SecretKeySpec(key, "AES");
        this.iv = new IvParameterSpec(iv);
        this.cipher = Cipher.getInstance(ALGORITHM_AES256);

在 javax.crypto IvParameterSpec constactory 中只允许字节数组为“iv”。任何人都可以帮助将上面的字节 [] 作为 java 中的 iv 参数传递。

【问题讨论】:

  • similar questions 可能被视为重复。
  • 你不应该首先使用静态IV。静态 IV 没用。

标签: java c# encryption aes


【解决方案1】:

问题是Java不支持unsigned datatypes,而.NET支持。

无符号字节是从 0 到 255。这是 .NET Byte struct
有符号字节从 -128 到 127。这是 Java byte 原始数据类型或 .NET SByte 结构。

.Net 代码中的数据将 iv 存储为无符号值,而 Java 代码不允许您直接这样做。

解决方案:

1) 您可以手动从 .NET 代码中的每个字节中减去 128,从而使其表示相同的位模式(IV 只是位序列 - 无论它们存储为有符号值还是无符号值都无关紧要 - 它是必须匹配的位):

byte[] iv = new byte[] { -8, 81, ...};

2) 或者您可以将相同的数据存储在 int 数据类型数组中,然后使用以下代码将它们转换为字节值。

int[] ivInInts = new int[] { 116,209,63,154,85,66,37,82,96,104,131,192,103,140,125,176 };

byte[] iv = new byte[ivInInts.getLength()];

for (int i = 0; i < ivInInts.getLength(); i++)
   iv = (byte)(ivInInts[i] - 128);

编辑:

如果您对数字的二进制等价有疑问,可以阅读two's complement numbers

65 = 0100 0001 作为无符号字节 = 0100 0001 作为有符号字节
-65 = 不能表示为无符号字节 = 1011 1111 为有符号字节
193 = 1011 1111 作为无符号字节 = 不能表示为有符号字节

【讨论】:

  • 感谢 Eugene,如果我们从数组中的每个元素中减去 -128,则结果数组的 (-) 值将与它在 C# 中传递的值不同。可以吗?
  • @Eugene Podskal 你不正确。无符号 8 位整数是从 0 到 255,有符号 8 位整数或 sbyte 是从 -128 到 127。请更正。
  • @GoRoS 谢谢。只是放错了字符串。
  • 非常感谢我的朋友。很好的解释。
【解决方案2】:

Eugene 提议的替代方案:通过强制转换为 byte,简单地显式转换所有值 - 或高于 127 的值。对二进制数据使用十六进制也是一个好主意。

byte[] test = new byte[] { 0, (byte) 0, 0x00, (byte) 0x00, (byte) 128, (byte) 0x80, (byte) 256, (byte) 0x100 };

请注意 - 最后两个字节的值应该清楚 - 这确实允许您指定超出范围的值而不会引发警告。

或者,您可以使用十六进制或 base64 解码器,因此您可以使用字符串创建更密集的字节数组表示。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多