linux下OpenSSL的RSA密鑰生成


 

工具的安裝:

一.源碼安裝

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM