目錄
工作過程
優缺點
首頁 後端開發 PHP問題 php如何實現不對稱加密

php如何實現不對稱加密

Aug 06, 2020 am 11:16 AM
openssl

在php中可以使用openssl來實現不對稱加密,使用非對稱加密主要是藉助openssl的公鑰和私鑰,用公鑰加密私鑰解密,或者私鑰加密公鑰解密,簡單來說非對稱加密演算法需要兩個金鑰來進行加密和解密。

php如何實現不對稱加密

推薦:《PHP影片教學

php使用openssl來實現不對稱加密

先來解釋什麼是不對稱加密:

對稱加密演算法在加密和解密時使用的是同一個秘鑰;而非對稱加密演算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開金鑰(public key,簡稱公鑰)和私有金鑰(private key,簡稱私鑰)。




工作過程

如上圖所示,甲乙之間使用非對稱加密的方式完成了重要資訊的安全傳輸。


1、乙方產生一對金鑰(公鑰和私鑰)並將公鑰向其它方公開。 (其他方一個是信任方)

2、得到該公鑰的甲方使用該金鑰對機密資訊進行加密後再傳送給乙方。

3、乙方再用自己保存的另一把專用金鑰(私鑰)對加密後的資訊進行解密。乙方只能用其專用金鑰(私鑰)解密由對應的公鑰加密後的資訊。

在傳輸過程中,即使攻擊者截獲了傳輸的密文,並且得到了乙的公鑰,也無法破解密文,因為只有乙的私鑰才能解密密文。

同樣,如果乙要回覆加密訊息給甲,那麼需要甲先公佈甲的公鑰給乙用於加密,甲自己保存甲的私鑰用於解密。




優缺點

非對稱加密與對稱加密相比,其安全性更好:對稱加密的通訊雙方使用相同的秘鑰,如果一方的秘鑰被洩露,那麼整個通訊就會被破解。而非對稱加密使用一對秘鑰,一個用來加密,一個用來解密,而且公鑰是公開的,秘鑰是自己保存的,不需要像對稱加密那樣在通信之前要先同步秘鑰。

非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量資料進行加密。

在非對稱加密中使用的主要演算法有:RSA、Elgamal、背包演算法、Rabin、D-H、ECC(橢圓曲線加密演算法)等。

不同演算法的實作機制不同,可參考對應演算法的詳細資料。

使用非對稱加密主要是藉助openssl的公鑰和私鑰,用公鑰加密私鑰解密,或是私鑰加密公鑰解密。

1.安裝openssl和php的openssl擴充功能

2.產生私鑰:openssl genrsa 用於產生rsa私鑰文件,產生是可以指定私鑰長度和密碼保護

openssl genrsa -out rsa_private_key.pem 1024

3.產生公鑰:rsa指令用於處理RSA金鑰、格式轉換與列印訊息

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

4.這裡我們使用私鑰加密,公鑰解密

<?php
/**
 * 使用私钥加密,公钥解密
 * 密钥文件的路径
 */
$privateKeyFilePath = &#39;rsa_private_key.pem&#39;;
/**
 * 公钥文件的路径
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;
extension_loaded(&#39;openssl&#39;) or die(&#39;php需要openssl扩展支持&#39;);
(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die(&#39;密钥或者公钥的文件路径不正确&#39;);
/**
 * 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private(获取私钥)函数返回false
 */
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
/**
 * 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public(获取公钥)函数返回false
 */
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($privateKey && $publicKey) or die(&#39;密钥或者公钥不可用&#39;);
/**
 * 原数据
 */
$originalData = &#39;啦啦啦&#39;;
/**
 * 加密以后的数据,
 */
$encryptData = &#39;&#39;;
//echo &#39;原数据为:&#39;, $originalData, PHP_EOL;
//openssl_private_encrypt — 使用私钥加密数据
//openssl_private_encrypt() 使用私钥 key 加密数据 data 并且将结果保存至变量 crypted中。
//加密后的数据可以通过openssl_public_decrypt()函数来解密。
if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
    /**
     * 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码
     * PHP_EOL就是其中的一个,代表php的换行符,这个变量会根据平台而变,在windows下会是/r/n,在linux下是/n,在mac下是/r
     */
    echo &#39;加密成功,加密后数据(base64_encode后)为:&#39;, base64_encode($encryptData), PHP_EOL;
} else {
    die(&#39;加密失败&#39;);
}

5,現在我們加密完成了,當時該如何解密呢?因為是私鑰加密,公鑰解密,

所以只要知道我們的公鑰是什麼,就可以拿著產生的密文去進行解密:(我將解密的有關知識註釋在了程式碼上,方便大家理解)

/**
 * 解密以后的数据
 * openssl_public_decrypt使用公钥解密数据
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;//生成的公钥文件
//openssl_pkey_get_public使用公钥解密
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
//print_r($publicKey);exit;
($publicKey) or die(&#39;密钥或者公钥不可用&#39;);
//下面是我即将进行解密的密文
$encryptData=&#39;ldFrMgl9qLWbPEQDt8DMCfzq4WAR2eEfZFmjyE8XUh/+SmkzoDhhOitIr++5muxj8klCqH0KCQqUV6RLRW34z5R5SbYCy82hdIMLjmPqx32LKg2e8iRuR7HreC6rW0CGxaeUlrSDz9M72c/GKjnQLlg66Tsjp0XtwT6PTPXH9ws=&#39;;
//因为我们加密后数据展示的是base64_encode后(上一行),
//所以我们应该还原为原来的密文,如果直接将原本的密文copy过来解密的话也许会导致部分的密文丢失,进一步解密失败;
$encryptData=base64_decode($encryptData);
$decryptData =&#39;&#39;;
if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
    echo &#39;解密成功,解密后数据为:&#39;, $decryptData, PHP_EOL;
} else {
    die(&#39;解密失败&#39;);
}

如果有什麼不對的,請各位指出來,希望對大家有幫助。


以上是php如何實現不對稱加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1602
29
PHP教程
1504
276