Md5加密中 C#和Java得到的加密结果不同

keita90 2011-08-12 09:52:54
C#:
byte[] hash;
byte[] inputPasswordBytes = System.Text.UnicodeEncoding.Unicode.GetBytes(s);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
hash = md5.ComputeHash(inputPasswordBytes);

Java:

byte[] hash;
byte[] inputPasswordBytes = s.getBytes();
MessageDigest digest;
try {
digest = java.security.MessageDigest.getInstance("MD5");

digest.update(inputPasswordBytes);
hash = digest.digest();

同样是 MD5加密 为什么得出的结果不同?
例如密码为123456
C#结果:ce0bfd15-059b-68d6-7688-884d7a3d3e8c(横杠是后面加上去的,便于阅读)
Java结果:E10ADC39-49BA-59AB-BE56-E057F20F883E

我想知道如果想要Java的结果与C#的结果相同,应该怎样修改?
...全文
1143 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fireelf000 2012-01-13
  • 打赏
  • 举报
回复
java和C#的md5确实是不一样的,java的需要补位就和C#的一样了
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
嘿嘿又查了下api

sbyte是有符号类型的,可以跟java的通用
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
java的byte是有符号的,c#的是无符号的。
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
把java里的byte & 255就能得到c#里面的那个值了
java跟C#的数据类型不一样的

byte b = -50;
int c = b & 255;

System.out.println(c);
luohuijun619 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 x19881216 的回复:]

C#的byte的范围和java的不一样。。
[/Quote]

顶ls

lz可以到网上找找有没有C#版的md5加密,再找个java版的md5加密,
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
C#的byte的范围和java的不一样。。
keita90 2011-08-12
  • 打赏
  • 举报
回复
在输入“123456”时java和C#的inputPasswordBytes都为{49,0,50,0,51,0,52,0,53,0,54,0}
编码改成UTF-16LE的确是对的

但是经过MD5加密之后,byte[] hash却不同:
Java [-50, 11, -3, 21, 5, -101, 104, -42, 118, -120, -120, 77, 122, 61, 62, -116]
C# [206, 11, 253,21, 5, 155, 104, 214, 118, 136, 136, 77, 122, 61, 62, 140]
好像已经接近正确了。。不知道怎么改。。。
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
重要的是编码方式选 UTF-16LE 这个
小绵羊 2011-08-12
  • 打赏
  • 举报
回复 1
[Quote=引用 11 楼 keita90 的回复:]

各位大侠 我现在想要修改的是Java代码 .net+sqlserver数据库的值是不能改变的
[/Quote]
查了下c#的api ,System.Text.UnicodeEncoding.Unicode.GetBytes(s)用的是utf-16 little-endian编码方式,用下面的代码就可以了


public static void main(String[] args) throws Exception {
System.out.println(getMD5("123456", "UTF-16LE"));
}

public static String getMD5(String str, String encoding) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(encoding));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val < 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toUpperCase();
}
keita90 2011-08-12
  • 打赏
  • 举报
回复
各位大侠 我现在想要修改的是Java代码 .net+sqlserver数据库的值是不能改变的
keita90 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fireelf000 的回复:]

楼主试试这样写
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fromData = System.Text.Encoding.Default.GetBytes(myString);
byte[] targetData = md5.ComputeHash(fromData);

上面用de……
[/Quote]
额 我现在是想要和C#的结果一致 谢谢
fireelf000 2011-08-12
  • 打赏
  • 举报
回复
楼主试试这样写
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fromData = System.Text.Encoding.Default.GetBytes(myString);
byte[] targetData = md5.ComputeHash(fromData);

上面用defalut的话,可以与java等其他语言的md5结果一致
keita90 2011-08-12
  • 打赏
  • 举报
回复
= =各位大侠 我需要得到ce0bfd15059b68d67688884d7a3d3e8c 这个结果 谢谢
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 trocp 的回复:]

123456 的md5 为
e10adc3949ba59abbe56e057f20f883e
[/Quote]
是滴,在涉及到非ASCII字符时,编码显得尤为重要
oO临时工Oo 2011-08-12
  • 打赏
  • 举报
回复
123456 的md5 为
e10adc3949ba59abbe56e057f20f883e
keita90 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 x19881216 的回复:]

a的md5值为0CC175B9C0F1B6A831C399E269772661
[/Quote]

能否测一下123456的值是否为ce0bfd15059b68d67688884d7a3d3e8c
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
a的md5值为0CC175B9C0F1B6A831C399E269772661
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
java写的,注意字符串编码方式,java和c#的要一样,不然结果不一样

public static void main(String[] args) throws Exception {
System.out.println(getMD5("a", "utf-8"));
}

public static String getMD5(String str, String encoding) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(encoding));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val < 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toUpperCase();
}
小绵羊 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 juwikuang 的回复:]

Java的源代码错误
如下:

dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s"; string dataToHash = String.Format(dataFormatString, ...);

应该是%12$s,寫錯了。
[/Quote]
莫名奇妙
织网者Eric 2011-08-12
  • 打赏
  • 举报
回复
Java的源代码错误
如下:

dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s"; string dataToHash = String.Format(dataFormatString, ...);

应该是%12$s,寫錯了。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