当前位置: 首页 > 面试题库 >

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

齐英韶
2023-03-14
问题内容

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

我必须对加密密钥进行哈希处理。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#值)。但是,如果将其解释为带
符号
(使用二进制补码),则其值为-113(您的第二个Java值)。


因此,差异似乎是由于您的值被格式化为Java中的签名格式,而未使用C#签名的格式。如果要在C#中获取带符号的字节,可以使用:

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

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



 类似资料:
  • 问题内容: 我不知道如何实现从php到java的这几行。 好吧,我尝试将其转换,但是得到了不同的结果! java中的结果不同于php中的结果。 你能帮我吗??先感谢您 :) 问题答案: 您不能在不将其转换为字符串的情况下直接使用seq20吗?我会这样:

  • 问题内容: 给定密钥,有什么办法可以解密加密的MD5字符串? 问题答案: 尝试使用Google(请参阅使用Google破解MD5密码)或包含md5()之类的MD5散列的在线数据库;或GDATA(最后一个包含1,133,766,035个唯一条目)。

  • 好吧,这里都是我的问题。我正在尝试用MD5哈希加密字符串。下面是我试图哈希的字符串: 以下是预期输出: 下面是我在Android应用程序中得到的信息: 下面是我正在使用的代码: 在Android上运行这段代码时,我得到了上述意想不到的结果,但当我运行这段代码时,就像一个Java程序传递相同的字符串一样,我得到了预期的输出... 究竟是怎么回事?几天来,我一直被这件事难住,在网上搜寻线索。我已经尝试

  • 主要内容:Hashtable 类中的属性,Hashtable 类中的方法在 C# 中,Hashtable(哈希表) 类表示根据键的哈希代码进行组织的键(key)/值(value)对的集合,可以使用键来访问集合中的元素。也就是说当您需要使用键来访问指定元素时,可以选择使用哈希表。 Hashtable 类中的属性 下表中列出了 Hashtable 类中一些常用的属性: 属性 描述 Count 获取哈希表中包含的键值对的个数 IsFixedSize 获取一个值,用来表示哈希

  • 我想计算一个图像的哈希,首先我把图像转换成数据,然后在这个函数的帮助下,我会计算图像文件的哈希(数据),但是生成的哈希不匹配在线生成器和其他语言转换器,像(Java),甚至我尝试了其他库,但我得到相同的结果,我想当我转换成数据的时候,我的文件发生了一些事情,所以哈希不匹配其他转换器。 但当我计算一个纯文本散列时,它与所有在线转换器和其他语言转换器匹配,但与图像不一样? 谢谢你的帮助

  • 哈希是键/值对 如果你想按名字查询,那么需要哈希。哈希的键必须唯一,但值可以是任意标量。 有时候你仍然会看到人们称它为“关联数组”,但不要想当然的把它作为数组。 通过键/值对列表来创建哈希 使用键/值对列表创建哈希: my %stooges = ( 'Moe', 'Howard', 'Larry', 'Fine', 'Curly', 'Howard', 'Iggy'