使用php實現(xiàn)簡單的對稱加密和解密過程

?? 個人主頁 極客小俊
??? 作者簡介:web開發(fā)者是辕、設計師、技術分享博主
?? 希望大家多多支持一下, 我們一起進步!??
?? 如果文章對你有幫助的話伍绳,歡迎評論 ??點贊???? 收藏 ??加關注

為什么我們要加密?

加密是為了信息傳遞更加安全!

這樣才能更好的讓信息傳遞更具有保密性,不會被他人隨意篡改、也能夠讓信息真實有效的到達指定對象的手里!

我們加密的目的乍桂,多數(shù)是圍繞這上面這些情況來的!

舉個栗子

在信息通信過程當中冲杀,比如你發(fā)送一條重要信息給對方, 在這個過程中其實有很多人可以利用一些技術手段接觸到這一段信息! 如果是很重要的信息但個別人利用睹酌,說不一定就會產(chǎn)生嚴重的經(jīng)濟損失!

例如: 信息中包含了一些敏感信息,如身份證权谁、銀行卡、密碼憋沿、而這些敏感信息是最容易被人偷窺的!

如圖

為了避免出現(xiàn)以上的情況旺芽,我們就要將信息進行加密處理, 這樣子即便是被人拿到了關鍵信息,他也是在短時間內無法查看的,也就是讓任何第三方都無法直接讀取和讀懂的信息!

只有發(fā)送方接收方能看懂整個數(shù)據(jù)傳輸?shù)男畔ⅰ?/p>

加密系統(tǒng)的簡單架構

加密的產(chǎn)生過程辐啄,簡單點說其實就是: 明文+密鑰+算法=密文

如圖

從上面的圖來看甥绿,其實明文算法都還是比較好理解,但其中有一個叫密鑰的東西,它就好比是像彼此約定好了的暗號一樣, 也是最簡單的加密方式!

舉個栗子

從生活中我們用一個鎖家里的門來舉例的話则披,就是家中有價值的物品共缕,就是你的明文、那么密鑰就是你的鑰匙士复,那么算法就是你是通過什么樣的情況來鎖門的! 當門鎖好之后图谷,那么一個就形成了一個加密狀態(tài)了!

所以這個密鑰通常都是需要保密的,就是這個意思阱洪,你總不可能把你的鑰匙隨便丟吧!

對稱加密

那么在計算機中便贵,我們也一些有比較安全和常見的加密方式, 例如:對稱加密

對稱加密其實分為兩種形式: 對稱加密非對稱加密

簡單的說對稱加密也就是加密解密都會使用同樣密鑰

非對稱加密則恰恰相反,這種加密解密使用的是不同密鑰

AES對稱加密算法

AES全稱:advanced encryption standard 它是密碼學中的高級加密標準,也是美國聯(lián)邦政府采用的區(qū)塊加密的標準,也是當下比較流行的對稱密碼算法!

我們前面提到的對稱加密中就包含了AES 也就是加密解密都會使用同樣密鑰加密算法

簡單的說發(fā)送方明文密鑰一起經(jīng)過特殊加密算法處理后,使其變成復雜的加密密文再發(fā)送出去!

接收方如果想解讀明文, 那么需要使用加密用過的密鑰相同算法然后按照與加密時相反的順序逆推算法對密文進行解密冗荸,才能使其恢復成可讀的明文信息!

前面說了,在對稱AES加密算法中承璃,使用的密鑰只有一個, 發(fā)送方接收方都使用這個密鑰對數(shù)據(jù)進行加密解密,那么這就要求解密的一方事先必須知道加密密鑰對吧!

如圖

這就像是它要求發(fā)送方接收方在通信之前蚌本,約定一個密鑰(暗號)

對稱算法的安全性依賴于密鑰盔粹,如果泄漏密鑰就意味著任何人都可以對他們發(fā)送接收的數(shù)據(jù)進行解密

所以密鑰的保密性對AES通信的安全性至關重要!

對稱加密算法的優(yōu)點在于加密和解密快速和使用長密鑰時的難破解性,而這種加密算法支持長度為 128比特的密鑰長度, 同時也支持192隘梨、256比特一共三種選擇!

我們知道加密的核心在于密鑰算法本身其實最終都會被破解的,所以現(xiàn)在流行的密碼算法都是公開的,所以從密碼學的角度而言也沒有人去保密算法來提高安全性舷嗡,所以說對于現(xiàn)在某些密碼攻擊手段對于一些高級加密標準算法本身并沒有效果,真正核心的還是密鑰, 這里密鑰的長度直接就會影響到蠻力攻擊要取得成功需要耗費相當長的時間,而這種對稱加密算法安全性取決于密鑰的保存情況來決定!

