使用非對(duì)稱(chēng)加密主要是借助openssl的公鑰和私鑰,用公鑰加密私鑰解密,或者私鑰加密公鑰解密。
1.安裝openssl和PHP的openssl擴(kuò)展
2.生成私鑰:openssl genrsa用于生成rsa私鑰文件,生成是可以指定私鑰長(zhǎng)度和密碼保護(hù)
1.?openssl?genrsa?-out?rsa_private_key.pem?1024
3.生成公鑰:rsa命令用于處理RSA密鑰、格式轉(zhuǎn)換和打印信息
1.?openssl?rsa?-in?rsa_private_key.pem?-pubout?-out?rsa_public_key.pem
4.這里我們使用私鑰加密,公鑰解密
[python]view plaincopy
1.?PHP
2.?/**
3.?*密鑰文件的路徑
4.?*/
5.?$privateKeyFilePath?=?'rsa_private_key.pem';
6.?/**
7.?*公鑰文件的路徑
8.?*/
9.?$publicKeyFilePath?=?'rsa_public_key.pem';
10.
11.?extension_loaded('openssl')?or?die('php需要openssl擴(kuò)展支持');
12.
13.?(file_exists($privateKeyFilePath)?&&?file_exists($publicKeyFilePath))?or?die('密鑰或者公鑰的文件路徑不正確');
14.?/**
15.?*生成Resource類(lèi)型的密鑰,如果密鑰文件內(nèi)容被破壞,openssl_pkey_get_private函數(shù)返回false
16.?*/
17.?$privateKey?=?openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
18.?/**
19.?*生成Resource類(lèi)型的公鑰,如果公鑰文件內(nèi)容被破壞,openssl_pkey_get_public函數(shù)返回false
20.?*/
21.?$publicKey?=?openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
22.
23.?($privateKey?&&?$publicKey)?or?die('密鑰或者公鑰不可用');
24.?/**
25.?*原數(shù)據(jù)
26.?*/
27.?$originalData?=?'加密前hahahaha';
28.?/**
29.?*加密以后的數(shù)據(jù),用于在網(wǎng)路上傳輸
30.?*/
31.?$encryptData?=?'';
32.
33.?echo?'原數(shù)據(jù)為:',?$originalData,?PHP_EOL;
34.
35.?///////////////////////////////用私鑰加密////////////////////////
36.?if?(openssl_private_encrypt($originalData,?$encryptData,?$privateKey))?{
37.
38.?????/**
39.??????*加密后可以base64_encode后方便在網(wǎng)址中傳輸或者打印否則打印為亂碼
40.??????*/
41.?????echo?'加密成功,加密后數(shù)據(jù)(base64_encode后)為:',?base64_encode($encryptData),?PHP_EOL;
42.
43.?}?else?{
44.?????die('加密失敗');
45.?}
46.
47.
48.?///////////////////////////////用公鑰解密////////////////////////
49.
50.?/**
51.?*解密以后的數(shù)據(jù)
52.?*/
53.?$decryptData?='';
54.
55.?if?(openssl_public_decrypt($encryptData,?$decryptData,?$publicKey))?{
56.
57.?????echo?'解密成功,解密后數(shù)據(jù)為:',?$decryptData,?PHP_EOL;
58.
59.?}?else?{
60.?????die('解密成功');
61.?}