Home  >  Article  >  Backend Development  >  关于位移在win和centos的差异

关于位移在win和centos的差异

WBOY
WBOYOriginal
2016-06-23 14:02:09970browse

项目用到des加密,其中一步是_createKeys

function _createKeys ($key) {      //declaring this locally speeds things up a bit      $pc2bytes0  = array (0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204);      $pc2bytes1  = array (0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101);      $pc2bytes2  = array (0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808);      $pc2bytes3  = array (0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000);      $pc2bytes4  = array (0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010);      $pc2bytes5  = array (0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420);      $pc2bytes6  = array (0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002);      $pc2bytes7  = array (0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800);      $pc2bytes8  = array (0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002);      $pc2bytes9  = array (0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408);      $pc2bytes10 = array (0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020);      $pc2bytes11 = array (0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200);      $pc2bytes12 = array (0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010);      $pc2bytes13 = array (0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105);      $masks = array (4294967295,2147483647,1073741823,536870911,268435455,134217727,67108863,33554431,16777215,8388607,4194303,2097151,1048575,524287,262143,131071,65535,32767,16383,8191,4095,2047,1023,511,255,127,63,31,15,7,3,1,0);      //how many iterations (1 for des, 3 for triple des)      $iterations = ((strlen($key) >= 24) ? 3 : 1);      //stores the return keys      $keys = array (); // size = 32 * iterations but you don't specify this in php      //now define the left shifts which need to be done      $shifts = array (0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0);      //other variables      $m=0;      $n=0;      for ($j=0; $j<$iterations; $j++) { //either 1 or 3 iterations        $left = (ord($key{$m++}) << 24) | (ord($key{$m++}) << 16) | (ord($key{$m++}) << 8) | ord($key{$m++});        $right = (ord($key{$m++}) << 24) | (ord($key{$m++}) << 16) | (ord($key{$m++}) << 8) | ord($key{$m++});        $temp = (($left >> 4 & $masks[4]) ^ $right) & 0x0f0f0f0f; $right ^= $temp; $left ^= ($temp << 4);        $temp = (($right >> 16 & $masks[16]) ^ $left) & 0x0000ffff; $left ^= $temp; $right ^= ($temp << -16);        $temp = (($left >> 2 & $masks[2]) ^ $right) & 0x33333333; $right ^= $temp; $left ^= ($temp << 2);        $temp = (($right >> 16 & $masks[16]) ^ $left) & 0x0000ffff; $left ^= $temp; $right ^= ($temp << -16);        $temp = (($left >> 1 & $masks[1]) ^ $right) & 0x55555555; $right ^= $temp; $left ^= ($temp << 1);        $temp = (($right >> 8 & $masks[8]) ^ $left) & 0x00ff00ff; $left ^= $temp; $right ^= ($temp << 8);        $temp = (($left >> 1 & $masks[1]) ^ $right) & 0x55555555; $right ^= $temp; $left ^= ($temp << 1);        //the right side needs to be shifted and to get the last four bits of the left side        $temp = ($left << 8) | (($right >> 20 & $masks[20]) & 0x000000f0);        //left needs to be put upside down        $left = ($right << 24) | (($right << 8) & 0xff0000) | (($right >> 8 & $masks[8]) & 0xff00) | (($right >> 24 & $masks[24]) & 0xf0);        $right = $temp;        //now go through and perform these shifts on the left and right keys        for ($i=0; $i < count($shifts); $i++) {          //shift the keys either one or two bits to the left          if ($shifts[$i] > 0) {             $left = (($left << 2) | ($left >> 26 & $masks[26]));             $right = (($right << 2) | ($right >> 26 & $masks[26]));          } else {             $left = (($left << 1) | ($left >> 27 & $masks[27]));             $right = (($right << 1) | ($right >> 27 & $masks[27]));          }          $left = $left & -0xf;          $right = $right & -0xf;          //now apply PC-2, in such a way that E is easier when encrypting or decrypting          //this conversion will look like PC-2 except only the last 6 bits of each byte are used          //rather than 48 consecutive bits and the order of lines will be according to          //how the S selection functions will be applied: S2, S4, S6, S8, S1, S3, S5, S7          $lefttemp = $pc2bytes0[$left >> 28 & $masks[28]] | $pc2bytes1[($left >> 24 & $masks[24]) & 0xf]                  | $pc2bytes2[($left >> 20 & $masks[20]) & 0xf] | $pc2bytes3[($left >> 16 & $masks[16]) & 0xf]                  | $pc2bytes4[($left >> 12 & $masks[12]) & 0xf] | $pc2bytes5[($left >> 8 & $masks[8]) & 0xf]                  | $pc2bytes6[($left >> 4 & $masks[4]) & 0xf];          $righttemp = $pc2bytes7[$right >> 28 & $masks[28]] | $pc2bytes8[($right >> 24 & $masks[24]) & 0xf]                    | $pc2bytes9[($right >> 20 & $masks[20]) & 0xf] | $pc2bytes10[($right >> 16 & $masks[16]) & 0xf]                    | $pc2bytes11[($right >> 12 & $masks[12]) & 0xf] | $pc2bytes12[($right >> 8 & $masks[8]) & 0xf]                    | $pc2bytes13[($right >> 4 & $masks[4]) & 0xf];          $temp = (($righttemp >> 16 & $masks[16]) ^ $lefttemp) & 0x0000ffff;          $keys[$n++] = $lefttemp ^ $temp; $keys[$n++] = $righttemp ^ ($temp << 16);        }      } //for each iterations      //return the keys we've created      return $keys;    } //end of des_createKeys


试了几次都是到了标记那段代码就产生不同的结果,好像是位移的原因?

如果用php单独在win7/centos系统加密解密是没有问题的,但是开发ios的程序员说原来在win7上解密可以成功,在centos就失败了
用的是系统提供的函数

提问:如何解决这个问题,或者有相关的其他des类可以在php和IOS使用。


回复讨论(解决方案)

代码怎么没有加颜色
原本代码35行:$temp = (($left >> 2 & $masks[2]) ^ $right) & 0x33333333; $right ^= $temp; $left ^= ($temp 

请注意 32 位系统和 64 位系统的差异

请注意 32 位系统和 64 位系统的差异

本机:win7 64
虚拟机:centos6.4 64
服务器:centos6.3 64

同系统可以互相加密解密,好像不是32/64位的问题啊。

php 不是也有 32位 和 64位 的吗?
 

php 不是也有 32位 和 64位 的吗?
 

在另一台centos服务器上又正常

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn