PHP openssl加密擴展使用總結

一、檢查服務器是否已安裝了openssl組件,沒有則先安裝好php

  openssl version [-a]算法

 

二、對稱加密安全

  查詢openssl支持的對稱加密算法服務器

  openssl_get_cipher_methods();網絡

加密:openssl_encrypt($data, $method, $passwd, $options, $iv);函數

參數說明:編碼

$data: 加密明文加密

$method: 加密方法url

$passwd: 加密密鑰spa

$options: 數據格式選項(可選)

$iv: 加密初始化向量(可選)

解密:openssl_decrypt($data, $method, $passwd, $options, $iv);

參數說明:

$data: 解密密文

$method: 解密加密方法

$passwd: 解密密鑰

$options: 數據格式選項(可選)

$iv: 解密初始化向量(可選)

 

三、生成公鑰、私鑰對

(1)生成原始RSA私鑰文件rsa_private_key.pem

     openssl genrsa -out rsa_private_key.pem 1024

(2)將原始的RSA私鑰轉換爲pkcs8模式

  openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

(3)生成RSA公鑰 rsa_public_key.pem

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

 

四、使用私鑰加密、公鑰解密

   使用的私鑰爲上述生成的rsa_private_key.pem文件內容

   使用的公鑰爲上述生成的rsa_public_key.pem文件內容

 1 // 生成密鑰資源id
 2 $pi_key = openssl_pkey_get_private($private_key);
 3 $pu_key = openssl_pkey_get_public($public_key);
 4 
 5 // 私鑰加密
 6 $encrypted = ‘’;
 7 openssl_private_encrypt($data, $encrypted, $pi_key);
 8 
 9 // 轉碼,這裏的$encrypted就是私鑰加密的字符串
10 $encrypted = base64_encode($encrypted);
11 
12 // 公鑰解密,$decrypted即爲公鑰解密後私鑰加密前的明文
13 $decrypted = ‘’;
14 $encrypted = base64_decode($encrypted);
15 openssl_public_decrypt($encrypted, $decrypted, $pu_key);

 

五、使用公鑰加密、私鑰解密

   使用的私鑰爲上述生成的rsa_private_key.pem文件內容

   使用的公鑰爲上述生成的rsa_public_key.pem文件內容

 1 // 生成密鑰資源id
 2 $pi_key = openssl_pkey_get_private($private_key);
 3 $pu_key = openssl_pkey_get_public($public_key);
 4 
 5 // 公鑰加密
 6 $encrypted = ‘’;
 7 openssl_public_encrypt($data, $encrypted, $pu_key);
 8 
 9 // 轉碼,這裏的$encrypted就是公鑰加密的字符串
10 $encrypted = base64_encode($encrypted);
11 
12 // 私鑰解密,$decrypted即爲私鑰解密後公鑰加密前的明文
13 $decrypted = ‘’;
14 $encrypted = base64_decode($encrypted);
15 openssl_private_decrypt($encrypted, $decrypted, $pu_key);

