首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# MD5散列与C# MD5散列不匹配

C# MD5散列与C# MD5散列不匹配
EN

Stack Overflow用户
提问于 2012-06-15 02:14:22
回答 1查看 3.8K关注 0票数 4

我对加密/散列知之甚少。

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

代码语言:javascript
复制
String encryptionKey = "test";

    MessageDigest messageDigest = MessageDigest.getInstance("MD5");
    messageDigest.update(encryptionKey.getBytes("UTF-8"), 0, encryptionKey.length());
    byte[] encryptionKeyBytes = messageDigest.digest();

如果我错了,现在纠正我,但是上面的代码使用MD5算法散列字符串。

当我在C#中散列相同的字符串时,我希望得到相同的结果。

我当前的C#代码如下所示...

代码语言:javascript
复制
string encryptionKey = "test";

        var md5 = MD5.Create();
        var keyBytes = Encoding.UTF8.GetBytes(encryptionKey);
        byte[] encryptionKeyBytes = md5.ComputeHash(keyBytes);

但结束字节结果不匹配。

Java得到..。

代码语言:javascript
复制
[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#得到..。

代码语言:javascript
复制
    [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代码相同的结果(而不是相反),你有什么想法吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-15 02:21:04

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

因此,这种差异似乎是由于您的值在Java语言中被格式化为有符号的,而在C#中是无符号的。如果你想在C#中获得有符号字节,你可以使用:

代码语言:javascript
复制
sbyte[] encryptionKeyBytesSigned = 
    encryptionKeyBytes.Select(b => (sbyte)b).ToArray();

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11038954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档