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

我试图比较两个由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对应于

UTF-16编码,而Java中的“ UTF-16”对应于

UTF-16编码。另一个区别是,如果您不要求C#不会输出字节顺序标记(在API中称为“前同步码”),而Java中的“

UTF-16”始终会生成它。为了使两个程序兼容,您可以使Java也使用little-endian UTF-16:

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

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

以上是 字符串SHA-512编码:C#和JAVA结果不同 的全部内容, 来源链接: utcz.com/qa/397608.html

回到顶部