所以普通情況下轴猎,沒有特殊需求,基本上首先的是AES加密

應用場景

這里我簡單說一個案例

假設我們現(xiàn)在有一個包含用戶個人信息的JSON對象进萄,需要進行加密處理

如下

{  
  "name": "張三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "13812345678"  
}

那么此時我們可以使用一些加密算法,比如:AES捻脖、RSA 對這個JSON對象中的一些數(shù)據(jù)進行加密處理。

然后加密之后的數(shù)據(jù)會變成一串密文中鼠,用戶是無法直接閱讀和理解可婶。

例如:使用AES算法加密上述JSON對象,結果可能類似于以下形式:

{  
  "name": "張三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "tv/yxsWlDIPHOnD50WVnFw=="  
}

現(xiàn)在可以看到援雇,加密后的JSON對象中的phone電話字段已經(jīng)被替換為一串看似隨機的字符串扰肌,我們是無法直接讀取原始的手機號的, 這樣也對整個JSON對象也變得難以理解和解析。

這里加密后的JSON數(shù)據(jù)需要解密后才能還原為原始數(shù)據(jù),而解密過程加密相反熊杨,

需要使用相應的解密算法密鑰來還原數(shù)據(jù)曙旭。

PHP實現(xiàn)AES對稱加密

我們來實現(xiàn)一個簡單的加密案例,有興趣的朋友可以來看看,java、php晶府、python等等用什么語言都可以!

我用php中的OpenSSl擴展庫來實現(xiàn)AES對稱加密與解密

不用我們去了解底層桂躏,只需要輕松幾步就可以實現(xiàn)一個簡單加密和解密數(shù)據(jù)的過程!

代碼如下

<?php  
  
function encryptAES($data, $key, $iv) {    
    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    $encrypted = base64_encode($encrypted);  
    return $encrypted;  
}  
  
function decryptAES($encryptedData, $key, $iv) {  
    $encryptedData = base64_decode($encryptedData);  
    $decrypted = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    return $decrypted;  
}  
  
// 加密數(shù)據(jù)  
$data = 'Hello-World!';  
$key = '0123456789abcdef';
$iv = '1234567890abcdef';
  
$encryptedData = encryptAES($data, $key, $iv);  
echo '加密后的數(shù)據(jù):' . $encryptedData;  

echo '<hr>';

// 解密數(shù)據(jù)  
$decryptedData = decryptAES($encryptedData, $key, $iv);  
echo '解密后的數(shù)據(jù):' . $decryptedData;  
  
?>

效果如下

代碼分析

這里簡單的使用到了phpOpenSSl擴展庫openssl_encryptopenssl_decrypt函數(shù)來實現(xiàn)的AES

openssl_encrypt函數(shù)解釋

如下表

參數(shù)列表 含義
參數(shù)1:data 待加密的明文信息數(shù)據(jù), 也就是需要加密的數(shù)據(jù),你可以把它想象成你想要鎖起來的秘密信息
參數(shù)2:method 加密方式, 也就是你想要用來加密數(shù)據(jù)加密算法, 常見的加密算法包括 AES, 具體可以查看官方文檔 例如: 你使用 AES-256-CBC 算法,那么 CBC 表示加密模式川陆,256 表示密鑰的長度
參數(shù)3:key 約定加密和解密的一把鑰匙, 而這把密鑰的長度必須與所選擇的加密算法相匹配.........例如剂习,如果使用 AES-256-xxx,那么你的密鑰應該是 256位長! 所以我們最好要給定相應字節(jié)長度的字符串密鑰,雖然有時候我們沒有定義指定長度的字符的密鑰较沪,但仍然能夠成功加密數(shù)據(jù)鳞绕,是因為PHPOpenSSL擴展自動處理了密鑰的填充和生成! 但是為了確保最佳的安全性,最好顯式地指定一個符合長度要求的密鑰! 這樣可以避免任何潛在的填充問題尸曼,并確保密鑰的長度與所選加密算法的要求相匹配, 比如說: 在 AES-256 算法中们何,密鑰的長度為 32字節(jié)(256 位)的字符串就可以了! 這里我采用的是AES,而AES密鑰的長度通晨亟危可以是128位冤竹、192位、256位
參數(shù)4:options 它可以控制如何處理返回的數(shù)據(jù), 它有兩種常量設置方式: OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING 例如茬射,你可以設置 OPENSSL_RAW_DATA 常量選項鹦蠕,這樣函數(shù)會返回原始的二進制數(shù)據(jù),一把也都設置這個!
參數(shù)5:iv 它是一個初始化向量, 用于增加加密安全性隨機性! 這里所謂的初始化向量其實就是一個隨機字符串,但是這個隨機字符串是有一定講究的,它的字符長度通常需要與加密模式的要求相匹配, 也就是說不同的加密模式可能會有不同的iv要求, 例如: 當我們使用AES-256-CBC加密模式時,iv參數(shù)應該至少為16字節(jié)長度的隨機字符串, 如果使用AES-128-CBC加密模式時, iv參數(shù)必須為16字節(jié)長度的隨機字符串,多一個或少一個都會報錯! 所以iv這個參數(shù),最好是要和加密模式中的長度一致就行了! 為了更加安全在抛,這個iv最好不能寫死钟病,用一種算法方式生成指定長度的iv 這樣子在每次加密操作時都會改變加密結果!
....................................

