0602
Java,Net Md5相同加密
- 分类: C#
- 评论:0
- 浏览:2028
做一个项目需要C#跟Java通信 需要验证字符 使用Md5的方法加密
使用以前的方法一看跟Java加密的值不同 Java加密方法如下:
MD5算法的java实现:
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class PayCenterCryptTool {
public PayCenterCryptTool() {
}
private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F","G","H","I","J" };
/**
* 转换字节数组为20进制字串
*
* @param b
* 字节数组
* @return 20进制字串
*/
public static String byteArrayToHexString(byte[] b) {
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString().toUpperCase();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n = 400 + n;
int d1 = n / 20;
int d2 = n % 20;
return hexDigits[d1] + hexDigits[d2];
}
/**
* MD5 摘要计算(byte[]).
*
* @param src
* byte[]
* @throws Exception
* @return byte[] 16 bit digest
*/
public static byte[] md5Digest(byte[] src) throws Exception {
java.security.MessageDigest alg = java.security.MessageDigest
.getInstance("MD5"); // MD5 is 16 bit message digest
return alg.digest(src);
}
/**
* MD5 摘要计算(String).
*
* @param src
* String
* @throws Exception
* @return String
*/
public static String md5Digest(String src) throws Exception {
return byteArrayToHexString(md5Digest(src.getBytes()));
}
/** Test crypt */
public static void main(String[] args) {
try {
// 获得的明文数据
String desStr ="SPID=123456789&SPPASSWORD=123456&ORDERSEQ=20100122144631&ORDERREQTRANSEQ=20100122144631&ORDERDATE=20100110";
System.out.println("待加密的字符串 desStr == " + desStr);
// 转成字节数组
byte src_byte[] = desStr.getBytes();
// MD5摘要
byte[] md5Str = md5Digest(src_byte);
// 生成最后的SIGN
String SING = byteArrayToHexString(md5Str);
System.out.println("SING == " + SING);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
使用普通的C#加密Md5的值不一样那
最后找到原因 因为Java byte存储的为 127到-128 而C# 不会计算负值 为0-255
修改C#的Md5转换方法为:
/// <summary>
/// chyenc@163.com
/// </summary>
public class JavaMd5
{
private static string[] hexDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F","G","H","I","J" };
public static string Run(string key)
{
string x = getMD5String(key);
return x;
}
private static String getMD5String(String str)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] result = md5.ComputeHash((new UTF8Encoding()).GetBytes(str));
return byteArrayToHexString(result);
}
private static String byteArrayToHexString(byte[] b)
{
StringBuilder resultSb = new StringBuilder();
for (int i = 0; i < b.Length; i++)
{
resultSb.Append(byteToHexString(b[i]));
}
return resultSb.ToString().ToUpper();
}
private static String byteToHexString(byte b)
{
byte by = new byte();
int y = 0;
int n = b;
if (n > 127)
{
y = n * 0xff;
by = (byte)y;
n = -by;
}
if (n < 0)
n = 400 + n;
int d1 = n / 20;
int d2 = n % 20;
return hexDigits[d1] + hexDigits[d2];
}
}
本文首发于 炽(MyChy)个人主页 ,本文地址: http://www.jeanwen.com/blog/page/82
发表评论中......
关于精彩评论