如何通过PHP实现Des加密算法代码实例
如何通过PHP实现Des加密算法代码实例
注:php7以上不支持了,因为php7去掉了某些函数,另外变量的{}要改为[]
>4&$masks[4])^$right)&0x0f0f0f0f;$right^=$temp;$left^=($temp<<4); $temp=(($left>>16&$masks[16])^$right)&0x0000ffff;$right^=$temp;$left^=($temp<<16); $temp=(($right>>2&$masks[2])^$left)&0x33333333;$left^=$temp;$right^=($temp<<2); $temp=(($right>>8&$masks[8])^$left)&0x00ff00ff;$left^=$temp;$right^=($temp<<8); $temp=(($left>>1&$masks[1])^$right)&0x55555555;$right^=$temp;$left^=($temp<<1); $left=(($left<<1)|($left>>31&$masks[31])); $right=(($right<<1)|($right>>31&$masks[31])); for($j=0;$j<$iterations;$j+=3){ $endloop=$looping[$j+1]; $loopinc=$looping[$j+2]; for($i=$looping[$j];$i!=$endloop;$i+=$loopinc){ $right1=$right^$keys[$i]; $right2=(($right>>4&$masks[4])|($right<<28))^$keys[$i+1]; $temp=$left; $left=$right; $right=$temp^($spfunction2[($right1>>24&$masks[24])&0x3f]|$spfunction4[($right1>>16&$masks[16])&0x3f] |$spfunction6[($right1>>8&$masks[8])&0x3f]|$spfunction8[$right1&0x3f] |$spfunction1[($right2>>24&$masks[24])&0x3f]|$spfunction3[($right2>>16&$masks[16])&0x3f] |$spfunction5[($right2>>8&$masks[8])&0x3f]|$spfunction7[$right2&0x3f]); } $temp=$left;$left=$right;$right=$temp; } $left=(($left>>1&$masks[1])|($left<<31)); $right=(($right>>1&$masks[1])|($right<<31)); $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=(($right>>2&$masks[2])^$left)&0x33333333;$left^=$temp;$right^=($temp<<2); $temp=(($left>>16&$masks[16])^$right)&0x0000ffff;$right^=$temp;$left^=($temp<<16); $temp=(($left>>4&$masks[4])^$right)&0x0f0f0f0f;$right^=$temp;$left^=($temp<<4); if($mode==1){if($encrypt){$cbcleft=$left;$cbcright=$right;}else{$left^=$cbcleft2;$right^=$cbcright2;}} $tempresult.=(chr($left>>24&$masks[24]).chr(($left>>16&$masks[16])&0xff).chr(($left>>8&$masks[8])&0xff).chr($left&0xff).chr($right>>24&$masks[24]).chr(($right>>16&$masks[16])&0xff).chr(($right>>8&$masks[8])&0xff).chr($right&0xff)); $chunk+=8; if($chunk==512){$result.=$tempresult;$tempresult="";$chunk=0;} } return($result.$tempresult); } privatefunction_createKeys($key){ $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); $iterations=((strlen($key)>=24)?3:1); $keys=array(); $shifts=array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0); $m=0; $n=0; for($j=0;$j<$iterations;$j++){ $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); $temp=($left<<8)|(($right>>20&$masks[20])&0x000000f0); $left=($right<<24)|(($right<<8)&0xff0000)|(($right>>8&$masks[8])&0xff00)|(($right>>24&$masks[24])&0xf0); $right=$temp; for($i=0;$i0){ $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; $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); } } return$keys; } } //使用方式 $Des=newDes(); $string='helloleven'; $key='123456'; $encode=$Des->encrypt($string,$key,true); $decode=$Des->decrypt($encode,$key,true); echo$encode; echo"
"; echo$decode; ?>
另一个DES加密算法
classCryptDes{ function__construct(){ $this->key='codelovers';//密钥 $this->iv='15548632';//偏移量 } /* *加密 */ functionencrypt($input){ $size=mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES $input=$this->pkcs5_pad($input,$size);//如果采用PaddingPKCS7,请更换成PaddingPKCS7方法。 $key=str_pad($this->key,8,'0');//3DES加密将8改为24 $td=mcrypt_module_open(MCRYPT_DES,'',MCRYPT_MODE_CBC,''); if($this->iv=='') { $iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND); } else { $iv=$this->iv; } @mcrypt_generic_init($td,$key,$iv); $data=mcrypt_generic($td,$input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data=base64_encode($data);//如需转换二进制可改成bin2hex转换 return$data; } /* *解密 */ functiondecrypt($encrypted){ $encrypted=base64_decode($encrypted);//如需转换二进制可改成bin2hex转换 $key=str_pad($this->key,8,'0');//3DES加密将8改为24 $td=mcrypt_module_open(MCRYPT_DES,'',MCRYPT_MODE_CBC,'');//3DES加密将MCRYPT_DES改为MCRYPT_3DES if($this->iv=='') { $iv=@mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND); } else { $iv=$this->iv; } $ks=mcrypt_enc_get_key_size($td); @mcrypt_generic_init($td,$key,$iv); $decrypted=mdecrypt_generic($td,$encrypted); mcrypt_generic_deinit($td); mcrypt_module_close($td); $y=$this->pkcs5_unpad($decrypted); return$y; } functionpkcs5_pad($text,$blocksize){ $pad=$blocksize-(strlen($text)%$blocksize); return$text.str_repeat(chr($pad),$pad); } functionpkcs5_unpad($text){ $pad=ord($text{strlen($text)-1}); if($pad>strlen($text)){ returnfalse; } if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad){ returnfalse; } returnsubstr($text,0,-1*$pad); } functionPaddingPKCS7($data){ $block_size=mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES $padding_char=$block_size-(strlen($data)%$block_size); $data.=str_repeat(chr($padding_char),$padding_char); return$data; } }
用法如下:
$str='www.nhooo.com';
$des=newCryptDes();
$mres=$des->encrypt($str);//加密
echo$mres."
";
$jres=$des->decrypt($mres);//解密
echo$jres."
";
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。