Java MD5 哈希与 C# MD5 哈希不匹配

本文关键字:MD5 哈希 不匹配 Java | 更新日期: 2023-09-27 18:37:08

我对加密/哈希知之甚少。

我必须对加密密钥进行哈希处理。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);

但是结束字节结果不匹配。

爪哇得到...

[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 代码相同的结果(而不是相反),有什么想法吗?

谢谢。

Java MD5 哈希与 C# MD5 哈希不匹配

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

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

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

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