场景:出于安全考虑,要求对页面提交的关键信息进行加密,在网络传输过程中使用密文传递,在服务器端解密后使用。这样不管在浏览器端还是网络传输中截获了数据,都无法获取实际的信息。
方法:使用非对称加密算法,在页面端使用公钥进行加密,在服务器端使用密钥进行解密。
已经有人通过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解密
相关推荐
总结,JavaScript与Java之间的RSA加密解密流程主要包括:前端使用JavaScript的`crypto-js`库加载公钥并加密数据,然后将加密后的数据发送给服务器;服务器端使用`Bouncy Castle`库加载私钥并解密数据。这种机制确保...
JavaScript实现RSA加密和解密
在uni-app中使用RSA加密,可以让应用的数据交换更加安全。 `jsencrypt.js`是一个JavaScript实现的RSA加密库,它允许在浏览器环境中进行RSA加解密操作。这个库非常方便,可以轻松集成到你的uni-app项目中,为前端...
POSTMAN RSA加密是一种在Postman测试工具中使用RSA加密技术的方法,主要涉及到JavaScript库Forge.js。Forge.js是一个强大的开源加密库,提供了多种加密算法,包括RSA(Rivest-Shamir-Adleman),这对于安全地传输...
在Java和JavaScript中实现RSA加密,对于处理较长的数据至关重要,因为这两种语言的标准库默认的RSA加密只能处理相对较小的块。这里我们将深入探讨如何在Java和JavaScript中实现超长数据的RSA加密,并解决跨平台兼容...
标题中的“用HTML和JavaScript写的RSA加密小工具”是指利用这两种前端技术开发的一款加密应用程序,主要功能是实现RSA加密算法。RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,...
总之,这个项目展示了如何在Java后端和JavaScript前端之间使用RSA加密技术进行安全的数据交换,保护敏感信息,尤其适用于处理用户登录等涉及用户隐私的操作。通过深入理解RSA算法和相关的编程库,开发者可以构建更...
使用RSA非对称加密完成JavaScript前端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,但是关于如何使用RSA完成前端的组合加密解密,东西就非常少了,并且由于RSA的特性,一...
3. **RSA加密**:使用公钥和填充后的数据执行RSA加密操作。这个过程实际上是将填充后的数据进行模幂运算(即\(ciphertext = plaintext^e \mod n\)),其中\(e\)是公钥的指数,\(n\)是模数。 4. **结果处理**:得到的...
RSA加密是一种非对称加密算法,它在网络安全和数据保护中扮演着重要角色。在前后端交互中,RSA加密常用于保障数据传输的安全性,防止数据在传输过程中被窃取或篡改。以下是对RSA加密及其在前后端交互中应用的详细...
JSEncrypt是一个JavaScript库,由Benjamin van Ryseghem开发,主要用于RSA加密操作,特别适用于前端与后端之间的安全通信。它提供了一种简单的方式来处理RSA公钥和私钥,并支持PKCS1(OAEP)填充模式,增加了加密的...
这个库很可能提供了对RSA加密的基本操作,如生成公钥/私钥对,使用公钥加密数据,以及使用私钥解密数据。开发者可以利用这个库将大文件或长字符串通过分段加密的方式进行安全传输。 在实际应用中,前端开发者首先...
在给定的"兼容JS和C#的RSA加密解密实例"中,我们关注的是如何在JavaScript(前端)和C#(后端)之间使用RSA进行安全的数据交换。这涉及到两个主要的方面:前端的加密和后端的解密。 前端部分,JavaScript通常用于...
RSA加密是一种非对称加密算法,它在网络安全和数据保护领域广泛应用。该算法基于大整数因子分解...总的来说,这些JavaScript库为开发者提供了在Web环境中实现RSA加密解密的工具,对于网络数据的安全传输具有重要意义。
3. 前端加密:JavaScript加载公钥,使用`crypto-js`库对敏感数据进行RSA加密。 4. 数据传输:加密后的数据通过HTTP/HTTPS发送到服务器。 5. 后端解密:Java后端接收到加密数据,使用私钥和`Cipher`进行解密。 6. ...
总的来说,这个"RSA加密.zip"文件提供了一个实用的案例,展示了如何在JavaScript和Java之间使用RSA非对称加密技术来保护数据安全。这对于理解非对称加密的工作原理以及在实际项目中应用RSA具有很好的参考价值。
有两个Java文件(RSACrypt.java和RSACryptTest.java)和一个JavaScript文件(jsencrypt.min.js),这表明代码实现了RSA加密解密的Java版本和JavaScript版本,可以在客户端和服务端之间进行安全的数据传输。...
2. **前端加密**:前端接收到公钥后,使用JavaScript库(如`crypto-js`或`jsrsasign`)将需要加密的数据与公钥一起进行RSA加密。 3. **数据传输**:加密后的密文通过网络发送到服务器。 4. **服务器解密**:服务器...
该项目是一个基于JavaScript的RSA加密算法设计源码,包含33个文件,包括23个Java文件、2个XML文件、1个Git...该系统主要利用JavaScript实现RSA加密功能,并辅以Java和HTML进行交互展示,适用于需要进行数据加密的场景。
在Java中实现RSA加密算法,可以确保数据的安全传输,防止数据在传输过程中被窃取或篡改。 RSA的核心原理基于大数因子分解的困难性。公钥是由两个大素数p和q的乘积n以及欧拉函数φ(n)(φ(n) = (p-1)(q-1))的因数e...