c语言 java php 加密_Java 与 PHP 的MD5加密为什么不一样?

php代码:

echo md5(chr(142));

java代码:

import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {public static void main(String[] args) {char ss=(char)142;//这里换成56后md5后和php版的 md5后的结果一样System.out.println(md5(ss+""));}public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}}

经过测试 获取142的char类型的md5后数值不一样,获取56 的char 后md5的值 一样,这是怎么回事,如何解决(都是utf-8编码)

回复讨论(解决方案)

plainText.getBytes( "GBK");

plainText.getBytes( "GBK");

这个方法不行,试过了

不知道为什么要

for (int i = 0; i < 32 - md5code.length(); i++) {

md5code = "0" + md5code;

}

而且终值还始终在变

public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{ String s = null; char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); byte[] datas = md.digest(); //16个字节的长整数 char[] str = new char[2*16]; int k = 0; for(int i=0;i<16;i++){ byte b = datas[i]; str[k++] = hexDigist[b>>>4 & 0xf];//高4位 str[k++] = hexDigist[b & 0xf];//低4位 } s = new String(str); return s; }

java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了

这里测试下:

java:

public static void main(String[] args) { try { System.out.println(getMd5("123".getBytes())); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

输出:

202cb962ac59075b964b07152d234b70

PHP代码:

echo md5("123");

输出:

202cb962ac59075b964b07152d234b70

public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{ String s = null; char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); byte[] datas = md.digest(); //16个字节的长整数 char[] str = new char[2*16]; int k = 0; for(int i=0;i<16;i++){ byte b = datas[i]; str[k++] = hexDigist[b>>>4 & 0xf];//高4位 str[k++] = hexDigist[b & 0xf];//低4位 } s = new String(str); return s; }

java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了

这里测试下:

java:

public static void main(String[] args) { try { System.out.println(getMd5("123".getBytes())); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

输出:

202cb962ac59075b964b07152d234b70

PHP代码:

echo md5("123");

输出:

202cb962ac59075b964b07152d234b70

还是不行,我把php和java代码全部贴出来吧,php结果是正确的,java代码如何改呢

import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {public static void main(String[] args) {utils u=new utils();String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);System.out.println("-----------------------------");System.out.println(up);}public String jspassword(String password,String pt,String vc,boolean md5){if(md5){password = utils.md5(password).toUpperCase();}int len =password.length();String temp="";for (int i=0; i < len ; i = i + 2){temp += "\\x"+password.substring(i, i+2);}return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();}public static String hex2asc(String str){String [] s=str.trim().split("\\\\x");//System.out.println(s.length);StringBuffer sb=new StringBuffer();for(String sItem:s){//System.out.println(sItem);sb.append(sItem);}int len = sb.toString().length();//String data = null;StringBuffer sb1=new StringBuffer();for (int i=0;i"+utils.md5(String.valueOf(ss)));sb1.append(String.valueOf(ss));}return sb1.toString();}public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}}

不知道为什么要

for (int i = 0; i < 32 - md5code.length(); i++) {

md5code = "0" + md5code;

}

而且终值还始终在变

public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{ String s = null; char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); byte[] datas = md.digest(); //16个字节的长整数 char[] str = new char[2*16]; int k = 0; for(int i=0;i<16;i++){ byte b = datas[i]; str[k++] = hexDigist[b>>>4 & 0xf];//高4位 str[k++] = hexDigist[b & 0xf];//低4位 } s = new String(str); return s; }

java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了

这里测试下:

java:

public static void main(String[] args) { try { System.out.println(getMd5("123".getBytes())); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

输出:

202cb962ac59075b964b07152d234b70

PHP代码:

echo md5("123");

输出:

202cb962ac59075b964b07152d234b70

我把php和java代码全部贴出来吧

import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {public static void main(String[] args) {utils u=new utils();String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);System.out.println("-----------------------------");System.out.println(up);}public String jspassword(String password,String pt,String vc,boolean md5){if(md5){password = utils.md5(password).toUpperCase();}int len =password.length();String temp="";for (int i=0; i < len ; i = i + 2){temp += "\\x"+password.substring(i, i+2);}return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();}public static String hex2asc(String str){String [] s=str.trim().split("\\\\x");//System.out.println(s.length);StringBuffer sb=new StringBuffer();for(String sItem:s){//System.out.println(sItem);sb.append(sItem);}int len = sb.toString().length();//String data = null;StringBuffer sb1=new StringBuffer();for (int i=0;i"+utils.md5(String.valueOf(ss)));sb1.append(String.valueOf(ss));}return sb1.toString();}public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}}

function jspassword($p,$pt,$vc,$md5 = true)

{

echo $p.":".$pt.":".$vc;

if($md5)

{

$p = strtoupper(md5($p));

}

//echo "

".$p;exit;

$len = strlen($p);

$temp = null;

//echo "

md5Password:".$p."

";

for ($i=0; $i < $len ; $i = $i + 2)

{

//echo "

i:".$i;

$temp .= '\x'.substr($p, $i,2);

}

//echo "

".$temp."

";

//echo "

--->>>".md5(hex2asc($temp).hex2asc($pt));

//$str=hex2asc($temp).hex2asc($pt);

//echo "

内部:".$str."-->".md5(hex2asc($temp))."-->".md5(hex2asc($pt));

return strtoupper(md5(strtoupper(md5(hex2asc($temp).hex2asc($pt))).$vc));

}

/**

* 十六进制转字符

*

* @access private

* @param string $str

* @return string

*/

function hex2asc($str)

{

//echo "处理前:".$str."

";

//print_r( explode('\x', $str));

$str = join('', explode('\x', $str));

//echo "

处理后:".$str;

$len = strlen($str);

$data = null;

for ($i=0;$i {

//echo "

::".substr($str,$i,2);

echo "

".hexdec(substr($str,$i,2)).":::".chr(hexdec(substr($str,$i,2)))."->".md5(chr(hexdec(substr($str,$i,2))));

$data.=chr(hexdec(substr($str,$i,2)));

}

echo "

".md5($data)."

";

return $data;

}

?>

[/code]import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {public static void main(String[] args) {utils u=new utils();String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);System.out.println("-----------------------------");System.out.println(up);}public String jspassword(String password,String pt,String vc,boolean md5){if(md5){password = utils.md5(password).toUpperCase();}int len =password.length();String temp="";for (int i=0; i < len ; i = i + 2){temp += "\\x"+password.substring(i, i+2);}return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();}public static String hex2asc(String str){String [] s=str.trim().split("\\\\x");//System.out.println(s.length);StringBuffer sb=new StringBuffer();for(String sItem:s){//System.out.println(sItem);sb.append(sItem);}int len = sb.toString().length();//String data = null;StringBuffer sb1=new StringBuffer();for (int i=0;i"+utils.md5(String.valueOf(ss)));sb1.append(String.valueOf(ss));}return sb1.toString();}public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}}

不知道为什么要

for (int i = 0; i < 32 - md5code.length(); i++) {

md5code = "0" + md5code;

}

而且终值还始终在变

public static String getMd5(byte[] buffer) throws NoSuchAlgorithmException{ String s = null; char hexDigist[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(buffer); byte[] datas = md.digest(); //16个字节的长整数 char[] str = new char[2*16]; int k = 0; for(int i=0;i<16;i++){ byte b = datas[i]; str[k++] = hexDigist[b>>>4 & 0xf];//高4位 str[k++] = hexDigist[b & 0xf];//低4位 } s = new String(str); return s; }

java中的MD5返回的是一个128位的长整形数,即16个字节,一个字节映射成2个字符,所以就是32个字符,md5 不可能不一样的都是遵循md5协议实现的,只是PHP在底层用C语言实现了

这里测试下:

java:

public static void main(String[] args) { try { System.out.println(getMd5("123".getBytes())); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

输出:

202cb962ac59075b964b07152d234b70

PHP代码:

echo md5("123");

输出:

202cb962ac59075b964b07152d234b70

我把php和java代码全部贴出来吧

import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class utils {public static void main(String[] args) {utils u=new utils();String up=u.jspassword("123456", "\\x00\\x00\\x00\\x00\\x16\\x9d\\x56\\x75", "!PRY", true);System.out.println("-----------------------------");System.out.println(up);}public String jspassword(String password,String pt,String vc,boolean md5){if(md5){password = utils.md5(password).toUpperCase();}int len =password.length();String temp="";for (int i=0; i < len ; i = i + 2){temp += "\\x"+password.substring(i, i+2);}return (utils.md5(utils.md5(utils.hex2asc(temp)+utils.hex2asc(pt)) .toUpperCase()+vc) ).toUpperCase();}public static String hex2asc(String str){String [] s=str.trim().split("\\\\x");//System.out.println(s.length);StringBuffer sb=new StringBuffer();for(String sItem:s){//System.out.println(sItem);sb.append(sItem);}int len = sb.toString().length();//String data = null;StringBuffer sb1=new StringBuffer();for (int i=0;i"+utils.md5(String.valueOf(ss)));sb1.append(String.valueOf(ss));}return sb1.toString();}public static String md5(String plainText) {byte[] secretBytes = null;try {secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法!");}String md5code = new BigInteger(1, secretBytes).toString(16);for (int i = 0; i < 32 - md5code.length(); i++) {md5code = "0" + md5code;}return md5code;}}

java在测试的时候传入的byte数组哦,要调用string.getBytes()方法 ,这个我测试是可以通过的 我也是这两天才开始学习java的 如果是编码的问题我就不知道怎么解决了

编码不对 换下试试

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值