场景:出于安全考虑,要求对页面提交的关键信息进行加密,在网络传输过程中使用密文传递,在服务器端解密后使用。这样不管在浏览器端还是网络传输中截获了数据,都无法获取实际的信息。
方法:使用非对称加密算法,在页面端使用公钥进行加密,在服务器端使用密钥进行解密。
已经有人通过javascript实现了rsa加密算法,以下是两个选择:
该版本不支持非ASCII的字符。
相同数据每次加密后的密文是固定的,使用标准的RSA算法解密后就可以获得加密前的数据。
2、http://www-cs-students.stanford.edu/~tjw/jsbn/
该版本支持UTF-8可以编码的所有字符,包括中文。
相同数据每次加密后的密文是变化的,使用标准的RSA算法解密后还需要进行处理后才能获得加密前的数据。
该网站还给出了一个供参考的性能比较结果:
http://www-cs-students.stanford.edu/~tjw/jsbn/speed.html
下面分析下两个版本不同的原因:
http://www-cs-students.stanford.edu/~tjw/jsbn/rsa.js
在于这个js中的这个方法:
// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint 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字符进行了兼容,并且在拼装完实际输入的字符后,还拼装了随机的字节,使用拼装后的字符串去加密。由于每次拼装的结果是随机的,这样每次加密后的密文都不同。
解密后,按照加密时标记的结束位标志,截取出实际的输入即可。
下面是通过javascript解密的代码,服务器端解密后的处理同理。
http://www-cs-students.stanford.edu/~tjw/jsbn/rsa2.js
// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext function 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解密
相关推荐
NULL 博文链接:https://hb-keepmoving.iteye.com/blog/1851178
使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,但是关于如何使用RSA完成前端的组合加密解密,东西就非常少了,并且由于RSA的特性,一...
javascript java rsa 加密 解密 数据加密 数据解密
通过javascript实现RSA加密,使用了标准的国际PKCS1填充,支持UTF-8编码
本rsa算法是使用Java与javascript加密解密范例代码,该资料从互联网收集,加上了自己的使用体会,如果对你有帮助那是万幸! js加密部分
https://github.com/digitalbazaar/forge 编译后的文件
综合网上javasript和java RSA加密解密资源,实现了java和javascript RSA加密解密的互操作,都可以生成公钥传给对方加密然后回传密文用自己的私钥解密。
RSA加密算法的源代码,用JAVA实现 速度很快哦
运用网页设计的方式写了一个RSA加密小工具 有浏览器能看网页的机器上都能用
RSA加密脚本 JavaScript 参考:Blackberry10 使用js+HTML5开发 RSA加密解密时遇到的问题:BB10端使用js加密与解密, 服务器端使用加密与解密 1,加密非常的简单代码机会上没怎么修改,另外js加密可能出现的问题在BB10 ...
由于项目需要,在网上查找了很多资料,整理了一下各种网上的资料,经过一段时间的研究,目前以完成对AES以及RSA的前端JS加密,目前已整理完,特整理一份出来供大家参考。注意:AES用的是CryptoJS库的,而RSA则是用的...
console.log('加密后数据:%o', encrypted); //解密 var decrypt = new JSEncrypt(); decrypt.setPrivateKey(PRIVATE_KEY); let un = decrypt.decryptLong(encrypted); console.log('解密后数据:%o', un);
login.jsp所调用的javascript,有:RSA.jsBigInt.jsBarrett.js博文链接:https://sunxboy.iteye.com/blog/209156
在客户端浏览器,Javascript使用RSA算法,以公钥对密码进行加密,服务端使用相应的私钥进行解密。一般用于注册时或登录时填写的密码。 1. [文件] security.js ~ 19KB 2. [文件] RSAUtils.java ~ 15KB 说明文档
集成了rsa加密,js前端加密,java后端加密,可以自己生成公钥秘钥对,然后在相应的文件中修改。有问题请和我联系。
JavaScript实现RSA加密必须的js文件。 在引用jquery文件后再引用 具体前后台实现方法参见博客: http://www.cnblogs.com/csqb-511612371/p/4898437.html
C#加JS的RSA加密程序 // RSA, a suite of routines for performing RSA public-key computations in // JavaScript. // // Requires BigInt.js and Barrett.js. // // Copyright 1998-2005 David Shapiro. // // You...
RSA非对称 C#解密、js加密实现登陆密文,传输RSA非对称 C#解密、js加密实现登陆密文传输,RSA非对称 C#解密、js加密实现登陆密文传输
RSA加密解密
用javascript进行RSA加密并用C#后台接收解码。 /// /// 产生一组RSA公钥、私钥 /// /// <returns></returns> public static Dictionary, string> CreateRsaKeyPair() { var keyPair = new Dictionary, ...