Heim >Backend-Entwicklung >PHP-Tutorial >php md5加密之后对字节进行异或操作的问题

php md5加密之后对字节进行异或操作的问题

WBOY
WBOYOriginal
2016-06-20 12:59:311019Durchsuche

$string = "!&22E2&!'&5aSJ^#$&6 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
对md5加密后返回的16位二进制字节进行异或操作
$data =  array();
 $data[0]="0";
for($i = 0; $i      $data[$i % 4 +1] ^=$md5[$i];
}
然后获得一个整数值
 $val = 0; 
        $val = $bytes[$data+1] & 0xff; 
        $val          $val |= $bytes[$data+ 2] & 0xff; 
        $val          $val |= $bytes[$data+ 3] & 0xff; 
        $val          $val |= $bytes[$data+4] & 0xff; 
echo $val;
为何返回的值不正确呢?是不是我哪里有错误了?请各位指点下


回复讨论(解决方案)

你应该说清楚你想做的事情是什么啊,就是你正确的逻辑是什么。而且你的代码本身也是有syntax error的。我也没看出来你想做什么。

感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数

你说结果不正确,那么正确的值是什么呢?
你只给了代码片段,无法测试

感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数



1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5
2. 你这次的描述并没有比你代码中的注释给出更多的信息,请像一个程序员一样来描述。比如你说 每8位做一次异或,异或是一个二元操作操作符,那它是和谁异或。
3. 如楼上所述,你认为实现有问题,那请给出一个输入应该得到的正常的输出
4. 看我第一次回复,请先打理好自己的代码,把它写成可运行的版本,并且只保留与问题本身相关的部分,就算有逻辑错误也不能有语法错误。

你说结果不正确,那么正确的值是什么呢?
你只给了代码片段,无法测试


这往往解释了为什么国内程序员越来越多,而这些曾经老牌的中文技术社区均已没落了。
想如果再遇到不好好提问题的,应该封号,然后找个类似“提问的智慧”的文档,让被封人的朗诵一遍录音发过来手动解封。录音中同时要朗读发给这个人的一段验证码,避免作弊。
以后再不好好问问题,也不封此人的号了,就把他自己的朗诵链接回在问题后面。

PS: 我今天是有多闲.


感谢回答,我的目的就是对md5加密之后的字符串进行每8位做一次异或得到一个长整数



1. md5不叫加密 http://zh.wikipedia.org/wiki/MD5
2. 你这次的描述并没有比你代码中的注释给出更多的信息,请像一个程序员一样来描述。比如你说 每8位做一次异或,异或是一个二元操作操作符,那它是和谁异或。
3. 如楼上所述,你认为实现有问题,那请给出一个输入应该得到的正常的输出
4. 看我第一次回复,请先打理好自己的代码,把它写成可运行的版本,并且只保留与问题本身相关的部分,就算有逻辑错误也不能有语法错误。

好的谢谢如此耐心的回答啊,用java运行了一段代码,然后用php运行了一段代码,但是结果确不一样,也许我描述太模糊了,先看代码吧。
java代码:

String data = "!&22E2&!'&5aSJ^#$&6 String apSecert="0E2C83D839C026A5E0530100007FEB90";
ByteArrayOutputStream stream = new ByteArrayOutputStream();
stream.write(apSecert.getBytes());
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(data.getBytes());
stream.write(md5.digest());
md5.update(stream.toByteArray());
byte[] md = md5.digest();
byte[] ret = new byte[5]; // 首字节保留0 防止转换成负数, 只使用后4位
for (int i = 0; i  {
ret[i % 4 + 1] ^= md[i];
}
System.out.println("---------------"+new BigInteger(ret));-----得到一个整数
}
php代码:
$string = "!&22E2&!'&5aSJ^#$&6 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data =  array();
 $data[0]="0";
for($i = 0; $i      $data[$i % 4 +1] ^=$md5[$i];
}
 $val = 0; 
        $val = $data[1] & 0xff; 
        $val          $val |= $data[ 2] & 0xff; 
        $val          $val |= $data[3] & 0xff; 
        $val          $val |= $data[4] & 0xff; 
echo $val;

最后结果不一样:是不是精度的问题?还是我的代码有问题?
java:=2676031167
php:=16327680

php代码:我第一次发帖的代码,的确有问题,我再重新写一遍
$string = "!&22E2&!'&5aSJ^#$&6 $md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data =  array();
 $data[0]="0";
for($i = 0; $i      $data[$i % 4 +1] ^=$md5[$i];
}
 $val = 0; 
        $val = $data[1] & 0xff; 
        $val          $val |= $data[ 2] & 0xff; 
        $val          $val |= $data[3] & 0xff; 
        $val          $val |= $data[4] & 0xff; 
echo $val;

是知道啊?能指出我哪里算错了吗?悬赏100人民币

你说 php 运行结果是 16327680
但你贴出的代码得到的是 327680

对的,是我写错了,是327680,我对PHP不熟悉,JAVA的值是正确的,我再考虑是不是PHP对位的运算和JAVA存在出入,因为JAVA是unicode编码,造成和php位运算出错?

这样写

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167

这样写

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);$data =  array(0,0,0,0);for($i = 0; $i < strlen($md5); $i++){  $data[$i % 4 ] ^= ord($md5[$i]);}$val = 0; foreach($data as $v) $val = $val * 256 + $v;printf('%u', $val); //2676031167


感谢版主,你是高手,结贴了,我如何把钱打给你?
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:php-mvc模式(3)Nächster Artikel:使用PHP CURL的POST数据