工具的安裝:
一.源碼安裝
OpenSSL Version:openssl-1.0.0e.tar.gz
------------------------安裝:
1、將下載的壓縮包放在根目錄,
2、在文件夾下解壓縮,
命令:tar -xzf openssl-openssl-1.0.0e.tar.gz
得到openssl-openssl-1.0.0e文件夾
3、進入解壓的目錄:cd openssl-1.0.0e
4、設定Openssl 安裝,( --prefix )參數為欲安裝之目錄,也就是安裝后的檔案會出現在該目錄下:
執行命令:./config --prefix=/usr/local/openssl
5、執行命令./config -t
6.執行make,編譯Openssl
----------------------完成安裝。
二,yum安裝
#yum install openssl* -y
1.生成秘鑰:(生成1024位的私鑰,不指定的話默認2048位)
輸入“genrsa -out rsa_private_key.pem 1024”命令,回車后,在當前 bin 文件目 錄中會新增一個 rsa_private_key.pem 文件,其文件為原始的商戶私鑰(請妥善保 存該文件,PHP 開發語言中需要使用該文件)
[root@wentao12 ~]# openssl genrsa -out rsa_private_key.pem 1024
2.生成公鑰:(根據這個私鑰生成公鑰)
輸入“rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem”命令回車 后,在當前 bin 文件目錄中會新增一個 rsa_public_key.pem 文件,其文件為原始 的商戶公鑰(請妥善保存該文件,PHP 開發語言中需要使用該文件)
[root@wentao12 ~]# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
3.生成PKCS8 編碼的私鑰
輸入命令“pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt”並回車,當前界面中會直接顯示出生成結果
[root@wentao12 ~]# openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
,把復制的內容粘 貼進一個新的記事本中,可隨意命名,只要知道這個是 PKCS8 格式的私鑰即可(請 妥善保存該文件)
經過我測試就用屏幕打印的這個作為私鑰,
公鑰查看:#cat rsa_public_key.pem
注意文件格式前后標記符不能去掉,可以正常加密解密。
例子:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/4/1 * Time: 1:50 */ //注意格式一定要有下面的標識符 $pub_key = "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+p18S45D/xf+EpDpRDwMLp7Im edUzYhPUAy5orgPnOIwjUo7jDb6Zsn6axv5gDA+ooaxZoT+fXz2gNDhlvCWanLIv i0o2X6G5l1rCarb8irOQOyAP4Z3M8Pj9maaG3zwU251udcVTcLpV2q65sMKaJBOI jPpzwPFo+RU040k0kwIDAQAB -----END PUBLIC KEY-----"; $pri_key = "-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC+p18S45D/xf+EpDpRDwMLp7ImedUzYhPUAy5orgPnOIwjUo7j Db6Zsn6axv5gDA+ooaxZoT+fXz2gNDhlvCWanLIvi0o2X6G5l1rCarb8irOQOyAP 4Z3M8Pj9maaG3zwU251udcVTcLpV2q65sMKaJBOIjPpzwPFo+RU040k0kwIDAQAB AoGAcrevA2SeuOhgiWVwGZoY0QiEr5YbbSGUoLuRTzd17ckeuZpRk9mPWFgIygT2 xsA7I9K0K/JUoAbkw+LoFH8TeFtxrq28L3jZE8Xr5MTrxVb4sImWwsJ/+bEW51Zs 6bp03/2SIVwtl1SkH9zyJlEWlEhb41KGIm0dC1ctMKE2HEECQQD12wFNSCqOyOEU LffZKD/IqoHVU2RfGevft1/08OG7cVp+4YMZ+gRTsRYZDEkPTG8SjHxbTBxJ/EH/ qFDlOhrRAkEAxoVD+xJBRqu11uIXafd5reJrfTa0qwupYuTiH7c3EWPa5YRKg6Xk pTnUstvl0FBjwyTJ9iDTcChYFx2c/q1qIwJAWDAao3IDcfw0YFyszsRVPNGMiMzE 8CgIJ9NLJD1Tez0JzQFvWV4JN0wKNSnm+wnbvbeO0+DVNOS7d80UV2UkQQJAMDb7 rMXhPrXDgz4EK8NkNRwxuQaJWKWLbS5j0QohgMK8zlOT+WdYIdzq0MnhhfeQUzvj JTkRwUK7KloR4DTj+wJBAJwRkRVtyNKfH/nb6WkTAVqRjoecLJHIN/JT3UzgzD6X ybxwxyupVw8aK1QZDYwn9LVqru2WjpG99JXxEcSP+vY= -----END RSA PRIVATE KEY-----"; $str = "這個是要加密的字符4567串888"; //這個例子是演示RSA加密 //非對稱加密 分為 公鑰和私鑰 //通常 公鑰加密 私鑰解密,私鑰加密,公鑰解密 /* * 用到的加密函數 openssl_private_decrypt — Decrypts data with private key openssl_private_encrypt — Encrypts data with private key openssl_public_decrypt — Decrypts data with public key openssl_public_encrypt — Encrypts data with public key * */ //echo $private_key; $pi_key = openssl_pkey_get_private($pri_key);//這個函數可用來判斷私鑰是否是可用的,可用返回資源id Resource id $pu_key = openssl_pkey_get_public($pub_key);//這個函數可用來判斷公鑰是否是可用的 //print_r($pi_key);echo "\n"; //print_r($pu_key);echo "\n"; //公鑰加密過程 $enStr = ''; openssl_public_encrypt($str,$enStr,$pu_key); //加密后的字符 有些無法顯示 需要 base64_encode ( string $data ) ,解密的時候不需要要 base64_decode ( string $data ) echo base64_encode ($enStr); echo "<br/>"; //私鑰解密過程 $deStr = ''; //$enStr = base64_decode ( $enStr); openssl_private_decrypt($enStr,$deStr,$pi_key); echo $deStr; echo "<br/>"; //下面是簽名驗證例子,驗證簽名 一定是用公鑰去驗證 對方私鑰加密的結果 $binary_signature = ""; // At least with PHP 5.2.2 / OpenSSL 0.9.8b (Fedora 7) // there seems to be no need to call openssl_get_privatekey or similar. // Just pass the key as defined above openssl_sign($str, $binary_signature, $pi_key, OPENSSL_ALGO_SHA1); // Check signature $ok = openssl_verify($str, $binary_signature, $pu_key, OPENSSL_ALGO_SHA1); echo "check #1: "; if ($ok == 1) { echo "signature ok (as it should be)\n"; } elseif ($ok == 0) { echo "bad (there's something wrong)\n"; } else { echo "ugly, error checking signature\n"; } //var_dump(openssl_get_cipher_methods() );
生成秘鑰:http://php.net/manual/en/function.openssl-private-encrypt.php
$res = openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $privkey); // Get public key $pubkey = openssl_pkey_get_details($res); $pubkey = $pubkey["key"]; var_dump($privkey); var_dump($pubkey);
參考:
http://stephen830.iteye.com/blog/2087281
https://www.cnblogs.com/jaryoung/p/7644481.html