博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node-rsa非对称加密
阅读量:5945 次
发布时间:2019-06-19

本文共 3676 字,大约阅读时间需要 12 分钟。

写在最前:此文的目的只是介绍,所以不做详细累述。

一.使用 node-rsa 进行非对称加解密

  • 因为 比特币 中使用的非对称加密,所以在npm中对比找到一个比较方便也直观的库:node-rsa
  • 非对称加密的关键在于 有 公钥 / 私钥
    用法:
    a.生成一对公钥私钥
    b.公钥加密 -> 对应私钥解密
    c.私钥加密 -> 对应公钥解密
  • 非对称加密的常见应用方式
    a.公钥加密,发给私钥拥有者,私钥解密获得明文。其它人用公钥解不开
    b.私钥加密(签名)
  • 公钥的传输(混合加密)
    a.使用对称加密算法发布公钥
    b.使用对称加密算法解密公钥,再使用公钥加密明文,发给私钥拥有者

    注:不能 公钥加密公钥解密 或 私钥加密私钥解密

二.几个重要概念

秘钥内容格式与传输格式

1. DER 和 PEM 编码

  • DER: 基于二进制的编码。可以用CER或者CRT作为扩展名的的整数。比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”。【编码规则参考】
  • PEM: 基于ASCII(Base64)的编码。OpenSSL 使用 PEM 文件格式存储证书和密钥。【编码规则参考】

    PEM 实质上是 base64 编码的二进制内容,再进行增加或裁剪特殊字符-、n、r、begin信息、end信息等,如:

-----BEGIN CERTIFICATE-----内容-----END CERTIFICATE-----

注:本文中的私钥公钥都是用 pem 格式

2. PKCS(The Public-Key Cryptography Standards)

  • 由美国RSA公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
  • 版本:现有PCKS1,PCKS3,PCKS5,PKCS6,PKCS7,PKCS8,PKCS9,PKCS10,PKCS11,PKCS12,PKCS13,PKCS14,PKCS15 共 13个版本
    常用:PCKS1 和 PCKS8,本文使用 PCKS8 标准

    注:由于PKCS内容规范设计二进制,不方便使用,所以一般转成base64 后,用 pem 格式规范显示

  • PCKS1 的pem格式头:
//公钥-----BEGIN RSA PUBLIC KEY-----MEgCQQCpb53RwojJX+lxHiEMfNmixx+eIV+u+d9e61Ecx8MVBW0tzAoxTpdTKrgN9hdBqaP6rtQMxOp/4++C5+3zh6D1AgMBAAE=-----END RSA PUBLIC KEY-----//私钥-----BEGIN RSA PRIVATE KEY-----MIIBPAIBAAJBAKlvndHCiMlf6XEeIQx82aLHH54hX675317rURzHwxUFbS3MCjFOl1MquA32F0Gpo/qu1AzE6n/j74Ln7fOHoPUCAwEAAQJAJO8tyeHMC4may4uzzJMSpgcd/0xrHSte48QMBGgPQG95imYXELKQUV2rjzsua9xJP5huQjhe+qrmBpEqrtf7wQIhANccK0zuFaH4CoIuKsp92YB6OGwndy6UJaiX2RoUw0V5AiEAyaTTkar73r4dOB2s4Ofj+UkGX/aspp0dM+7V5HathF0CIQCezlYNSmvAEr23U9wVeAmd9x02g4BSa97Nc6U8wv1SiQIhAKap7ZTA1l1MlaoEHRfnkq5AhVxb7mfoBHMgPPoQfWqhAiEAnpkku9LfP2mlCCB85/zxsUehZOwoMVLlF2dSLWsrURs=-----END RSA PRIVATE KEY-----
  • PCKS8 的pem格式头:注意私钥头中没有 RSA
//公钥-----BEGIN PUBLIC KEY-----MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKzY3F21g7UWaTcIk/ltUy4LuuHK5Hhl9ZpdxDr4+WA7pNwhCzhgBKbWUa+XotUYet841I2mYPJ6+6X32LwotF0CAwEAAQ==-----END PUBLIC KEY-----//私钥-----BEGIN PRIVATE KEY-----MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEArNjcXbWDtRZpNwiT+W1TLgu64crkeGX1ml3EOvj5YDuk3CELOGAEptZRr5ei1Rh63zjUjaZg8nr7pffYvCi0XQIDAQABAkBUJ3GDHnD1peesJ70D37pz3LosXMBH7jxZ3/U+USH5O8M7ixztlpYa+ITcuL0MKxvVyVYw5Pvaui1+Nq9LV17xAiEA5VMCIgtn3WFEOpP+sVhHlqPcVbTfE3g0RlDfUt/sQ5sCIQDA9AiJ65G3pHJJxYNc9RB/lVav3anFkbgnGKolPw8TZwIhAIs7QLpGzoLcgT5HiIVIIf7V8fqfXClH/AUNKOn6RkotAiEAo6HQY/ZMeyqQaZOA1aJWPXxOKZKX2R68xxsZn8Ccbl0CIQDck74y8SzLRSBB6JgVZ6NoWkWI5tyjV8RFCZU9VUinQA==-----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);}

四.可能遇到的错误

  • 暂无

转载地址:http://duzxx.baihongyu.com/

你可能感兴趣的文章
debian、ubuntu系统下,常用的下载工具
查看>>
带以太网的MicroPython开发板:TPYBoardv201温湿度上传实例
查看>>
OSGI企业应用开发(十二)OSGI Web应用开发(一)
查看>>
Python 以指定概率获取元素
查看>>
微信公众平台图文教程(二) 群发功能和素材管理
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
wdcp 安装
查看>>
asterisk配置
查看>>
GA操作步骤和技巧(二)——用户行为分析
查看>>
shell中while循环里使用ssh的注意事项
查看>>
SHELL获取计算机外网ip的几种写法
查看>>
博客正在搬迁中
查看>>
触发器与存储过程的区别
查看>>
我的友情链接
查看>>
centos搭建supervisor
查看>>
linux日志分割
查看>>
我的友情链接
查看>>
Spring学习资料之 依赖注入(一)
查看>>
安装win7提示安装程序无法创建新的系统分区和定位现有系统分区
查看>>
快递查询接口的调用与解析案例
查看>>