我对加密/散列知识了解甚少。

我必须对加密密钥进行散列。 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代码相同的结果(不是相反),有什么想法吗?

谢谢。

评论

Java的字节已签名。 C#字节不是。请注意,只有Java字节为负的位置是错误的。

除了相等的结果之外,您在Java代码中还有一个非常严重的错误:encryptionKey.getBytes(“ UTF-8”),0,encryptionKey.length()我留给您看看错误是什么。最后比较直接字符串表示形式(toString)总是一个坏主意

@bestsss我正在使用断点检查值。我认为断点值是从toString表示形式产生的(可能是错误的)。您将如何比较字节值?

无符号十六进制通常是提供byte []的规范,因为您可以很容易地看到两个字节。顺便说一句,您发现错误在哪里吗?

@bestsss它使用byte []数组存储数据,并且长度来自字符串(而不是byte [])。那是你指出的吗?如果没有,我不知道。该Java代码是发送给我的加密/解密演示。我必须编写C#才能产生相同的结果。

#1 楼

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

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

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


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

评论


谢谢您的回答...如果我正确阅读,那最后一条陈述似乎是矛盾的。如果将两者都保存到文件中并且它们相同,那么这仅仅是显示值时出现的格式问题。你能澄清一下吗?我将使用此散列值(在byte []中)并将其用作加密密钥。因此,如果仅是一个显示性的问题,我认为无需转换就可以。我不认为加密功能将使用sbyte []而不是byte []。

– Theo
2012年6月14日18:51



N / m。您只是警告我要检查并确保。我知道了。

– Theo
2012年6月14日18:54

@Theo:是的,我认为这是一个格式问题,保存到文件中时,即使不将C#值转换为带符号字节,生成的文件也应该相同。但是,老实说,我对Java不太熟悉(我只能担保您的C#代码),因此我将进行一些测试以确保。

–道格拉斯
2012年6月14日18:58

您是正确的格式问题。写入文件时,两者都显示相同的乱码。感谢您的帮助。

– Theo
2012年6月14日19:11