PHP實現(xiàn)的AES 128位加密算法示例
本文實例講述了PHP實現(xiàn)的AES 128位加密算法。分享給大家供大家參考,具體如下:
/* 加密算法一般分為兩種:對稱加密算法和非對稱加密算法。 對稱加密 對稱加密算法是消息發(fā)送者和接收者使用同一個密匙,發(fā)送者使用密匙加密了文件, 接收者使用同樣的密匙解密,獲取信息。常見的對稱加密算法有:des/aes/3des. 對稱加密算法的特點(diǎn)有:速度快,加密前后文件大小變化不大,但是密匙的保管是個大問題 ,因為消息發(fā)送方和接收方任意一方的密匙丟失,都會導(dǎo)致信息傳輸變得不安全。 非對稱加密 與對稱加密相對的是非對稱加密,非對稱加密的核心思想是使用一對相對的密匙 分為公匙和私匙,私匙自己安全保存,而將公匙公開。公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進(jìn)行加密, 只有用對應(yīng)的私鑰才能解密;如果用私鑰對數(shù)據(jù)進(jìn)行加密,那么只有用對應(yīng)的公鑰才能解密發(fā)送數(shù)據(jù)前只需要使用接收方的公匙加密就行了。 常見的非對稱加密算法有RSA/DSA:非對稱加密雖然沒有密匙保存問題,但其計算量大,加密速度很慢,有時候我們還需要對大塊數(shù)據(jù)進(jìn)行分塊加密。 數(shù)字簽名 為了保證數(shù)據(jù)的完整性,還需要通過散列函數(shù)計算得到一個散列值,這個散列值被稱為數(shù)字簽名。其特點(diǎn)有: 無論原始數(shù)據(jù)是多大,結(jié)果的長度相同的; 輸入一樣,輸出也相同; 對輸入的微小改變,會使結(jié)果產(chǎn)生很大的變化; 加密過程不可逆,無法通過散列值得到原來的數(shù)據(jù); 常見的數(shù)字簽名算法有md5,hash1等算法。 PHP的openssl擴(kuò)展 openssl擴(kuò)展使用openssl加密擴(kuò)展包,封裝了多個用于加密解密相關(guān)的PHP函數(shù),極大地方便了對數(shù)據(jù)的加密解密。 常用的函數(shù)有: 對稱加密相關(guān): string openssl_encrypt ( string $data , string $method , string $password) 其中$data為其要加密的數(shù)據(jù),$method是加密要使用的方法,$password是要使用的密匙,函數(shù)返回加密后的數(shù)據(jù); 其中$method列表可以使用openssl_get_cipher_methods()來獲取 其解密函數(shù)為 string openssl_encrypt ( string $data , string $method , string $password) 非對稱加密相關(guān): 它們都只需要傳入證書文件(一般是.pem文件); 使用公匙加密數(shù)據(jù),其中$data是要加密的數(shù)據(jù);$crypted是一個引用變量,加密后的數(shù)據(jù)會被放入這個變量中;$key是要傳入的公匙數(shù)據(jù); 由于被加密數(shù)據(jù)分組時,有可能不會正好為加密位數(shù)bit的整數(shù)倍,所以需要$padding(填充補(bǔ)齊), $padding的可選項有 OPENSSL_PKCS1_PADDING, OPENSSL_NO_PADDING,分別為PKCS1填充,或不使用填充; 簽名函數(shù):$data為要簽名的數(shù)據(jù);$signature為簽名結(jié)果的引用變量;$priv_key_id為簽名所使用的私匙;$signature_alg為簽名要使用的算法 ,其算法列表可以使用openssl_get_md_methods()得到 驗簽函數(shù):與簽名函數(shù)相對,只不過它要傳入與私匙對應(yīng)的公匙;其結(jié)果為簽名驗證結(jié)果,1為成功,0為失敗,-1則表示錯誤; * */ /* * 基于百度云API的例子 * 密碼一律采用AES 128位加密算法進(jìn)行加密,用SK的前16位作為密鑰, * 加密后生成的二進(jìn)制字節(jié)流需要轉(zhuǎn)成十六進(jìn)制,并以字符串的形式傳到服務(wù)端 * */ function aes128WithFirst16Char($adminPass, $secretAccessKey) { $adminPass = pkcs5Pad($adminPass); //把key值截取成16位的 $secretAccessKey = substr($secretAccessKey, 0, 16); //進(jìn)行AES加密 $crypted = openssl_encrypt($adminPass, 'AES-128-ECB', $secretAccessKey, OPENSSL_RAW_DATA); //把字符串轉(zhuǎn)換為16進(jìn)制 return bin2hex(substr($crypted, 0, 16)); } //把密碼填充成16位 function pkcs5Pad($adminPass) { $pad = 16 - (strlen($adminPass) % 16); return $adminPass . str_repeat(chr($pad), $pad); } echo aes128WithFirst16Char('加密的密碼','key值');
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_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è)計算法總結(jié)》及《php正則表達(dá)式用法總結(jié)》
希望本文所述對大家PHP程序設(shè)計有所幫助。
相關(guān)文章
PHP實現(xiàn)漢字轉(zhuǎn)拼音類庫的使用方法
這篇文章主要為大家介紹了PHP實現(xiàn)漢字轉(zhuǎn)拼音類庫使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06騰訊微博提示missing parameter errorcode 102 錯誤的解決方法
這篇文章主要介紹了騰訊微博提示missing parameter errorcode 102 錯誤的解決方法,是針對騰訊微博接口開發(fā)中比較典型的錯誤問題,需要的朋友可以參考下2014-12-12php中unlink()、mkdir()、rmdir()等方法的使用介紹
unlink()函數(shù)刪除文件 、mkdir()函數(shù)創(chuàng)建目錄、rmdir()函數(shù)刪除目錄這些方法在文件相關(guān)的處理方法會經(jīng)常使用到,本文整理了一些,需要的朋友可以了解下2012-12-12The specified CGI application misbehaved by not returning a
The specified CGI application misbehaved by not returning a complete set of HTTP headers2011-03-03