« Net,PHP 3DES 相同 Pl/sql Developer 存储过程 Test 显示 No Debug Information »

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

相关文章  

关于精彩评论  

发表评论
发送中发表评论中......