php DES加密算法實(shí)例分析
本文實(shí)例講述了php DES加密算法。分享給大家供大家參考,具體如下:
yii框架的DES代碼
<?php /** *@see Yii CSecurityManager; */ class Des{ public static function encrypt($data,$key){ $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,''); $key=substr(md5($key),0,mcrypt_enc_get_key_size($module)); srand(); $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND); mcrypt_generic_init($module,$key,$iv); $encrypted=$iv.mcrypt_generic($module,$data); mcrypt_generic_deinit($module); mcrypt_module_close($module); return md5($data).'_'.base64_encode($encrypted); } public static function decrypt($data,$key){ $_data = explode('_',$data,2); if(count($_data)<2){ return false; } $data = base64_decode($_data[1]); $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,''); $key=substr(md5($key),0,mcrypt_enc_get_key_size($module)); $ivSize=mcrypt_enc_get_iv_size($module); $iv=substr($data,0,$ivSize); mcrypt_generic_init($module,$key,$iv); $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data))); mcrypt_generic_deinit($module); mcrypt_module_close($module); $decrypted = rtrim($decrypted,"\0"); if($_data[0]!=md5($decrypted)){ return false; } return $decrypted; } }
在網(wǎng)上看到了一篇文章,講到:
由于PHP使用mcrypt擴(kuò)展進(jìn)行3DES加密,填充模式是跟JAVA以及.NET是不一樣的,JAVA和.NET填充模式使用的是PKCS7。
所以PHP端必須自定義一個(gè)函數(shù)對(duì)加密字符串進(jìn)行PKCS7模式補(bǔ)位填充。
另外一點(diǎn)就是雙方的KEY注意進(jìn)行base64編碼,最后PHP端經(jīng)過3DES加密后得到的結(jié)果也需要進(jìn)行base64編碼。
以上幾點(diǎn)都做好之后,加密結(jié)果就一致了。
下面是兼容C#和java的3DES加密的算法
<?php class STD3Des { private $key = ""; private $iv = ""; /** * 構(gòu)造,傳遞二個(gè)已經(jīng)進(jìn)行base64_encode的KEY與IV * * @param string $key * @param string $iv */ function __construct ($key, $iv) { if (empty($key) || empty($iv)) { echo 'key and iv is not valid'; exit(); } $this->key = $key; $this->iv = $iv; } /** *加密 * @param <type> $value * @return <type> */ public function encrypt ($value) { $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); $iv = base64_decode($this->iv); $value = $this->PaddingPKCS7($value); $key = base64_decode($this->key); mcrypt_generic_init($td, $key, $iv); $ret = base64_encode(mcrypt_generic($td, $value)); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } /** *解密 * @param <type> $value * @return <type> */ public function decrypt ($value) { $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); $iv = base64_decode($this->iv); $key = base64_decode($this->key); mcrypt_generic_init($td, $key, $iv); $ret = trim(mdecrypt_generic($td, base64_decode($value))); $ret = $this->UnPaddingPKCS7($ret); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } private function PaddingPKCS7 ($data) { $block_size = mcrypt_get_block_size('tripledes', 'cbc'); $padding_char = $block_size - (strlen($data) % $block_size); $data .= str_repeat(chr($padding_char), $padding_char); return $data; } private function UnPaddingPKCS7($text) { $pad = ord($text{strlen($text) - 1}); if ($pad > strlen($text)) { return false; } if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) { return false; } return substr($text, 0, - 1 * $pad); } } ?>
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
在線DES加密/解密工具
http://tools.jb51.net/password/des_encode
MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php加密方法總結(jié)》、《PHP編碼與轉(zhuǎn)碼操作技巧匯總》、《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》及《php正則表達(dá)式用法總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
php格式化時(shí)間戳顯示友好的時(shí)間實(shí)現(xiàn)思路及代碼
顯示為2014-10-20 10:22顯得很呆板,那么用php怎么實(shí)現(xiàn)友好的時(shí)間格式呢?下面將思路與實(shí)現(xiàn)代碼與大家分享下2014-10-10讓PHP以ROOT權(quán)限執(zhí)行系統(tǒng)命令的方法
這種問題我想大家可能都遇到過,網(wǎng)友提供的解決方法也很多。我也只是結(jié)合自己系統(tǒng)的需求并結(jié)合網(wǎng)友的解決方案來總結(jié)的一種方法2011-02-02PHP實(shí)現(xiàn)的字符串匹配算法示例【sunday算法】
這篇文章主要介紹了PHP實(shí)現(xiàn)的字符串匹配算法,簡單描述了sunday算法的概念與原理,并結(jié)合實(shí)例形式分析了php基于sunday算法實(shí)現(xiàn)字符串匹配操作相關(guān)技巧,需要的朋友可以參考下2017-12-12