Java MD5散列与C#MD5散列不匹配

我对加密/散列知之甚少。

我必须哈希加密密钥。 Java中的例子是这样的……

String encryptionKey = "test"; MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length()); byte[] encryptionKeyBytes = messageDigest.digest(); 

现在纠正我,如果我错了,但上面的代码用MD5算法哈希字符串。

当我在C#中散列相同的字符串时,我想要相同的结果。

我目前的C#代码看起来像这样……

 string encryptionKey = "test"; var md5 = MD5.Create(); var keyBytes = Encoding.UTF8.GetBytes(encryptionKey); byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes); 

但结束字节结果不匹配。

Java得到……

 [0] 9 [1] -113 [2] 107 [3] -51 [4] 70 [5] 33 [6] -45 [7] 115 [8] -54 [9] -34 [10] 78 [11] -125 [12] 38 [13] 39 [14] -76 [15] -10 

C#得到……

  [0] 9 byte [1] 143 byte [2] 107 byte [3] 205 byte [4] 70 byte [5] 33 byte [6] 211 byte [7] 115 byte [8] 202 byte [9] 222 byte [10] 78 byte [11] 131 byte [12] 38 byte [13] 39 byte [14] 180 byte [15] 246 byte 

我需要我的C#代码来获得与Java代码相同的结果(不是相反),任何想法?

谢谢。

实际上,结果一样的。 与其他整数类型一样,字节值可以解释为有符号或无符号。 例如,如果解释为无符号,则10001111将对应于143 (您的第二个C#值)。 但是,如果解释为signed (使用二进制补码 ),则其值为-113 (您的第二个Java值)。

因此,差异似乎是由于您的值被格式化为Java签名但在C#中未签名。 如果要在C#中获取带符号的字节,可以使用:

 sbyte[] encryptionKeyBytesSigned = encryptionKeyBytes.Select(b => (sbyte)b).ToArray(); 

但是,请注意,这不仅仅是在显示值时出现的格式问题。 保存到文件时,两个结果应该相同。