您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

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

2024/3/25 9:25:50发布22次查看
$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

感谢版主,你是高手,结贴了,我如何把钱打给你?
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product