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

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

WBOY
Libérer: 2016-07-06 13:52:46
original
1018 Les gens l'ont consulté

进行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。

<code class="php">$flag=$int&0x80000000;
//取出符号位,判断是否是负数,溢出int范围,但没溢出uint范围时,符号位为1,即为负数
if($flag){
    $int ^= 0xffffffff;
    $int += 1;
}
</code>
Copier après la connexion

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

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

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

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal