Java和PHP解码不同吧
public static String md5(byte[] bys) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(bys);
} 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;
}
你把这个方法像上面那样改成接受byte数组的,然后你这样调用
System.out.println(md5(new byte[] {(byte)142}));
结果应该是和PHP一样的
public static String md5(byte[] bys) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(bys);
} 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;
}
你把这个方法像上面那样改成接受byte数组的,然后你这样调用
System.out.println(md5(new byte[] {(byte)142}));
结果应该是和PHP一样的
解决方案 »
- 如何重新设置HashSet的哈希函数?
- 关于一个基础问题
- [求助]新手求一 计算器原代码
- 如何判断一个工程中的.某一个窗体.当前属于显示
- Java的类方法定义可以像C++中的那样写在类定义的外面吗?
- 为什么我编的含有applet的网页,applet都显示不出来?
- eclipse实在是不会。请问大家有没有相关的操作说明或使用介绍
- [Good News]IBM WebSphere Studio Application Developer 5.1推出啦!!!
- 关于applet里更新图片的问题
- 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
- 关于BufferedWriter源代码的问题
- JAVA连接SQL 2008问题
md5((String.valueof(ss)).getBytes());
而且142是个ASCII扩展字符,有些字符集里根本没有(你的默认字符集应该是GBK,而GBK应该是没有这个字符的)
你可以打印String.valueof(ss)).getBytes()这个数组,你会发现142被编码成乱七八糟的编码了(GBK应该编码成63)
我把php和java代码全部贴出来吧
<?php
//php为正确的 结果:CA15B8C6D72A4442942045956DD371F8
$password="123456";
$pt='\x00\x00\x00\x00\x16\x9d\x56\x75';
$vc='!PRY';
$passwd = jspassword($password,$pt, $vc);
echo "<br>结果:".$pt."<br>".$vc."<br>密码:".$passwd."<br><br>";function jspassword($p,$pt,$vc,$md5 = true)
{
echo $p.":".$pt.":".$vc;
if($md5)
{
$p = strtoupper(md5($p));
}
//echo "<br>".$p;exit;
$len = strlen($p);
$temp = null;
//echo "<br>md5Password:".$p."<br>";
for ($i=0; $i < $len ; $i = $i + 2)
{
//echo "<br>i:".$i;
$temp .= '\x'.substr($p, $i,2);
}
//echo "<br>".$temp."<br>";
//echo "<br><br><br>--->>>".md5(hex2asc($temp).hex2asc($pt));
//$str=hex2asc($temp).hex2asc($pt);
//echo "<br>内部:".$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."<br>";
//print_r( explode('\x', $str));
$str = join('', explode('\x', $str));
//echo "<br>处理后:".$str;
$len = strlen($str);
$data = null;
for ($i=0;$i<$len;$i+=2)
{
//echo "<br>::".substr($str,$i,2);
echo "<br>".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 "<br>".md5($data)."<br>";
return $data;
}
?>
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<len;i+=2)
{
int x=Integer.parseInt(sb.toString().substring(i, i+2),16);
char ss=(char) x;
System.out.println(x+"::"+ss+"转换后->"+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;
}
}
比如123456这种当然可以,而(char)142在两边的编码是不同的当然不行
作为密码的话,一般都只会允许标准ASCII,不包括大于127的扩展码,你不必要允许这种密码啊。。
把MD5方法内改成getBytes("ISO-8859-1")
第一种是对现有字符串散列,比如你代码里的password
第二种是对字节流散列,比如那个pt其实你在Java里可以分开处理吧,不一定要把字节流也转换为字符串啊
对于第一种,getBytes的时候用UTF-8编码对于第二种,直接转换为byte数组,然后对数组进行散列
<?php
#重要
header('Content-Type: text/html; charset=UTF-8');function unicode_decode($unistr, $encoding = 'UTF-8', $ishex = false, $prefix = '&#', $postfix = ';') {
$arruni = explode($prefix, $unistr);
$unistr = ''; for($i = 1, $len = count($arruni); $i < $len; $i++) {
if (strlen($postfix) > 0) {
$arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix));
}
$temp = $ishex ? hexdec($arruni[$i]) : intval($arruni[$i]);
$unistr .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256);
} return iconv('UCS-2', $encoding, $unistr);
}#将数字转成Unicode
$s = "\u".dechex(142);#将Unicode转成UTF8后再计算MD5就跟Java一样了
echo md5(unicode_decode($s,'utf-8',true,'\u',''));#c18af90e0c90ea3b209bad6a3d373d82#chr($char)函数只接受char类型参数,超出char范围的被强制向下转型,然后就没有然后了。?>
ps.我是搞java的,php了解的不是太多,如有不妥之处,权当没看见哈哈哈哈