首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

javascript施用RSA加密提交数据

2013-01-26 
javascript使用RSA加密提交数据// PKCS#1 (type 2, random) pad input string s to n bytes, and return a

javascript使用RSA加密提交数据
// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigintfunction 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字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。

?

? ??解密后,按照加密时标记的结束位标志,截取出实际的输入即可。

? ? 下面是通过javascript解密的代码,服务器端解密后的处理同理。

?

? ? http://www-cs-students.stanford.edu/~tjw/jsbn/rsa2.js

? ??

// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintextfunction pkcs1unpad2(d,n) {  var b = d.toByteArray();  var i = 0;  while(i < b.length && b[i] == 0) ++i;  if(b.length-i != n-1 || b[i] != 2)    return null;  ++i;  while(b[i] != 0)    if(++i >= b.length) return null;  var ret = "";  while(++i < b.length) {    var c = b[i] & 255;    if(c < 128) { // utf-8 decode      ret += String.fromCharCode(c);    }    else if((c > 191) && (c < 224)) {      ret += String.fromCharCode(((c & 31) << 6) | (b[i+1] & 63));      ++i;    }    else {      ret += String.fromCharCode(((c & 15) << 12) | ((b[i+1] & 63) << 6) | (b[i+2] & 63));      i += 2;    }  }  return ret;}

?

? ? 由于js加密中使用的是RSA的NOPADDING的填充模式,使用SUN虚拟机默认的RSA解密算法解密会报错,可以使用第3方的算法提供程序。

? ? 服务器端解密代码及完整例子参见RSA使用js加密,使用java解密

?

?

?

?

热点排行