1.安裝openss
直接下載window下的安裝包
http://houjixin.blog.163.com/blog/static/3562841020144143494875/
以我發博文現在的例子說明,大家都是64位操作系統吧。
選擇最新版本的win64版本,體積更大的33MB的安裝程序下載安裝吧

選擇安裝目錄傻瓜安裝下一步下一步一直到完成
2.生成RSA密鑰文件 我安裝到了C:\OpenSSL-Win64下 到C:\OpenSSL-Win64\bin目錄下點擊openssl.exe

啟動后輸入genrsa -out rsa_private_key.pem 1024 回車
此時,我們可以在bin文件夾中看到一個文件名為rsa_private_key.pem的文件,用記事本方式打開它,可以看到-----BEGIN RSA PRIVATE KEY-----開頭,-----END RSA PRIVATE KEY-----結尾的沒有換行的字符串,這個就是原始的私鑰。
3.把RSA私鑰轉換成PKCS8格式
使用cmd cd到目錄去執行命令 ,調整cmd命令框的寬度,為什么不直接點openssl.exe 我下面說
輸入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,並回車
得到生成功的結果,這個結果就是PKCS8格式的私鑰


(如果上面不用cmd中執行openssl.exe,你會發現無法復制完整轉換后的文件)
右鍵點擊openssl窗口上邊邊緣,選擇編輯→標記,選中要復制的文字(如上圖),
此時繼續右鍵點擊openssl窗口上邊邊緣,選擇編輯→復制,
把復制的內容粘土進一個新的記事本中,重命名為rsa_private.key文件,只要知道這個是PKCS8格式的私鑰即可
4.生成公鑰
輸入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,並回車,
得到生成成功的結果,如下圖:
5.node.js實例,使用了第三方庫node-rsa
var NodeRSA = require('node-rsa');
var fs= require('fs');
var onerror =(e) =>{
console.log("解密失敗");
}
var onfinally =() =>{
console.log("最終做什么");
}
fs.readFile('rsa_private.key','utf-8',function(err,data){
if(err){
console.log(data);
}else{
console.log(data);
privatekey= new NodeRSA(data);
var text = 'Hello RSA!';
var encrypted = privatekey.encrypt(text, 'base64');
console.log('加密encrypted: ', encrypted);
var decrypted = privatekey.decrypt(encrypted, 'utf8');
console.log('解密decrypted: ', decrypted);
var encrypted1 ='mIJocRfF+MWS3J6+fkPSM9ZAMSZhXxHC+/w0UuT+t6ZmLnoamQ6WKwOBPQ+o+mazk61MFdyImWVW+51dYLc7kE4Eey4y+qB23/ahC9Mi/bJqivWgUHeLPjfLMqXcNVrFSbOB33+7N/fsWAWLJmHuFHaNwP1DqPLH9nY501qoMvY=';
var decrypted = privatekey.decrypt(encrypted1, 'utf8');
console.log('使用正確的加密串解密decrypted: ', decrypted);
try{
var encrypted2 ='c7kE4Eey4y+qB23/ahC9Mi/bJqivWgUHeLPjfLMqXcNVrFSbOB33+7N/fsWAWLJmHuFHaNwP1DqPLH9nY501qoMvY=';
var decrypted = privatekey.decrypt(encrypted2, 'utf8');
}catch(e){
onerror(e);
}finally{
onfinally();
}
}
})
6.私鑰文件如何放置到全局變量中,閉包寫的,有改進意見可提出,歡迎吐槽,當然也可以放到redis或者memcache中
RSAkey.js
var fs= require('fs');
var path = require('path');
module.exports = (function(){
var private = '';//在函數內聲明一個變量,作用域是函數內
return function(){ //返回的一個function能訪問到_value,所以_value並不是global級別的變量,但是可以通過這個接口訪問到
if(private=='') {
var paths = path.resolve(__dirname,'../rsa_private.key');
fs.readFile(paths, 'utf-8', function (err, data) {
private = data;
if(private.length!=0){
console.log("success read RSA file");
}
return private;
});
}else{
return private;
}
};
})();//一個立即執行的匿名函數
初始化的時候引入
var RSAkey = require('./util/RSAkey');
var key = RSAkey();
調用時候引入
var key = RSAkey();
