使用公鑰和私鑰的加密和解密:
-
非對稱加密的關鍵在於 有 公鑰 / 私鑰
用法:
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加密要快幾百倍