在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑~

项目在这里 https://github.com/travist/jsencrypt

【rsa算法】

首先科普一下rsa:公钥私钥成对,用其中一个加密只能用另一个解密,常用公钥加密私钥解密。

一开始看到斯坦佛那个库,原始的算法实现:

长度,建议至少1024。模数n(常取默认65537)两边都要用。

指数e,和n一起就是公钥。指数d,和n一起就是私钥。质数p和q用于生成密钥对,然后就丢弃不公开。

具体算法网上一大把,就不多说了。

【ssl/ssh密钥对】

用服务器上的工具生成的密钥对,格式一般是如下,有开始行结束行,内容用base64转码。这里涉及一些国际编码规范,代码分析时在逐一解释。

-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIA4OVgB4FRq4l5zjEmd4r/jswRcHlZQ
kg10p9rzG3VyXCPpa/ZkwOYy+kGq7a7BjAKTpic2cUNRim4m8HKTdc8CAwEAAQ==
-----END PUBLIC KEY-----

【代码分析】

加载公钥:setPublicKey->setKey->JSEncryptRSAKey->parseKey

RSAKey.prototype.parseKey = function (pem) {...}

注释写得非常好!

/**
...省略... *This method accepts public key* in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).* The format is defined as:* PublicKeyInfo ::= SEQUENCE {*   algorithm       AlgorithmIdentifier,*   PublicKey       BIT STRING* }* Where AlgorithmIdentifier is:* AlgorithmIdentifier ::= SEQUENCE {*   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm*   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)* }* and PublicKey is a SEQUENCE encapsulated in a BIT STRING* RSAPublicKey ::= SEQUENCE {*   modulus           INTEGER,  -- n*   publicExponent    INTEGER   -- e* }*/

代码如下:

 1 RSAKey.prototype.parseKey = function (pem) {
 2   try {
 3 ...
 4     var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);
 5     var asn1 = ASN1.decode(der);
 6 ...
 7     if (asn1.sub.length === 9) {
 8       // Parse the private key.
 9     }
10     else if (asn1.sub.length === 2) {
11       // Parse the public key.
12       var bit_string = asn1.sub[1];
13       var sequence = bit_string.sub[0];
14       modulus = sequence.sub[0].getHexStringValue();
15       this.n = parseBigInt(modulus, 16);
16       public_exponent = sequence.sub[1].getHexStringValue();
17       this.e = parseInt(public_exponent, 16);
18     }
19     else {
20       return false;
21     }
22     return true;
23   }
24   catch (ex) {
25     return false;
26   }
27 };

这里需要了解一下各种编码格式。hex和base64就不解释了。

ASN.1抽象语法标记,我的理解就是对数据进行结构化解析的规范:一个标准的ASN.1编码对象有四个域:对象标识域、数据长度域、数据域以及结束标志(可选,在长度不可知情况下需要,openssl中没有该标志)。

DER则是具体的编码实现。 http://baike.baidu.com/view/100318.htm#4

PKCS#1则是RSA中最基础的算法定义和密钥规定,讲人话就是定义了:公钥是元组(n,e),算法是n=q*p等一系列公式。https://en.wikipedia.org/wiki/PKCS1

这段代码两处亮点,一个是else if (asn1.sub.length === 2)判断公钥(没深究,反正靠子节点数判断);
两一个是var bit_string = asn1.sub[1];即前面有一段asn1.sub[0]是算法标识。

这里本身没有坑,但是生成公钥时如果命令不对应是会踩坑的(有一种命令是生成无算法标记的公钥)~~~

加密:encrypt->RSAEncrypt->pkcs1pad2 | doPublic->RSADoPublic

pkcs1pad2是做补位处理:

入参 var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3); 是(模位数+7)/8得到模的字节长度?

然后是一系列的移位操作,此处的作用是填入随机位使得每次加密的密文都不一样。http://blog.chinaunix.net/uid-21880738-id-1813144.html

RSADoPublic最终执行加密算法x^e (mod n)

至此,主要的算法、规范和坑基本上覆盖了,私钥和解密坑比较少,就不多说了。

最后,附送一个千年大坑,跨语言跨类库的时候不小心可能会遇到的 http://blog.chinaunix.net/uid-23069658-id-4282969.html

于这个js类库而言,-pubout出来的是可用的,而-RSAPublicKey_out出来的是不可用的。

与此对应,服务器openssl的类库中PEM_read_RSA_PUBKEY()读入是对应的,而PEM_read_RSAPublicKEY()读入是不对应的。

