Java MD5哈希与C#MD5哈希不匹配
我对加密/散列知之甚少 我必须散列加密密钥。Java中的示例如下所示Java MD5哈希与C#MD5哈希不匹配,c#,java,md5,hash,message-digest,C#,Java,Md5,Hash,Message Digest,我对加密/散列知之甚少 我必须散列加密密钥。Java中的示例如下所示 String encryptionKey = "test"; MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length()); byte[] encryptionKeyBytes
String encryptionKey = "test";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length());
byte[] encryptionKeyBytes = messageDigest.digest();
string encryptionKey = "test";
var md5 = MD5.Create();
var keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes);
如果我错了,请纠正我,但是上面的代码使用MD5算法对字符串进行散列
当我在C#中散列相同的字符串时,我希望得到相同的结果
我现在的C代码看起来像这样
String encryptionKey = "test";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length());
byte[] encryptionKeyBytes = messageDigest.digest();
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#得到
我需要我的C#代码来获得与Java代码相同的结果(而不是相反),有什么想法吗
谢谢。事实上,结果是一样的。与其他整数类型一样,字节值可以解释为有符号或无符号。例如,如果解释为无符号,10001111
将对应于143
(您的第二个C值)。但是,如果解释为带符号(使用),其值将是-113
(您的第二个Java值)
因此,这种差异似乎是由于您的值在Java中被格式化为有符号,而在C#中被格式化为无符号。如果要获取C#中的有符号字节,可以使用:
sbyte[] encryptionKeyBytesSigned =
encryptionKeyBytes.Select(b => (sbyte)b).ToArray();
但是,请注意,这不仅仅是仅在显示值时才会出现的格式问题。保存到文件时,两个结果应该相同。Java的字节被签名。C#字节不是。请注意,只有Java字节的位置是负数,这是错误的。除了相同的结果之外,Java代码中还有一个非常严重的错误:
encryptionKey.getBytes(“UTF-8”)、0、encryptionKey.length()
我让您来判断错误是什么。最后一个比较直接字符串表示法(toString)的方法总是不好的idea@bestsss我正在使用断点检查值。我认为断点值是由toString表示生成的(可能是错误的)。如何比较字节值?无符号十六进制通常是表示字节[]的标准值,因为您可以很容易地看到这两个半字节。顺便说一句,你发现错误在哪里了吗?@bestsss它使用byte[]数组作为数据,长度来自字符串(而不是byte[])。这就是你指的吗?如果没有,我不知道。java代码是发给我的加密/解密演示。C#I必须写信才能得出同样的结果。谢谢你的回答。。。如果我没有看错的话,最后一句话似乎是矛盾的。如果您将两者都保存到文件中,并且它们是相同的,那么在显示值时只会出现格式问题。你能澄清一下吗?我将获取这个散列值(字节[]),并将其用作加密密钥。因此,如果这只是一个显示问题,我认为不进行转换也可以。我不认为加密函数将使用sbyte[]而不是byte[]。N/m。你只是警告我要检查确认一下。我明白了。@Theo:是的,我假设这是一个格式问题,当保存到文件中时,即使不将C值转换为有符号字节,结果文件也应该是相同的。但是,老实说,我对Java不太熟悉(我只能为您的C#代码担保),所以我会进行一些测试以确保。您在格式问题上是正确的。当写入文件时,两者都显示相同的乱码字符。谢谢你的帮助。