赞
踩
RSA加密算法中,公钥由两个参数组成,即模数n和指数e;私钥也由两个参数组成,即模数n和指数d。加密过程中,明文m通过公钥进行加密得到密文c,加密公式为:c = m^e mod n。解密过程中,密文c通过私钥进行解密得到明文m,解密公式为:m = c^d mod n。
现在已知公钥(n, e)和密文c,我们可以通过指数取模运算得到解密后的明文m。
假设明文为M,密文为C,私钥为d,公钥为e和n(其中n=p*q,p和q为两个大素数),则解密公式为:M = C^e mod n
进行RSA公钥解密具体的密文时,可以通过js的指数取模运算。接口可以参考这个:x.modPowInt(this.e, this.n);
在deveco创建好一个项目后,在terminal中输入:npm install big-integer
结果:
在Choose Your Ability Template界面中,选择Static Library,并单击Next
直接finish:
(放在哪个路径下无所谓,只要在依赖中引入相应路径即可)
以下是BigInteger.js的源码:
稍微修改下,使导入的第三方库生效:
目录结构如下:
明确公式:假设明文M,密文为C,公钥为e和n,则解密公式为:M = C^e mod n
首先提取公钥中的n和e,然后转换相应的格式。
在这里我们进行一个完整的加解密流程,在这个网站中RSA公私钥生成、RSA加密解密生成一个RSA1024bit,PKCS#1密钥格式的公私钥。
将得到的公私钥保存到本地记录下来,将得到的私钥加密明文:
得到的公钥使用ASN.1解码工具解码提取出e和n:
因为一开始我们生成RSA公私钥的时候输出格式为PEM/Base64,在DER编码中,整数的表示采用了大端字节序的方式。而且ASN.1规定,如果整数的最高位是1,则需要在前面添加一个0x00字节来确保整数的正负性质被正确解析,这就是为什么有时候密钥参数前面会多出1字节 0x00 的原因。需要注意的是,PEM 本身不是 ASN.1 的编码规则,它只是 Base64-encoded DER。所以在代码中传入n的参数时,需要去掉前缀0x00。
将提取出的e和n以及通过在线工具进行私钥加密得到的密文如图所示操作:
得到的log数据为(数据较长,此处分为两部分截取):
为什么会得到这样的数据?
因为这个是RSA算法,PKCS1(V1.5)填充模式,所以该数据需要提取出实际源数据
参考CSDN:加密算法之PKCS填充
具体所需内容截图如下:
又因为得到的plaintextHex已经被转成了16进制,所以在得到的log信息中得出1fffff...中的“1”表示0001。按照上图的PKCS1填充模式描述,得知0001其中00是保留位,“BT”的数据是01,那么按照接下来的“PS”,如果BT为01,则PS全部为FF。继续往后分析,得知源数据为e68891e698afe8beb0e8beb0。
源数据是24chars,也就是12个字节。将源数据通过十六进制转二进制,二进制再转成utf-8编码得到中文:我是辰辰
结果如图:
这里通过使用ohos的buffer库,先将源数据从hex string转uint8array,再将uint8array转utf-8 string得到明文。
密文是base64编码的数据,公钥需要解出n和e。
这其中的基本思路:
RSA公钥解密:明文M,密文为C,公钥为e和n,则解密公式为:M = C^e mod n
密文=>base64解码=>二进制字节流=>16进制字符串=>大数
数学计算=C^e mod n=明文的大数=>16进制字符串=>二进制字节流=>utf-8编码=>明文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。