我对加密/散列知之甚少。
我必须散列一个加密密钥。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代码相同的结果(而不是相反),你有什么想法吗?
谢谢。
发布于 2012-06-15 02:21:04
实际上,结果是相同的。与其他整数类型一样,字节值可以解释为有符号或无符号。例如,如果解释为C#,则10001111将对应于143 (您的第二个无符号值)。但是,如果解释为signed (使用two’s complement),它的值将是-113 (第二个Java值)。
因此,这种差异似乎是由于您的值在Java语言中被格式化为有符号的,而在C#中是无符号的。如果你想在C#中获得有符号字节,你可以使用:
sbyte[] encryptionKeyBytesSigned =
encryptionKeyBytes.Select(b => (sbyte)b).ToArray();但是,请注意,这不仅仅是一个仅在显示值时出现的格式问题。当保存到文件时,两个结果应该是相同的。
https://stackoverflow.com/questions/11038954
复制相似问题