当前位置:Gxlcms > PHP教程 > phpmd5加密之后对字节进行异或操作的问题

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

时间:2021-07-01 10:21:17 帮助过:25人阅读

$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
对md5加密后返回的16位二进制字节进行异或操作
$data = array();
$data[0]="0";
for($i = 0; $i < strlen($md5); $i++){
$data[$i % 4 +1] ^=$md5[$i];
}
然后获得一个整数值
$val = 0;
$val = $bytes[$data+1] & 0xff;
$val <<= 8;
$val |= $bytes[$data+ 2] & 0xff;
$val <<= 8;
$val |= $bytes[$data+ 3] & 0xff;
$val <<= 8;
$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<&!&()pR49}I&dh111111";
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 < md.length; i++)
{
ret[i % 4 + 1] ^= md[i];
}
System.out.println("---------------"+new BigInteger(ret));-----得到一个整数
}
php代码:
$string = "!&22E2&!'&5aSJ^#$&6<&!&()pR49}I&dh111111";
$md5 = md5("0E2C83D839C026A5E0530100007FEB90".md5($string,true),true);
$data = array();
$data[0]="0";
for($i = 0; $i < strlen($md5); $i++){
$data[$i % 4 +1] ^=$md5[$i];
}
$val = 0;
$val = $data[1] & 0xff;
$val <<= 8;
$val |= $data[ 2] & 0xff;
$val <<= 8;
$val |= $data[3] & 0xff;
$val <<= 8;
$val |= $data[4] & 0xff;
echo $val;

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

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


感谢版主,你是高手,结贴了,我如何把钱打给你?

人气教程排行