phpmd5加密之后对字节进行异或操作的问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了phpmd5加密之后对字节进行异或操作的问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5005字,纯文字阅读大概需要8分钟。
内容图文
$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
感谢版主,你是高手,结贴了,我如何把钱打给你?
内容总结
以上是互联网集市为您收集整理的phpmd5加密之后对字节进行异或操作的问题全部内容,希望文章能够帮你解决phpmd5加密之后对字节进行异或操作的问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。