讲道理,一提到3DES算法,首先想到的是要和java做交互了==
现在3DES已经渐渐被抛弃了,尤其是ECB加密模式使用的更少了,但是没办法,业务需要,合作方用的是他,你头再铁也不能怎样,那就扒扒文档咯
网上完整的php实现以经不多了,CBC加密模式居多,所以我参考了好几篇文章,整理了一个class出来,共享上来,避免后来人踩坑
感谢前人的整理总结:
PHP版3DES加解密类更新成PKCS5填充模式 (http://blog.163.com/hui_san/blog/static/5710286720103169370195/)
java和php对等的3DES加密算法(http://jamie-wang.iteye.com/blog/1604596)
JAVA和PHP通用的加解密整理版(http://www.blogjava.net/qileilove/archive/2013/09/16/404111.html)
在线测试网址 http://tool.chacuo.net/crypt3des
废话不多说直接上代码
/*** Created by PhpStorm.* User: KeenSting* Date: 2017/11/23* Time: 下午2:28* Name: 梁小苍* Phone: 13126734215* QQ: 707719848* File Description: 3DES_ECB_PKCS5Padding*/classTripleDesEcb{/**加密*@param$text string 文本内容*@param$key string 秘钥 max 24*@returnstring*/public functionencrypt($text,$key){$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB),MCRYPT_RAND);$text=$this->pkcs5Pad($text);$td= mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');mcrypt_generic_init($td,$key,$iv);$data= base64_encode(mcrypt_generic($td,$text));mcrypt_generic_deinit($td);mcrypt_module_close($td);print_r($data);return$data;}/**解密*@param$text*@param$key*/public functiondecrypt($text,$key){$iv= mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_ECB),MCRYPT_RAND);$td= mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_ECB,'');mcrypt_generic_init($td,$key,$iv);$data=$this->pkcs5UnPad(mdecrypt_generic($td,base64_decode($text)));mcrypt_generic_deinit($td);mcrypt_module_close($td);print_r($data);}/***@param$text*@returnstring*/private functionpkcs5Pad($text){$pad=8- (strlen($text) %8);return$text. str_repeat(chr($pad),$pad);}/***@param$text*@returnbool|string*/private functionpkcs5UnPad($text){$pad= ord($text{strlen($text)-1});if($pad> strlen($text))return false;if(strspn($text,chr($pad),strlen($text) -$pad) !=$pad)return false;returnsubstr($text,0,-1*$pad);}}//test$a=newTripleDesEcb();$r=$a->encrypt('keensting','AA190CD754A89EF100190CD754A89EF1');$a->decrypt($r,'AA190CD754A89EF100190CD754A89EF1');
测试的加密结果经过base64编码后为:juyYkxc6B+Ym3p8QQdvXIg==,解密即可得到原文(对称加密算法的加密和解密用的是同一个类)