1、在node.js中使用rsa算法。首先需要是使用node-rsa包
2、实现加密/解密
客户端需要使用一个jsencrypt.min.js 包利用公钥对数据进行加密
以上运行时可以会出现如下错误
出现如上错误的时候,是服务端的加密方法和jsencrypt的加密方式不一致导致的。jsencrypt加密方式是pkcs1,node-rsa 默认的加密方式是pkcs1_oaep。解决办法如下:
用javascript实现rsa加解密的实现方式是通过PKCS完成的。1、整个定义的function
function pkcs1pad2(s,n) {
if(n <s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA")
return null
}
var ba = new Array()
var i = s.length - 1
while(i >= 0 &&n >0) {
var c = s.charCodeAt(i--)
//UTF-8编码为变长字节,使用实际的字节来记录
if(c <128) { // encode using utf-8
ba[--n] = c
}
else if((c >127) &&(c <2048)) {
ba[--n] = (c &63) | 128
ba[--n] = (c >>6) | 192
}
else {
ba[--n] = (c &63) | 128
ba[--n] = ((c >>6) &63) | 128
ba[--n] = (c >>12) | 224
}
}
//实际输入拼装结束,将下一位赋值为0标记结束
ba[--n] = 0
var rng = new SecureRandom()
var x = new Array()
//拼接随机非0字节
while(n >2) { // random non-zero pad
x[0] = 0
while(x[0] == 0) rng.nextBytes(x)
ba[--n] = x[0]
}
//这两位做简单的校验
ba[--n] = 2
ba[--n] = 0
return new BigInteger(ba)
}
该方法中对UTF-8字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。
2、调用方法:;
function RSAEncrypt(text) {
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3)
if(m == null) return null
var c = this.doPublic(m)
if(c == null) return null
var h = c.toString(16)
if((h.length &1) == 0) return helse return "0" + h
}