SHA1哈希计算不为java和c#返回相同的结果

时间:2012-12-06 10:30:46

标签: c# java .net sha1

我在我的.net和Java应用程序中计算哈希。但是当他们给我结果时我遇到了问题,因为两者都给出了不同的结果。在搜索这个问题时,我发现了这些问题{{3} }和question 1根据他们的答案在那里应用但不幸的是我没有成功。我也尝试UTF-8UTF-16LE但结果又不一样了。
现在我被困住了,想知道为什么会这样,我该如何解决?
我的代码片段如下: .Net

byte[] buffer2 = new SHA1CryptoServiceProvider().ComputeHash(bytes);


爪哇

MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        byte[] buffer2 = sha1.digest(bytes);

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

我认为问题在于C#字节是无符号类型,而在java中则不是。

这两个代码同样有效:

    public static void main(String[] args) throws NoSuchAlgorithmException {
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        byte[] bytes = new byte[] { 1, 2, 10 };
        byte[] buffer2 = sha1.digest(bytes);
        for(byte b : buffer2){
            System.out.println(b);
        }
    }

    static void Main(string[] args)
    {
        var bytes = new byte[] { 1, 2, 10 };
        var buffer = new SHA1CryptoServiceProvider().ComputeHash(bytes);
        foreach (var b in buffer)
        {
            Console.WriteLine((sbyte)b); //attention to cast           
        }
        Console.Read();
    }

答案 1 :(得分:2)

所以只是回顾一下我的评论作为答案。 见:Calculating SHA-1 hashes in Java and C#
基本上 - Java字节是有符号的,而C#字节则不是。 两个结果的内部表示将是相同的,但除非您进行适当的转换,否则打印它们将产生不同的结果。