【发布时间】:2012-06-17 19:57:53
【问题描述】:
我对加密/散列知之甚少。
我必须散列一个加密密钥。 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# 才能产生相同的结果。
标签: c# java md5 hash message-digest