欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

des加密解密算法 - 怎么可以让php代码:62837 << -16 在windows和linux中得到相同的结果?

程序员文章站 2024-02-01 12:19:22
...
进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。

网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教

win的结果:-176881664
lin的结果:-759700962142060544

@eechen

回复内容:

进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。

网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教

win的结果:-176881664
lin的结果:-759700962142060544

@eechen

恭喜你掉到php的一个大坑了。

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

就是这个问题导致了各种匪夷所思的问题。

PHP 不支持无符号整数。

引用php原文

然而,你出现此问题是因为你两个系统的long型(php的int型在内核中均为long型)长度不一致(因为系统位数不一样)。
所以,你如要想解决此问题,就必须手动处理int到uint。

$flag=$int&0x80000000;
//取出符号位,判断是否是负数,溢出int范围,但没溢出uint范围时,符号位为1,即为负数
if($flag){
    $int ^= 0xffffffff;
    $int += 1;
}

BTW,最新的php7修正了此问题,但php中无法移位一个负数。

不知道这段代码是从何而来的,左右移负数的代码是由CPU完成运算的,所以这里完全依赖机器,与系统关系都不大,看看能不能修正这段代码,或者只能是使用其他方法来代替左右移负数了。

所以从 php7 开始,位移一个负数会直接报错...