写在最前:此文的目的只是介绍,因此不作详细累述。
比特币
中使用的非对称加密,因此在npm中对比找到一个比较方便也直观的库:node-rsa。注:不能 公钥加密公钥解密 或 私钥加密私钥解密
node
1. DER 和 PEM 编码算法
PEM 实质上是 base64 编码的二进制内容,再进行增长或裁剪特殊字符-、n、r、begin信息、end信息等,如:npm
-----BEGIN CERTIFICATE----- 内容 -----END CERTIFICATE-----
注:本文中的私钥公钥都是用 pem 格式
测试
2. PKCS(The Public-Key Cryptography Standards)ui
注:因为PKCS内容规范设计二进制,不方便使用,因此通常转成base64 后,用 pem 格式规范显示
编码
//公钥 -----BEGIN RSA PUBLIC KEY----- MEgCQQCpb53RwojJX+lxHiEMfNmixx+eIV+u+d9e61Ecx8MVBW0tzAoxTpdTKrgN 9hdBqaP6rtQMxOp/4++C5+3zh6D1AgMBAAE= -----END RSA PUBLIC KEY----- //私钥 -----BEGIN RSA PRIVATE KEY----- MIIBPAIBAAJBAKlvndHCiMlf6XEeIQx82aLHH54hX675317rURzHwxUFbS3MCjFO l1MquA32F0Gpo/qu1AzE6n/j74Ln7fOHoPUCAwEAAQJAJO8tyeHMC4may4uzzJMS pgcd/0xrHSte48QMBGgPQG95imYXELKQUV2rjzsua9xJP5huQjhe+qrmBpEqrtf7 wQIhANccK0zuFaH4CoIuKsp92YB6OGwndy6UJaiX2RoUw0V5AiEAyaTTkar73r4d OB2s4Ofj+UkGX/aspp0dM+7V5HathF0CIQCezlYNSmvAEr23U9wVeAmd9x02g4BS a97Nc6U8wv1SiQIhAKap7ZTA1l1MlaoEHRfnkq5AhVxb7mfoBHMgPPoQfWqhAiEA npkku9LfP2mlCCB85/zxsUehZOwoMVLlF2dSLWsrURs= -----END RSA PRIVATE KEY-----
//公钥 -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKzY3F21g7UWaTcIk/ltUy4LuuHK5Hhl 9ZpdxDr4+WA7pNwhCzhgBKbWUa+XotUYet841I2mYPJ6+6X32LwotF0CAwEAAQ== -----END PUBLIC KEY----- //私钥 -----BEGIN PRIVATE KEY----- MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEArNjcXbWDtRZpNwiT +W1TLgu64crkeGX1ml3EOvj5YDuk3CELOGAEptZRr5ei1Rh63zjUjaZg8nr7pffY vCi0XQIDAQABAkBUJ3GDHnD1peesJ70D37pz3LosXMBH7jxZ3/U+USH5O8M7ixzt lpYa+ITcuL0MKxvVyVYw5Pvaui1+Nq9LV17xAiEA5VMCIgtn3WFEOpP+sVhHlqPc VbTfE3g0RlDfUt/sQ5sCIQDA9AiJ65G3pHJJxYNc9RB/lVav3anFkbgnGKolPw8T ZwIhAIs7QLpGzoLcgT5HiIVIIf7V8fqfXClH/AUNKOn6RkotAiEAo6HQY/ZMeyqQ aZOA1aJWPXxOKZKX2R68xxsZn8Ccbl0CIQDck74y8SzLRSBB6JgVZ6NoWkWI5tyj V8RFCZU9VUinQA== -----END PRIVATE KEY-----
/** from: @jameszou707 * 1.使用 node-rsa 生成 公钥和私钥,并进行服务端测试 * @param pkcsType :pkcs版本(pkcs1/pkcs8),默认为 pkcs8 */ function generateKeyPair() { pkcsType = pkcsType ? pkcsType : 'pkcs8';//不为空则 设置为传入参数,为空则 设置为 pkcs8 console.log('pkcsType=' + pkcsType); //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 key2 = new NodeRSA({ b: pkcsSize }); //2.导入 公钥,并指定使用 pkcs标准,pem格式 key2.importKey(publicPem, pkcsType+'-public-pem'); //3.使用 公钥 解密数据 var decrypted = key2.decryptPublic(encryData, 'utf8'); console.log('\n使用公钥解密后的数据:\n',decrypted); }