Java代码应具有与C#代码相同的功能。这段代码是一样的吗?
这是C#代码中的代码:
byte[] hashBytes;
UnicodeEncoding encoding = new UnicodeEncoding();
hashBytes = encoding.GetBytes(inputstr.Text.ToUpper().Trim());
SHA1 sha1 = new SHA1CryptoServiceProvider();
byte[] cryptPassword = sha1.ComputeHash(hashBytes);
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
SHA1.Text = enc.GetString(cryptPassword);
outputstr.Text = Convert.ToBase64String(cryptPassword);
这是Java移植代码,但我得到了不同的输出:
byte[] pwBytes = new String("password".toUpperCase().getBytes(), "UTF-16").getBytes();
MessageDigest md = null;
md = MessageDigest.getInstance("SHA-1");
byte[] sha1pw = md.digest(pwBytes);
final BASE64Encoder encoder = new BASE64Encoder();
String encodedPw = encoder.encode(sha1pw);
Java代码应该以与C#代码计算outputstr.Text相同的方式计算encodedPw。
对不起,我无法运行C#代码来提供示例。 Java代码哈希"密码"为oghZbO1T3U/eu3POLIIQweZ/gvQ=
。
答案 0 :(得分:1)
UnicodeEncoding
使用UTF-16 little endian in c#,而java中的UTF-16
默认使用大端。所以在Java中你需要:
byte[] pwBytes = "password".toUpperCase().getBytes("UTF-16LE");