欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php對(duì)稱加密和解密的實(shí)現(xiàn)詳解

 更新時(shí)間:2023年11月09日 07:33:44   作者:極客小俊  
加密是為了信息傳遞更加安全,這樣才能更好的讓信息傳遞更具有保密性,不會(huì)被他人隨意篡改,本文為大家介紹了php實(shí)現(xiàn)簡(jiǎn)單的對(duì)稱加密和解密過(guò)程,希望對(duì)大家有所幫助

為什么我們要加密

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

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

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

舉個(gè)栗子

在信息通信過(guò)程當(dāng)中,比如你發(fā)送一條重要信息給對(duì)方, 在這個(gè)過(guò)程中其實(shí)有很多人可以利用一些技術(shù)手段接觸到這一段信息! 如果是很重要的信息但個(gè)別人利用,說(shuō)不一定就會(huì)產(chǎn)生嚴(yán)重的經(jīng)濟(jì)損失!

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

如圖

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

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

加密系統(tǒng)的簡(jiǎn)單架構(gòu)

加密的產(chǎn)生過(guò)程,簡(jiǎn)單點(diǎn)說(shuō)其實(shí)就是: 明文+密鑰+算法=密文

如圖

從上面的圖來(lái)看,其實(shí)明文和算法都還是比較好理解,但其中有一個(gè)叫密鑰的東西,它就好比是像彼此約定好了的暗號(hào)一樣, 也是最簡(jiǎn)單的加密方式!

舉個(gè)栗子

從生活中我們用一個(gè)鎖家里的門來(lái)舉例的話,就是家中有價(jià)值的物品,就是你的明文、那么密鑰就是你的鑰匙,那么算法就是你是通過(guò)什么樣的情況來(lái)鎖門的! 當(dāng)門鎖好之后,那么一個(gè)家就形成了一個(gè)加密狀態(tài)了!

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

對(duì)稱加密

那么在計(jì)算機(jī)中,我們也一些有比較安全和常見(jiàn)的加密方式, 例如:對(duì)稱加密

對(duì)稱加密其實(shí)分為兩種形式: 對(duì)稱加密和非對(duì)稱加密

簡(jiǎn)單的說(shuō)對(duì)稱加密也就是加密和解密都會(huì)使用同樣密鑰

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

AES對(duì)稱加密算法

AES全稱:advanced encryption standard 它是密碼學(xué)中的高級(jí)加密標(biāo)準(zhǔn),也是美國(guó)聯(lián)邦政府采用的區(qū)塊加密的標(biāo)準(zhǔn),也是當(dāng)下比較流行的對(duì)稱密碼算法!

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

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

接收方如果想解讀明文, 那么需要使用加密用過(guò)的密鑰及相同算法然后按照與加密時(shí)相反的順序逆推算法對(duì)密文進(jìn)行解密,才能使其恢復(fù)成可讀的明文信息!

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

如圖

這就像是它要求發(fā)送方和接收方在通信之前,約定一個(gè)密鑰(暗號(hào))

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

所以密鑰的保密性對(duì)AES通信的安全性至關(guān)重要!

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

我們知道加密的核心在于密鑰而算法本身其實(shí)最終都會(huì)被破解的,所以現(xiàn)在流行的密碼算法都是公開(kāi)的,所以從密碼學(xué)的角度而言也沒(méi)有人去保密算法來(lái)提高安全性,所以說(shuō)對(duì)于現(xiàn)在某些密碼攻擊手段對(duì)于一些高級(jí)加密標(biāo)準(zhǔn)算法本身并沒(méi)有效果,真正核心的還是密鑰, 這里密鑰的長(zhǎng)度直接就會(huì)影響到蠻力攻擊要取得成功需要耗費(fèi)相當(dāng)長(zhǎng)的時(shí)間,而這種對(duì)稱加密算法的安全性取決于密鑰的保存情況來(lái)決定!

所以普通情況下,沒(méi)有特殊需求,基本上首先的是AES加密

應(yīng)用場(chǎng)景

這里我簡(jiǎn)單說(shuō)一個(gè)案例

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

如下

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

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

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

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

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

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

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

需要使用相應(yīng)的解密算法和密鑰來(lái)還原數(shù)據(jù)。

PHP實(shí)現(xiàn)AES對(duì)稱加密

我們來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的加密案例,有興趣的朋友可以來(lái)看看,java、php、python等等用什么語(yǔ)言都可以!

我用php中的OpenSSl擴(kuò)展庫(kù)來(lái)實(shí)現(xiàn)AES對(duì)稱加密與解密

不用我們?nèi)チ私獾讓?,只需要輕松幾步就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單加密和解密數(shù)據(jù)的過(guò)程!

代碼如下

<?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;  
  
?>

效果如下

代碼分析