转载于:https://www.cnblogs.com/syjkfind/p/4617492.html

jsencrypt代码分析——openssl的rsa加密解密在js的实现相关推荐

  1. php java openssl ras_php基于openssl的rsa加密解密示例

    本文实例讲述了php基于openssl的rsa加密解密.分享给大家供大家参考,具体如下: $config = array( //"config" =>"D:/php ...

  2. OpenSSL 编程 - RSA 加密解密

    http://blog.csdn.net/nadoo/article/details/2156384 这几天做这方面的东西,网上资料很少,贴一个自己试验写的代码,做个记录. 加密: /* gcc -o ...

  3. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  4. 使用OpenSSL进行RSA加密和解密(非对称)

    1. RSA加密和解密基础概念 RSA是一种非对称加密. RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密. 加密 ...

  5. C++使用OPENSSL进行RSA加密,java服务端解密

    RSA是一种非对称加密. 加密和解密方式:公钥加密-私钥解密,私钥加密-公钥解密 背景 为了网络数据安全,Web端(Java)要求用RSA加密算法传数据,公钥加密私钥解密方式(RSA有公钥加密私钥解密 ...

  6. Linux的rsa命令,openssl命令行进行RSA加密解密

    openssl是一个功能强大的工具包,它集成了众多密码算法及实用工具.我们即可以利用它提供的命令台工具生成密钥.证书来加密解密文件,也可以在利用其提供的API接口在代码中对传输信息进行加密. RSA是 ...

  7. MacOS下使用C语言基于openssl库进行RSA加密解密

    MacOS下使用C语言基于openssl库进行RSA加密解密 1 安装openssl并生成密钥 首先当然要安装openssl(这里记得看一下安装路径,应该是/usr/local/Cellar/open ...

  8. 前后端加密解密 【JS加密模块(md5 、 crypto 、 crypto-js、jsencrypt) python RSA加密解密(pycryptodome )模块安装与使用】

    JS加密模块[js-md5(AES) . crypto (AES). crypto-js().jsencrypt(非对称加密.RSA)] 一.安装 npm install js-md5 npm ins ...

  9. java rsa 解密_Java中RSA加密解密的实现方法分析

    本文实例讲述了Java中RSA加密解密的实现方法.分享给大家供大家参考,具体如下: public static void main(String[] args) throws Exception { ...

最新文章

  1. vscode用鼠标滚轮_「鼠标」垂直鼠标体验之三 麦塔奇Rockstick2摇杆鼠标
  2. php单例模式的核心语句,PHP单例模式的核心思想
  3. 谈谈弹性Web托管的“弹性”
  4. Python初探——sklearn库中数据预处理函数fit_transform()和transform()的区别
  5. matlab 雷达图函数,R语言之可视化(20)ggradar雷达图
  6. UGUI_不添加摄像机解决UI与UI特效叠层
  7. 矩阵低秩张量分解_TKDE 2020 | CTRR:组稀疏约束的紧凑张量环回归
  8. TensorFlow2快速模型构建及tensorboard初体验
  9. mongodb java报授权,mongoDB 3.0用户创建与授权
  10. linux caffe ssd安装错误,ubuntu16.04安装caffe以及各种问题汇总
  11. @程序员,你的技术为啥十年八年也没有进步?
  12. 世界独创的螺旋数组低于n(o^2)的生成算法
  13. 07. 如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
  14. java单元测试的编写及运行方法
  15. 人工智能专业就业有哪些岗位方向
  16. 电商项目数据库设计 | 第五篇:参考京东商城详细讲解商品数据库设计
  17. LeetCode -- Word Ladder
  18. 自动切换输入法 for Mac(输入法辅助工具)
  19. 图像滤镜艺术---乐高像素拼图特效
  20. 《指弹:Like a star》

热门文章

  1. java异步处理_Java编程开发好入门吗 消息队列的用途有哪些
  2. 手写java_手写java锁
  3. php 微信获取code,微信网页授权接口为什么获取不到code(已解决)
  4. 覆盖分类的方法_智能垃圾分类箱上线,居民垃圾分类投放可领礼品
  5. C语言 pthread_cancelpthread_detach
  6. TensorFlow tf.keras.callbacks.CSVLogger
  7. ubuntu PPA
  8. TensorFlow Attention
  9. 2.6 更多导数的例子
  10. nofollow标签_网站Nofollow标签的应用场景