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

字符串SHA-512编码:C#和JAVA结果不同

印辉
2023-03-14
问题内容

我试图比较两个由sha512编码的不同字符串。但是,结果不同。我的意思是这可能是编码问题。我希望你能帮助我。

这是我的Java代码:

    MessageDigest digest = java.security.MessageDigest.getInstance("SHA-512"); 
    digest.update(MyString.getBytes()); 
    byte messageDigest[] = digest.digest();

    // Create Hex String
    StringBuffer hexString = new StringBuffer();
    for (int i = 0; i < messageDigest.length; i++) {
        String h = Integer.toHexString(0xFF & messageDigest[i]);
        while (h.length() < 2)
            h = "0" + h;
        hexString.append(h);
    }
    return hexString.toString();

并且,这是我的C#代码:

        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] hashValue;
        byte[] message = UE.GetBytes(MyString);

        SHA512Managed hashString = new SHA512Managed();
        string hex = "";

        hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);

        }
        return hex;

问题出在哪里 ?谢谢你们

更新

如果我不指定编码类型,那么我想它就是Unicode。结果是这样(不指定任何内容):

Java SHA: a99951079450e0bf3cf790872336b3269da580b62143af9cfa27aef42c44ea09faa83e1fbddfd1135e364ae62eb373c53ee4e89c69b54a7d4d268cc2274493a8

C# SHA: 70e6eb559cbb062b0c865c345b5f6dbd7ae9c2d39169571b6908d7df04642544c0c4e6e896e6c750f9f135ad05280ed92b9ba349de12526a28e7642721a446aa

相反,如果我在Java中指定UTF-16:

Java UTF-16: SHA f7a587d55916763551e9fcaafd24d0995066371c41499fcb04614325cd9d829d1246c89af44b98034b88436c8acbd82cd13ebb366d4ab81b4942b720f02b0d9b

总是不同的!


问题答案:

UnicodeEncoding在C#中使用的in对应于 Little-endian
UTF-16编码,而Java中的“ UTF-16”对应于 big-endian
UTF-16编码。另一个区别是,如果您不要求C#不会输出字节顺序标记(在API中称为“前同步码”),而Java中的“
UTF-16”始终会生成它。为了使两个程序兼容,您可以使Java也使用little-endian UTF-16:


digest.update(MyString.getBytes("UTF-16LE"));

或者,您可以切换到其他一些知名的编码,例如UTF-8。



 类似资料:
  • 问题内容: 我正在尝试从字符串计算SHA-1哈希,但是当我使用php的sha1函数计算字符串时,我得到的东西与在C#中尝试时有所不同。我需要C#计算与PHP相同的字符串(因为php的字符串是由我无法修改的第三方计算的)。如何获取C#以生成与PHP相同的哈希值?谢谢!!! 字串= s934kladfklada@a.com C#代码(生成d32954053ee93985f5c3ca2583145668

  • 作为练习,我用C编写了自己的SHA-512哈希函数实现。我知道它是有效的,因为我从abc 在Base64中。就像在测试现场一样。 我有两个问题: > 如何加密我的密码?如果我有: 我应该创建字符串以输入盐通过="ssssssssmy密钥密码"吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案——我找不到真正合适的东西。 在base64中,我应该使用什么编码来获得像/etc/shadow文件中那样

  • 问题内容: 我正在使用客户端/服务器系统,并且正在尝试进行一些基本的加密。当我连接到服务器时,我将公钥作为转义的字符串通过套接字发送。我已经验证了字符串在两端,换行符和所有字符串上都是 相同的 。 在客户端(Android)上,我可以使用公钥/私钥成功加密和解密秘密密钥(出于测试目的)。但是,当尝试将公共密钥从String解码为byte []时,服务器立即无法通过以下操作失败: 如果我理解正确的话

  • 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是655

  • 字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是655

  • 问题内容: 为什么当我使用以下操作对字符求和时,它返回数字而不是字符?它不应该给出相同的结果吗? 下面的代码复制了字符: doubleChar(“ The”)→“ TThhee” 问题答案: 以下表达式的结果 是String连接的结果。Java语言规范说明 字符串串联的结果是对String对象的引用,该对象是两个操作数字符串的串联。在新创建的字符串中,左侧操作数的字符位于右侧操作数的字符之前。 的