MD5 在 C# 和 Java 之间生成不同的结果
MD5 generate different result between C# and Java
我有一个字节数组,我想在 java 和 C# 中分别计算 MD5 散列。然而,它们产生的结果却截然不同。
下面是我的 C# 代码:
byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };
MD5 md5 = MD5.Create();
byte[] result = md5.ComputeHash(input);
它生成 md5 哈希:85,126,37,15,86,254,54,94,243,185,219,84,21,17,192,153,
。
下面是 java 代码:
byte[] input = {90,12,-56,-117,85,104,9,-54,0,0,0,0,28,-5,54,-47,-23,-103,79,1};
byte[] md5 = MessageDigest.getInstance("MD5").digest(input);
结果是:
-56,-74,-89,-76,9,35,-83,-89,-73,-39,17,83,24,18,-91,-62,
如您所见,结果大不相同。我知道 c# 使用无符号字节,java 使用有符号字节。没有办法让我相信结果是相同的。
提前致谢。
你的 C# 和 Java 输入不一样。
让我们尝试将 C# 输入转换为有符号字节:
byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };
sbyte[] signedInput = input.Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", signedInput));
这输出:
90, 12, -56, -117, 85, 104, 9, -54, 0, 0, 0, 0, 28, -5, 54, -55, -23, -103, 79, 1
这里有一个不同的字节,以粗体显示。 Java 版本在此偏移处包含 -47。
为了确定,我们可以使用 Java 版本的输入进行简单检查:
var javaInput = new[] { 90, 12, -56, -117, 85, 104, 9, -54, 0, 0, 0, 0, 28, -5, 54, -47, -23, -103, 79, 1 };
var javaInputUnsigned = javaInput.Select(i => unchecked((byte)i)).ToArray();
var hash = MD5.Create().ComputeHash(javaInputUnsigned).Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", hash));
这会产生与 Java 版本相同的结果:
-56, -74, -89, -76, 9, 35, -83, -89, -73, -39, 17, 83, 24, 18, -91, -62
我有一个字节数组,我想在 java 和 C# 中分别计算 MD5 散列。然而,它们产生的结果却截然不同。
下面是我的 C# 代码:
byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };
MD5 md5 = MD5.Create();
byte[] result = md5.ComputeHash(input);
它生成 md5 哈希:85,126,37,15,86,254,54,94,243,185,219,84,21,17,192,153,
。
下面是 java 代码:
byte[] input = {90,12,-56,-117,85,104,9,-54,0,0,0,0,28,-5,54,-47,-23,-103,79,1};
byte[] md5 = MessageDigest.getInstance("MD5").digest(input);
结果是:
-56,-74,-89,-76,9,35,-83,-89,-73,-39,17,83,24,18,-91,-62,
如您所见,结果大不相同。我知道 c# 使用无符号字节,java 使用有符号字节。没有办法让我相信结果是相同的。
提前致谢。
你的 C# 和 Java 输入不一样。
让我们尝试将 C# 输入转换为有符号字节:
byte[] input = { 90, 12, 200, 139, 85, 104, 9, 202, 0, 0, 0, 0, 28, 251, 54, 201, 233, 153, 79, 1 };
sbyte[] signedInput = input.Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", signedInput));
这输出:
90, 12, -56, -117, 85, 104, 9, -54, 0, 0, 0, 0, 28, -5, 54, -55, -23, -103, 79, 1
这里有一个不同的字节,以粗体显示。 Java 版本在此偏移处包含 -47。
为了确定,我们可以使用 Java 版本的输入进行简单检查:
var javaInput = new[] { 90, 12, -56, -117, 85, 104, 9, -54, 0, 0, 0, 0, 28, -5, 54, -47, -23, -103, 79, 1 };
var javaInputUnsigned = javaInput.Select(i => unchecked((byte)i)).ToArray();
var hash = MD5.Create().ComputeHash(javaInputUnsigned).Select(i => unchecked((sbyte)i)).ToArray();
Console.WriteLine(string.Join(", ", hash));
这会产生与 Java 版本相同的结果:
-56, -74, -89, -76, 9, 35, -83, -89, -73, -39, 17, 83, 24, 18, -91, -62