完整代碼演示:

 1 <?php
 2 /**
 3  * Created by PhpStorm.
 4  * User: ahao
 5  * Date: 2016/11/20
 6  * Time: 10:12
 7  */
 8 // 列出openssl加密擴展支持的對稱加密方法
 9 /*$methods = openssl_get_cipher_methods();
10 echo "<pre>";
11 var_dump($methods);
12 
13 $iv = substr(md5('test'),0,8);
14 $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA,$iv);
15 $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA);
16 echo $encrypt_data;
17 echo "<br/>";
18 
19 $decrypt_data = openssl_decrypt($encrypt_data,'des-cbc','passwd',OPENSSL_RAW_DATA,$iv);
20 echo $decrypt_data;*/
21 
22 // 私鑰
23 $private_key = '-----BEGIN RSA PRIVATE KEY-----
24 MIICXAIBAAKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6aBPVo8fvw0pd90jLJYvfJcFJ
25 dYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ680aS6JTFe3ScBY4Mi7bLKzBN
26 YtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzzlaU5djtUSoxTLkxcmwIDAQAB
27 AoGAZT944gZo+bynvH17JhEk/nFxA19VLjj6kSH6AFPmkQcMN2pjeIU/Hhq3k0Cg
28 QTzYEy4wAMwzcFME7OC5c14c6GsnOQVEbzT3jA5lNuMnrvb+ehyE0w/O7ah8sSLQ
29 3B42GFKkaKiuY2ufsVC4pv6LMn5Sh26ApW332yO0dXZXagECQQDvAWV+n41R9pUp
30 iB0+ycBvkuE6yjlohc2MqAxdD+EYNgO4jb1F21pZcqasd/SbpiQwVUKk/uxlOvl9
31 3dBlcOWbAkEA4eiMv8UiGwBxjBGrz+I/tBq56gcnjvlOkJFyAyxbKaA1C9C51eVv
32 39OftI9DqCzcuAYZsCmspb6XEPBIB01VAQJAZVyAQM1Fz+b1p6F0VbaWiDsQjjBJ
33 XIyyed6jL6yWWABAX7qs9L1sedbn3OkashAp9N2T4AnFE8GJIdo6kWrp1QJAGOiF
34 LFfWDNgdrO393av6jicsPIuRZwhCC1qeEY+AdbR+ZNEczGLB1RIGV+g7830O0ROL
35 HYtax+Od0HZN2tBCAQJBANIg+HO5+Qy5hgRO3+uRHERgUQxqHzheLdo5GnoQ/sfT
36 sex4mxgze6oq+HldvNWzVjBu9g9417T5WMgyWQ8Unhw=
37 -----END RSA PRIVATE KEY-----';
38 
39 // 公鑰
40 $public_key = '-----BEGIN PUBLIC KEY-----
41 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6
42 aBPVo8fvw0pd90jLJYvfJcFJdYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ6
43 80aS6JTFe3ScBY4Mi7bLKzBNYtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzz
44 laU5djtUSoxTLkxcmwIDAQAB
45 -----END PUBLIC KEY-----';
46 
47 //這個函數可用來判斷私鑰是不是可用的,可用返回資源id Resource id
48 $pi_key = openssl_pkey_get_private($private_key);
49 
50 //這個函數可用來判斷公鑰是不是可用的
51 $pu_key = openssl_pkey_get_public($public_key);//這個函數可用來判斷公鑰是不是可用的
52 
53 print_r($pi_key);  echo "<br/>";
54 print_r($pu_key);  echo "<br/>";
55 
56 // 原始數據
57 $data = 'codeman';
58 $encrypted = '';
59 $decrypted = '';
60 
61 echo "source data:",$data,"<br/>";
62 echo "private key encrypt:<br/>";
63 echo "私鑰加密,公鑰解密:<br/>";
64 
65 // 私鑰加密
66 openssl_private_encrypt($data, $encrypted, $pi_key);
67 $encrypted = base64_encode($encrypted);//加密後的內容一般含有特殊字符,須要編碼轉換下,在網絡間經過url傳輸時要注意base64編碼是不是url安全的
68 echo $encrypted,"<br/>";
69 
70 // 公鑰解密
71 echo "public key decrypt:<br/>";
72 openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私鑰加密的內容經過公鑰可用解密出來
73 echo $decrypted,"<br/><br/>";
74 
75 echo "公鑰加密,私鑰解密:<br/>";
76 //公鑰加密
77 openssl_public_encrypt($data, $encrypted, $pu_key);
78 $encrypted = base64_encode($encrypted);
79 echo $encrypted,"<br/>";
80 
81 // 私鑰解密
82 echo "private key decrypt:<br/>";
83 openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私鑰解密
84 echo $decrypted,"<br/>";

 

六、PHP openssl和mcrypt擴展的區別

openssl是一種公私鑰的網絡通訊安全協議,也算一種加密模式,php的openssl擴展是爲了用這個協議加密和解密傳輸數據用的。與mcrypt相比,openssl支持更多的加密方法,使用更加簡單,支持非對稱加密解密,是安裝簽名https的核心組件。

相關文章
相關標籤/搜索