這里簡(jiǎn)單的使用到了phpOpenSSl擴(kuò)展庫(kù)openssl_encryptopenssl_decrypt函數(shù)來(lái)實(shí)現(xiàn)的AES

openssl_encrypt函數(shù)解釋

如下表

參數(shù)列表含義
參數(shù)1:data待加密的明文信息數(shù)據(jù), 也就是需要加密的數(shù)據(jù),你可以把它想象成你想要鎖起來(lái)的秘密信息
參數(shù)2:method加密方式, 也就是你想要用來(lái)加密數(shù)據(jù)的加密算法, 常見(jiàn)的加密算法包括 AES, 具體可以查看官方文檔 例如: 你使用 AES-256-CBC 算法,那么 CBC 表示加密模式,256 表示密鑰的長(zhǎng)度
參數(shù)3:key約定加密和解密的一把鑰匙, 而這把密鑰的長(zhǎng)度必須與所選擇的加密算法相匹配.........例如,如果使用 AES-256-xxx,那么你的密鑰應(yīng)該是 256 位長(zhǎng)! 所以我們最好要給定相應(yīng)字節(jié)長(zhǎng)度的字符串密鑰,雖然有時(shí)候我們沒(méi)有定義指定長(zhǎng)度的字符的密鑰,但仍然能夠成功加密數(shù)據(jù),是因?yàn)镻HP的OpenSSL擴(kuò)展自動(dòng)處理了密鑰的填充和生成! 但是為了確保最佳的安全性,最好顯式地指定一個(gè)符合長(zhǎng)度要求的密鑰! 這樣可以避免任何潛在的填充問(wèn)題,并確保密鑰的長(zhǎng)度與所選加密算法的要求相匹配, 比如說(shuō): 在 AES-256 算法中,密鑰的長(zhǎng)度為 32 字節(jié)(256 位)的字符串就可以了! 這里我采用的是AES,而AES密鑰的長(zhǎng)度通??梢允?28位、192位、256位
參數(shù)4:options它可以控制如何處理返回的數(shù)據(jù), 它有兩種常量設(shè)置方式: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING 例如,你可以設(shè)置 OPENSSL_RAW_DATA 常量選項(xiàng),這樣函數(shù)會(huì)返回原始的二進(jìn)制數(shù)據(jù),一把也都設(shè)置這個(gè)!
參數(shù)5:iv它是一個(gè)初始化向量, 用于增加加密的安全性和隨機(jī)性! 這里所謂的初始化向量其實(shí)就是一個(gè)隨機(jī)字符串,但是這個(gè)隨機(jī)字符串是有一定講究的,它的字符長(zhǎng)度通常需要與加密模式的要求相匹配, 也就是說(shuō)不同的加密模式可能會(huì)有不同的iv要求, 例如: 當(dāng)我們使用AES-256-CBC加密模式時(shí),iv參數(shù)應(yīng)該至少為16字節(jié)長(zhǎng)度的隨機(jī)字符串, 如果使用AES-128-CBC加密模式時(shí), iv參數(shù)必須為16字節(jié)長(zhǎng)度的隨機(jī)字符串,多一個(gè)或少一個(gè)都會(huì)報(bào)錯(cuò)! 所以iv這個(gè)參數(shù),最好是要和加密模式中的長(zhǎng)度一致就行了! 為了更加安全,這個(gè)iv最好不能寫(xiě)死,用一種算法方式生成指定長(zhǎng)度的iv 這樣子在每次加密操作時(shí)都會(huì)改變加密結(jié)果!
....................................

返回值:成功時(shí)返回加密后的字符串

openssl_decrypt函數(shù)解釋

如下表

參數(shù)列表描述
參數(shù)1:data要解密的數(shù)據(jù)字符串,通常是由 openssl_encrypt 函數(shù)加密后的結(jié)果。
參數(shù)2:method填寫(xiě)加密方式,既然要解密那么就要知道是如何加密的,所以這里就必須填寫(xiě)與加密時(shí)使用的算法模式相同! 例如: 加密模式為 AES-256-CBC 那么這里就必須填寫(xiě)AES-256-CBC
參數(shù)3:key解密密鑰。這是用于解密的密鑰,與加密時(shí)使用的密鑰相同! 舉個(gè)生活上的案例,你用什么鑰匙鎖門,那么你就要用相應(yīng)的鑰匙來(lái)開(kāi)門,對(duì)吧! 并且這個(gè)密鑰的長(zhǎng)度也要一致!
參數(shù)4:options數(shù)據(jù)以什么形式進(jìn)行處理并返回 它有兩種常量設(shè)置方式: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING , 加密時(shí)設(shè)置的什么,這里就設(shè)置什么!
參數(shù)5:iv解密時(shí)需要使用加密時(shí)相同的 iv
.........................................

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

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

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

大致流程如下圖:

以上就是php對(duì)稱加密和解密的實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于php對(duì)稱加密解密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論