gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:22:54 24 4
gpt4 key购买 nike

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

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

谢谢。

最佳答案

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

因此,这种差异似乎是由于您的值在 Java 中被格式化为签名但在 C# 中未签名造成的。如果你想在 C# 中获得带符号的字节,你可以使用:

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

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

关于c# - Java MD5 哈希与 C# MD5 哈希不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11038954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com