用Java和C#计算SHA-1哈希

卡莉:

用Java和C#计算SHA-1哈希

我正在尝试在C#应用程序中复制Java应用程序的逻辑。其中一部分涉及生成密码的SHA-1哈希。不幸的是,我无法从Java和C#中获得相同的结果。

C#输出:64 0a b2 ba e0 7b ed c4 c1 63 f6 79 a7 46 f7 ab 7f b5 d1 fa 
Java输出:164 10a b2 ba e0 17b ed c4 c1 163 f6 179 a7 146 f7 ab 17f b5 d1 fa

为了弄清楚发生了什么,我一直在Eclipse和Visual Studio中使用调试器。

1.检查byte []键的值:

    Java:{84,101,115,116} 
    C#:{84,101,115,116} 

2.检查byte []哈希值:

    Java:{100 10 -78- 70 -32 123 ...} 
    C#:{100 10 78 186 224 123 ...}

我已经阅读了有关该主题的其他文章,这些文章主要涉及输入字符串编码,但是这些似乎对我没有帮助。我的猜测是,这与有符号字节与无符号字节有关,但是我在这条轨道上没有取得太大进展。任何帮助将不胜感激。

谢谢,

卡乐


Java版本:

public void testHash() {

    String password = "Test";

    byte[] key = password.getBytes();

    MessageDigest md = MessageDigest.getInstance("SHA-1");

    byte[] hash = md.digest(key);

    String result = "";
    for ( byte b : hash ) {
        result += Integer.toHexString(b + 256) + " ";
    }

    System.out.println(result);

}

C#版本:

public void testHash() {

    String password = "Test";

    byte[] key = System.Text.Encoding.Default.GetBytes(password);

    SHA1 sha1 = SHA1Managed.Create();

    byte[] hash = sha1.ComputeHash(key);

    String result;
    foreach ( byte b in hash ) {
        result += Convert.ToInt32(b).ToString("x2") + " ";
    }

    Console.WriteLine(result);

}
托马斯·波宁(Thomas Pornin):

在Java版本中,请勿使用b + 256; 而是使用b & 255SHA-1部分很好,这只是打印输出的问题。Java的“ byte”类型是带符号的:它返回-128到127之间的值。要获得相应的无符号值,只有在该值为负数时才必须添加256

与255进行按位与运算(即“ & 255”所做的操作)进行正确的转换,在二进制级别上,该值被截断为8个最低有效位。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章