原地址: https://www.cnblogs.com/huyihao/p/6082765.html
1、檢查服務器是否已安裝了openssl組件,沒有則先安裝好
openssl version [-a]
2、對稱加密
查詢openssl支持的對稱加密算法
openssl_get_cipher_methods();
加密:openssl_encrypt($data, $method, $passwd, $options, $iv);
參數說明:
$data: 加密明文
$method: 加密方法
$passwd: 加密密鑰
$options: 數據格式選項(可選)
$iv: 加密初始化向量(可選)
解密:openssl_decrypt($data, $method, $passwd, $options, $iv);
參數說明:
$data: 解密密文
$method: 解密加密方法
$passwd: 解密密鑰
$options: 數據格式選項(可選)
$iv: 解密初始化向量(可選)
3、生成公鑰、私鑰對
(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
4、使用私鑰加密、公鑰解密
使用的私鑰爲上述生成的rsa_private_key.pem文件內容
使用的公鑰爲上述生成的rsa_public_key.pem文件內容
// 生成密鑰資源id $pi_key = openssl_pkey_get_private($private_key); $pu_key = openssl_pkey_get_public($public_key); // 私鑰加密 $encrypted = ‘’; openssl_private_encrypt($data, $encrypted, $pi_key); // 轉碼,這裏的$encrypted就是私鑰加密的字符串 $encrypted = base64_encode($encrypted); // 公鑰解密,$decrypted即爲公鑰解密後私鑰加密前的明文 $decrypted = ‘’; $encrypted = base64_decode($encrypted); openssl_public_decrypt($encrypted, $decrypted, $pu_key);
5、使用公鑰加密、私鑰解密
使用的私鑰爲上述生成的rsa_private_key.pem文件內容
使用的公鑰爲上述生成的rsa_public_key.pem文件內容
// 生成密鑰資源id $pi_key = openssl_pkey_get_private($private_key); $pu_key = openssl_pkey_get_public($public_key); // 公鑰加密 $encrypted = ‘’; openssl_public_encrypt($data, $encrypted, $pu_key); // 轉碼,這裏的$encrypted就是公鑰加密的字符串 $encrypted = base64_encode($encrypted); // 私鑰解密,$decrypted即爲私鑰解密後公鑰加密前的明文 $decrypted = ‘’; $encrypted = base64_decode($encrypted); openssl_private_decrypt($encrypted, $decrypted, $pu_key);
完整代碼演示:
<?php /** * Created by PhpStorm. * User: ahao * Date: 2016/11/20 * Time: 10:12 */ // 列出openssl加密擴展支持的對稱加密方法 /*$methods = openssl_get_cipher_methods(); echo "<pre>"; var_dump($methods); $iv = substr(md5('test'),0,8); $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA,$iv); $encrypt_data = openssl_encrypt('codeman is a good man','des-cbc','passwd',OPENSSL_RAW_DATA); echo $encrypt_data; echo "<br/>"; $decrypt_data = openssl_decrypt($encrypt_data,'des-cbc','passwd',OPENSSL_RAW_DATA,$iv); echo $decrypt_data;*/ // 私鑰 $private_key = '-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6aBPVo8fvw0pd90jLJYvfJcFJ dYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ680aS6JTFe3ScBY4Mi7bLKzBN YtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzzlaU5djtUSoxTLkxcmwIDAQAB AoGAZT944gZo+bynvH17JhEk/nFxA19VLjj6kSH6AFPmkQcMN2pjeIU/Hhq3k0Cg QTzYEy4wAMwzcFME7OC5c14c6GsnOQVEbzT3jA5lNuMnrvb+ehyE0w/O7ah8sSLQ 3B42GFKkaKiuY2ufsVC4pv6LMn5Sh26ApW332yO0dXZXagECQQDvAWV+n41R9pUp iB0+ycBvkuE6yjlohc2MqAxdD+EYNgO4jb1F21pZcqasd/SbpiQwVUKk/uxlOvl9 3dBlcOWbAkEA4eiMv8UiGwBxjBGrz+I/tBq56gcnjvlOkJFyAyxbKaA1C9C51eVv 39OftI9DqCzcuAYZsCmspb6XEPBIB01VAQJAZVyAQM1Fz+b1p6F0VbaWiDsQjjBJ XIyyed6jL6yWWABAX7qs9L1sedbn3OkashAp9N2T4AnFE8GJIdo6kWrp1QJAGOiF LFfWDNgdrO393av6jicsPIuRZwhCC1qeEY+AdbR+ZNEczGLB1RIGV+g7830O0ROL HYtax+Od0HZN2tBCAQJBANIg+HO5+Qy5hgRO3+uRHERgUQxqHzheLdo5GnoQ/sfT sex4mxgze6oq+HldvNWzVjBu9g9417T5WMgyWQ8Unhw= -----END RSA PRIVATE KEY-----'; // 公鑰 $public_key = '-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDS6VbgEpOwVc8jXYx/uL6ItMS6 aBPVo8fvw0pd90jLJYvfJcFJdYVFh6JPRdpGhlIrED45VdsktcJvJj0cLNI5ZIZ6 80aS6JTFe3ScBY4Mi7bLKzBNYtMBtnkAFbMmWlCXV4qzZYg8+xNktY5ClZZCvZzz laU5djtUSoxTLkxcmwIDAQAB -----END PUBLIC KEY-----'; //這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id $pi_key = openssl_pkey_get_private($private_key); //這個函數可用來判斷公鑰是否是可用的 $pu_key = openssl_pkey_get_public($public_key);//這個函數可用來判斷公鑰是否是可用的 print_r($pi_key); echo "<br/>"; print_r($pu_key); echo "<br/>"; // 原始數據 $data = 'codeman'; $encrypted = ''; $decrypted = ''; echo "source data:",$data,"<br/>"; echo "private key encrypt:<br/>"; echo "私鑰加密,公鑰解密:<br/>"; // 私鑰加密 openssl_private_encrypt($data, $encrypted, $pi_key); $encrypted = base64_encode($encrypted);//加密後的內容通常含有特殊字符,需要編碼轉換下,在網絡間通過url傳輸時要注意base64編碼是否是url安全的 echo $encrypted,"<br/>"; // 公鑰解密 echo "public key decrypt:<br/>"; openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私鑰加密的內容通過公鑰可用解密出來 echo $decrypted,"<br/><br/>"; echo "公鑰加密,私鑰解密:<br/>"; //公鑰加密 openssl_public_encrypt($data, $encrypted, $pu_key); $encrypted = base64_encode($encrypted); echo $encrypted,"<br/>"; // 私鑰解密 echo "private key decrypt:<br/>"; openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私鑰解密 echo $decrypted,"<br/>";
6、PHP openssl和mcrypt擴展的區別
openssl是一種公私鑰的網絡通信安全協議,也算一種加密模式,php的openssl擴展是爲了用這個協議加密和解密傳輸數據用的。與mcrypt相比,openssl支持更多的加密方法,使用更加簡單,支持非對稱加密解密,是安裝簽名https的核心組件。