使用公鑰和私鑰的加密和解密:
-
非對稱加密的關鍵在於 有 公鑰 / 私鑰
用法:
a.生成一對公鑰私鑰
b.公鑰加密 -> 對應私鑰解密
c.私鑰加密 -> 對應公鑰解密 -
非對稱加密的常見應用方式
a.公鑰加密,發給私鑰擁有者,私鑰解密獲得明文。其它人用公鑰解不開
b.私鑰加密(簽名) -
公鑰的傳輸(混合加密)
a.使用對稱加密算法發布公鑰
b.使用對稱加密算法解密公鑰,再使用公鑰加密明文,發給私鑰擁有者
注:不能 公鑰加密公鑰解密 或 私鑰加密私鑰解密
var NodeRSA = require("node-rsa");
/**
* 1.使用 node-rsa 生成 公鑰和私鑰,並進行服務端測試
* @param pkcsType :pkcs版本(pkcs1/pkcs8),默認為 pkcs8
*/
function generateKeyPair(pkcsType,pkcsSize) {
pkcsType = pkcsType ? pkcsType : 'pkcs8';//不為空則 設置為傳入參數,為空則 設置為 pkcs8
console.log('pkcsType=' + pkcsType);
pkcsSize = pkcsSize || 512;
//1.創建RSA對象,並指定 秘鑰長度
var key = new NodeRSA({ b: pkcsSize });
key.setOptions({ encryptionScheme: 'pkcs1' });//指定加密格式
//2.生成 公鑰私鑰,使用 pkcs8標准,pem格式
var publicPem = key.exportKey(pkcsType+'-public-pem');//制定輸出格式
var privatePem = key.exportKey(pkcsType + '-private-pem');
//console.log(key.$options);
console.log(pkcsType+'公鑰:\n',publicPem);
console.log(pkcsType+'私鑰:\n', privatePem);
//---------------------測試1:服務端私鑰加密公鑰解密------------------------
//3.使用 私鑰 加密 數據,並指定 字符編碼 和 字符集
var encryData = key.encryptPrivate('服務端測試 -> jameszou love code~~~', 'base64','utf8');
console.log('\n私鑰加密后的數據:\n', encryData); //加密后數據為 base64 編碼
//4.使用 公鑰 解密 數據,並指定字符集
var decryptData = key.decryptPublic(encryData,'utf8');
console.log('\n公鑰解密后的數據:\n', decryptData);
//---------------------測試2:服務端加載公鑰后解密------------------------
//1.創建RSA對象,並指定 秘鑰長度
var key3 = new NodeRSA({ b: pkcsSize });
//2.導入 公鑰,並指定使用 pkcs標准,pem格式
key3.importKey(publicPem, pkcsType+'-public-pem');
//3.使用 公鑰 解密數據
var decrypted = key3.decryptPublic(encryData, 'utf8');
console.log('\n使用公鑰解密后的數據:\n',decrypted);
}
generateKeyPair();
使用 aes加密,是屬於,指定key加密,還是用key加密,沒有公鑰和私鑰的區別。
但是:aes加密的速度比rsa加密要快幾百倍