返回值:成功時返回加密后的字符串

openssl_decrypt函數(shù)解釋

如下表

參數(shù)列表 描述
參數(shù)1:data 要解密的數(shù)據(jù)字符串,通常是由 openssl_encrypt 函數(shù)加密后的結果。
參數(shù)2:method 填寫加密方式,既然要解密那么就要知道是如何加密的肠阱,所以這里就必須填寫與加密時使用的算法模式相同! 例如: 加密模式AES-256-CBC 那么這里就必須填寫AES-256-CBC
參數(shù)3:key 解密密鑰票唆。這是用于解密的密鑰,與加密時使用的密鑰相同! 舉個生活上的案例辖所,你用什么鑰匙鎖門,那么你就要用相應的鑰匙來開門磨德,對吧! 并且這個密鑰的長度也要一致!
參數(shù)4:options 數(shù)據(jù)以什么形式進行處理并返回 它有兩種常量設置方式: OPENSSL_RAW_DATAOPENSSL_ZERO_PADDING , 加密時設置的什么缘回,這里就設置什么!
參數(shù)5:iv 解密時需要使用加密時相同的 iv
.........................................

所以在上面的案例中encryptAES函數(shù)接受要加密的數(shù)據(jù)、密鑰初始向量典挑,并返回加密后的結果酥宴。

而且decryptAES函數(shù)接受加密后的數(shù)據(jù)、密鑰初始向量您觉,并返回解密后的原始數(shù)據(jù)拙寡。

特別注意的是密鑰初始向量的長度,必須要符合加密算法的要求!

大致流程如下圖:

小結

看到這里你也應該大致了解了一下對稱加密了吧, 其實關于對稱加密還有很多有趣的內容,以后可以慢慢給跟大家分享!

如果我的博客對你有幫助、如果你喜歡我的博客內容琳水,請 “??點贊” “??評論” “??收藏” 一鍵三連哦肆糕!

如果以上內容有任何錯誤或者不準確的地方,????歡迎在下面 ?? 留個言指出在孝、或者你有更好的想法诚啃,歡迎一起交流學習??????????

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市私沮,隨后出現(xiàn)的幾起案子始赎,更是在濱河造成了極大的恐慌,老刑警劉巖仔燕,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造垛,死亡現(xiàn)場離奇詭異,居然都是意外死亡晰搀,警方通過查閱死者的電腦和手機五辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來外恕,“玉大人奔脐,你說我怎么就攤上這事∮跆郑” “怎么了髓迎?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長建丧。 經(jīng)常有香客問我排龄,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任橄维,我火速辦了婚禮尺铣,結果婚禮上,老公的妹妹穿的比我還像新娘争舞。我一直安慰自己凛忿,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布竞川。 她就那樣靜靜地躺著店溢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪委乌。 梳的紋絲不亂的頭發(fā)上床牧,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音遭贸,去河邊找鬼戈咳。 笑死,一個胖子當著我的面吹牛壕吹,可吹牛的內容都是我干的著蛙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼耳贬,長吁一口氣:“原來是場噩夢啊……” “哼册踩!你這毒婦竟也來了?” 一聲冷哼從身側響起效拭,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤暂吉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缎患,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慕的,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年挤渔,在試婚紗的時候發(fā)現(xiàn)自己被綠了肮街。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡判导,死狀恐怖嫉父,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情眼刃,我是刑警寧澤绕辖,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站擂红,受9級特大地震影響仪际,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一树碱、第九天 我趴在偏房一處隱蔽的房頂上張望肯适。 院中可真熱鬧,春花似錦成榜、人聲如沸框舔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刘绣。三九已至,卻和暖如春惑淳,著一層夾襖步出監(jiān)牢的瞬間额港,已是汗流浹背饺窿。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工歧焦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚医。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓绢馍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肠套。 傳聞我的和親對象是個殘疾皇子舰涌,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容