【发布时间】:2015-01-29 13:50:22
【问题描述】:
我正在尝试生成C# MD5CryptoServiceProvider 来编码字符串和Java MessageDigest.getInstance("MD5") 来编码字符串,但是两个输出是不同的。 stackoverlflow 上已经有很多示例可用,但仍然停留在某些地方。
以下是我的 C# 代码:
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
Byte[] hashedDataBytes = null;
UTF8Encoding encoder = new UTF8Encoding();
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes("NSI#1234@"));
string strPassword = string.Empty;
foreach (byte b in hashedDataBytes)
{
strPassword = strPassword + b.ToString();
}
return strPassword;
C# 代码是冻结代码,我无权更改此代码。
以下是我的 Java 代码:
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] digest = messageDigest.digest("NSI#1234@".getBytes("UTF-8"));
String hash = new BigInteger(1, digest).toString();
System.out.println(hash);
C#代码输出:158163028351382321031971922721528189209213
Java 代码输出:210864369951346339831795420458152481237
C# 生成 42 个数字,java 生成 39 个数字。如果我更改 new BigInteger(1, digest).toString(8) 的值,它会生成 43 个数字,如果我更改 new BigInteger(1, digest).toString(9) 它会生成 41 个数字。
【问题讨论】:
-
您的 C# foreach 将字节值连接为字符串并不等同于您在 Java 中使用
BigInteger构造一个数字,然后再将其转为字符串。 -
@MarkRotteveel for java 我们需要做什么?
-
你的 C# 代码没有你的 java 代码有意义(尽管通常你会直接将字节数组输出为两种语言的十六进制字符串)。
-
如果您有诸如“我无法更改 C# 代码”之类的要求,请在问题中指定这些要求以开始。