4

我正在与合作伙伴进行集成,该合作伙伴使用 JavaBigInteger生成字节数组作为简单加密算法的密钥。我试图在没有太多运气的情况下找到等效的 .NET 代码。

他们使用的 Java 代码是:

String keyString = "48B734DA47388C656913C9BF5146E186";
byte key[] = new BigInteger(keyString, 16).toByteArray();

产生以下byte数组:

[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

仅此一项就令人不安,因为byte.NET 中的 s 范围为 0-255,因此负值超出范围。

我想出的最接近的 .NET 代码是:

string keyString = "48B734DA47388C656913C9BF5146E186";
byte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray();

产生以下byte数组:

[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

在这一点上,我认为 .NET 等价物根本不可能——尤其是因为负值byte

我期待大家的想法。

4

3 回答 3

7

使用评论中提供的 LINQ 方法 I4V 可以轻松解决它。

  sbyte[] key = BigInteger.Parse(keyString, NumberStyles.HexNumber).ToByteArray().Reverse().Select(x => (sbyte)x).ToArray();

这将为您提供所需的阵列。.NET 默认使用无符号字节,而 Java 默认使用有符号字节。它们具有相同的位表示,因此,根据您使用它的方式,使用哪一个实际上可能并不重要,但是,如果您想要在 .NET 中获得真正等效的输出,则需要使用 sbytes 代替字节数,因为简单地使用字节在两种语言之间意味着不同的东西。

于 2013-05-28T17:47:26.020 回答
3

当我比较 Java 的 2 结果时:

[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

来自.Net

[134, 225, 70, 81, 191, 201, 19, 105, 101, 140, 56, 71, 218, 52, 183, 72]

我可以说:

  1. 它们看起来很相似 - .Net 只是顺序相反(java 的内部表示是 Big Endian 的结果)。
  2. 在 .Net 结果中,没有负数。
  3. 以相反的顺序比较结果表明-73183.Net中

所以我认为我们可以说结果是相同的,但需要检查字节顺序是否相同并且符号是否保持不变。

你能显示打印这些结果的代码吗?

于 2013-05-28T17:41:47.657 回答
2

看起来 .Net 的结果与 java 结果相反,但它们是相同的值。然而,.Net 字节是无符号的,而不是有符号的 java 字节(如您所见,包含负数)。您可以将获得的结果转换为有符号字节(sbyte),也可以颠倒顺序:

sbyte[] finalResult = (sbyte[])(Array)key.Reverse().ToArray();

结果:[72, -73, 52, -38, 71, 56, -116, 101, 105, 19, -55, -65, 81, 70, -31, -122]

应该注意的是,位表示将是相同的,因此,如果您将其用作某些加密的密钥并在位级别上对其进行操作,您可能不需要获取实际的有符号字节(sbyte),但它会如果您这样做,可能会使从 java 到 .Net 的转换更容易可视化。

于 2013-05-28T17:45:26.833 回答