日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php加解密

發(fā)布時間:2023/12/4 php 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php加解密 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 對稱加密

1.mycyrpt的對稱加密:

/*** @param $key //數(shù)據(jù)加密密鑰 由自己定義,長度有限制 string* @param $string //需要進行加解密的字符串 string* @param $decrypt //加密還是解密 (最簡單的,0代表加密,1代表解密)* @return string*/ function encryptDecrypt($key, $string, $decrypt) {if(!$decrypt) {//加密$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));return $encrypted;} else {//解密$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");return $decrypted;}}//使用方法: echo encryptDecrypt('passwordgg', 'Hello歡迎您',0); //加密 ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM= echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1); //解密 Hello歡迎您

參考加密文檔?php.net

參考解密文檔??php.net

注: 此方法php7.1開始已經(jīng)被廢棄,開始采用openssl_encrypt和openssl_decrypt , 官方推薦使用openssl一族進行加解密

?

2.OpenSSL 擴展中的對稱加密

/*** @param string $data 需要加解密的數(shù)據(jù)字符串 string* @param int $yes 加密還是解密(1表示加密,0表示解密)* @param string $key 數(shù)據(jù)加密密鑰* @param string $iv 初始化向量 //注:這里為了顯示效果,暫時將iv存儲到session中,* @param string $iv 實際應用中,應該將iv和加密后的字符串都存儲在數(shù)據(jù)庫* @param string $encryptMethod 數(shù)據(jù)加密方式 100余種,可通過openssl_get_cipher_methods()函數(shù)獲取,* @param string $encryptMethod 選擇其中一種(如果選擇cbc結尾的加密算法,需要初始化向量iv,如本例)* @return string*/ function openssl_crypt($data = '', $yes = 1, $key = 'secret', $iv = '', $encryptMethod = 'aes-256-cbc') {if($yes) {$ivLength = openssl_cipher_iv_length($encryptMethod); //獲取該加密算法iv應該具有的長度$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)if (false === $iv && false === $isStrong) {die('IV generate failed');}//加密$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);$_SESSION['iv'] = $iv; //將iv存到session中return $encrypted;} else {//解密$decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);return $decrypted;} }//使用方法 echo $a = openssl_crypt('我愛北京天安門 /我愛祖國',1,'passG506'); //加密 LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8 echo "<br>"; echo openssl_crypt($a,0,'passG506',$_SESSION['iv']); //解密 我愛北京天安門 /我愛祖國

注: 1. 為什么要生成iv,iv的作用是什么

回顧一下 openssl_get_cipher_methods() 返回的加密算法列表,有很多名字中間帶有 “CBC” 字樣,這些加密算法使用了同一種加密模式,也就是 密碼分組鏈接模式(Cipher Block Chaining)。

?

在 CBC 模式的加密算法中,明文會被分成若干個組,以組為單位加密。每個組的加密過程,依賴他前一個組的數(shù)據(jù):需要跟前一組的數(shù)據(jù)進行異或操作后生成本組的密文。那么最開頭的那個組又要依賴誰呢?依賴的就是 IV,所以這就是為什么 IV 要叫初始化向量。IV 是 初始化向量(initialization vector)的縮寫

IV 應該是隨機生成的,所以代碼用到了 openssl_random_pseudo_bytes() 生成 IV。該函數(shù)接收一個 int,代表需要生成的 IV 的長度。

IV 長度隨加密算法不同而不同。一般人是記不住那么多算法需要的 IV 長度的。所以直接使用 openssl_cipher_iv_length() 函數(shù),這個函數(shù)返回一個 int,表示加密算法需要的 IV 長度:

echo openssl_cipher_iv_length('AES-256-CBC'); // 16
echo openssl_cipher_iv_length('BC-CBC'); // 8
echo openssl_cipher_iv_length('AES-128-ECB'); // 0

比如 AES-256-CBC 需要16位的 IV、 BC-CBC 需要 8 位的 IV、而AES-128-ECB 不需要 IV,所以返回了 0。

?

2. 在使用過程中需要注意的問題

在進行加解密時,兩個函數(shù)除了第一個參數(shù)不同,其余參數(shù)都要保證相同才能順利解密。最后,在使用需要 IV 的加密算法時,需要注意:

必須傳 $iv 參數(shù),不傳的話PHP將會拋出一個 Warning
IV 應該是隨機生成的(比如用 openssl_random_pseudo_bytes() ),不能人為設定
每次加密都應該重新生成一次 IV ,不可偷懶多次加密采用相同 IV
IV 要隨著密文一起保存(不然就沒法解密啦),可以直接附在密文串后面,也可以分開保存

如果看不懂,可以參考對稱加密

?

二 非對稱加密

?

常用的非對稱加密有RSA算法,非對稱加密和解密使用的是不同的密鑰,其中一個對外公開作為公鑰,另一個只有私有者擁有,作為私鑰。

用私鑰加密的信息只有公鑰才能解開,或者反之用公鑰加密的信息只有私鑰才能解開。

在RSA加解密之前,需要先生成一對公私鑰,可使用Linux自帶的RSA密鑰生成工具openssl獲取一對公私鑰,也可以使用PHP openssl擴展函數(shù)生成一對公私鑰。

?

示例代碼:

---以后再補----

可參考:RSA非對稱加密

?

注:非對稱加密的缺點是機密和解密花費時間長,速度慢,只適合對少量數(shù)據(jù)進行加密。

如果既想有很快的加密速度,又想保證數(shù)據(jù)比對稱加密更安全,可以使用混合加密。(即 對數(shù)據(jù)進行對稱加密,對密鑰做非對稱加密)

解密的時候,先用非對稱加密得到密鑰,再用密鑰解開密文得到明文。

?

總結

以上是生活随笔為你收集整理的php加解密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。