我必须对加密密钥进行散列。 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代码相同的结果(不是相反),有什么想法吗?
谢谢。
#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
评论
Java的字节已签名。 C#字节不是。请注意,只有Java字节为负的位置是错误的。除了相等的结果之外,您在Java代码中还有一个非常严重的错误:encryptionKey.getBytes(“ UTF-8”),0,encryptionKey.length()我留给您看看错误是什么。最后比较直接字符串表示形式(toString)总是一个坏主意
@bestsss我正在使用断点检查值。我认为断点值是从toString表示形式产生的(可能是错误的)。您将如何比较字节值?
无符号十六进制通常是提供byte []的规范,因为您可以很容易地看到两个字节。顺便说一句,您发现错误在哪里吗?
@bestsss它使用byte []数组存储数据,并且长度来自字符串(而不是byte [])。那是你指出的吗?如果没有,我不知道。该Java代码是发送给我的加密/解密演示。我必须编写C#才能产生相同的结果。