Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MD5哈希与C#MD5哈希不匹配_C#_Java_Md5_Hash_Message Digest - Fatal编程技术网

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

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

我对加密/散列知之甚少

我必须散列加密密钥。Java中的示例如下所示

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#代码担保),所以我会进行一些测试以确保。您在格式问题上是正确的。当写入文件时,两者都显示相同的乱码字符。谢谢你的帮助。