- 浏览: 40639 次
文章分类
最新评论
http://yajiao.iteye.com/blog/1772835
RSA算法使用javascript加密,使用java解密,提供完整代码及例子下载。
javascript加密介绍参见另一篇:javascript使用RSA加密提交数据。本篇的例子使用的js是上一篇中提到的第2个版本。
本篇是服务端解密部分,并且提供可运行的包括js的全部示例代码。
由于sun虚拟机自带的RSA解密填充模式使用的都是特殊的PADDING模式,而js中使用的padding其实就是特殊处理的部分,实际加密时是nopadding模式,所以无法直接使用sun自带的RSA算法在服务器端解密,可以使用第3方bouncycastle提供的算法程序,最新版可以在这里下载http://www.bouncycastle.org/latest_releases.html
Java代码
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.util.encoders.Hex;
public class RSABCExample {
// 可以先注册到虚拟机中,再通过名称使用;也可以不注册,直接传入后使用
public static final Provider pro = new BouncyCastleProvider();
private static final String charSet = "UTF-8";
private static String publicKeyStr = null;
private static String privateKeyStr = null;
private static PrivateKey privateKey = null;
private static PublicKey publicKey = null;
// 种子,改变后,生成的密钥对会发生变化
private static final String seedKey = "random";
public static void generateKeyPair() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", pro);
kpg.initialize(1024, new SecureRandom(seedKey.getBytes()));
KeyPair kp = kpg.generateKeyPair();
privateKey = kp.getPrivate();
privateKeyStr = new String(Base64.encode(privateKey.getEncoded()));
publicKey = kp.getPublic();
publicKeyStr = new String(Base64.encode(publicKey.getEncoded()));
System.out.println("PrivateKey:" + privateKey);
System.out.println("PublicKey:" + publicKey);
System.out.println(privateKeyStr);
System.out.println(publicKeyStr);
}
public static PublicKey getPublicRSAKey(String key) throws Exception {
X509EncodedKeySpec x509 = new X509EncodedKeySpec(Base64.decode(key));
KeyFactory kf = KeyFactory.getInstance("RSA", pro);
return kf.generatePublic(x509);
}
public static PrivateKey getPrivateRSAKey(String key) throws Exception {
PKCS8EncodedKeySpec pkgs8 = new PKCS8EncodedKeySpec(Base64.decode(key));
KeyFactory kf = KeyFactory.getInstance("RSA", pro);
return kf.generatePrivate(pkgs8);
}
public static byte[] encrypt(String input) throws Exception {
long start = System.currentTimeMillis();
Cipher cipher = Cipher.getInstance("RSA", pro);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] re = cipher.doFinal(input.getBytes(charSet));
long end = System.currentTimeMillis();
// System.out.println("encrypt use time "+(end-start)+"");
return re;
}
public static byte[] decrypt(byte[] encrypted) throws Exception {
long start = System.currentTimeMillis();
Cipher cipher = Cipher.getInstance("RSA", pro);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] re = cipher.doFinal(encrypted);
long end = System.currentTimeMillis();
// System.out.println("decrypt use time "+(end-start)+"");
return re;
}
public static String decodeJsValue(String jsValue) throws Exception {
byte[] input = Hex.decode(jsValue);
byte[] raw = decrypt(input);
// 标志位为0之后的是输入的有效字节
int i = raw.length - 1;
while (i > 0 && raw[i] != 0) {
i--;
}
i++;
byte[] data = new byte[raw.length - i];
for (int j = i; j < raw.length; j++) {
data[j - i] = raw[j];
}
return new String(data,charSet);
}
public static void main(String[] args) throws Exception {
generateKeyPair();
PublicKey pb = getPublicRSAKey(publicKeyStr);
System.out.println(pb.equals(publicKey));
PrivateKey ppk = getPrivateRSAKey(privateKeyStr);
System.out.println(ppk.equals(privateKey));
String input = "测试abcABC123";
byte[] en = encrypt(input);
System.out.println(new String(Hex.encode(en)));
byte[] re = decrypt(en);
System.out.println(new String(re, charSet));
// js加密后的值
String de = "08f7e292ccb4c73a981569a9c2dbf2b9c0c2cf615967282863e6e358432af288f1f026ed91a8ff5f6579ac246af9ce1f94f85e92b8a926627b95e6bd05b00b80a5548e9ce1a9bb2a20073cce629936ab9e27021af7370c2664065107a702c1805a4ec131a3573007213da3e390221053867074a427ffc28aa642fe2099ad7332";
System.out.println(decodeJsValue(de));
re = decrypt(en);
System.out.println(new String(re, charSet));
}
}
RSA算法使用javascript加密,使用java解密,提供完整代码及例子下载。
javascript加密介绍参见另一篇:javascript使用RSA加密提交数据。本篇的例子使用的js是上一篇中提到的第2个版本。
本篇是服务端解密部分,并且提供可运行的包括js的全部示例代码。
由于sun虚拟机自带的RSA解密填充模式使用的都是特殊的PADDING模式,而js中使用的padding其实就是特殊处理的部分,实际加密时是nopadding模式,所以无法直接使用sun自带的RSA算法在服务器端解密,可以使用第3方bouncycastle提供的算法程序,最新版可以在这里下载http://www.bouncycastle.org/latest_releases.html
Java代码
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.Provider;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;
import org.bouncycastle.util.encoders.Hex;
public class RSABCExample {
// 可以先注册到虚拟机中,再通过名称使用;也可以不注册,直接传入后使用
public static final Provider pro = new BouncyCastleProvider();
private static final String charSet = "UTF-8";
private static String publicKeyStr = null;
private static String privateKeyStr = null;
private static PrivateKey privateKey = null;
private static PublicKey publicKey = null;
// 种子,改变后,生成的密钥对会发生变化
private static final String seedKey = "random";
public static void generateKeyPair() throws Exception {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", pro);
kpg.initialize(1024, new SecureRandom(seedKey.getBytes()));
KeyPair kp = kpg.generateKeyPair();
privateKey = kp.getPrivate();
privateKeyStr = new String(Base64.encode(privateKey.getEncoded()));
publicKey = kp.getPublic();
publicKeyStr = new String(Base64.encode(publicKey.getEncoded()));
System.out.println("PrivateKey:" + privateKey);
System.out.println("PublicKey:" + publicKey);
System.out.println(privateKeyStr);
System.out.println(publicKeyStr);
}
public static PublicKey getPublicRSAKey(String key) throws Exception {
X509EncodedKeySpec x509 = new X509EncodedKeySpec(Base64.decode(key));
KeyFactory kf = KeyFactory.getInstance("RSA", pro);
return kf.generatePublic(x509);
}
public static PrivateKey getPrivateRSAKey(String key) throws Exception {
PKCS8EncodedKeySpec pkgs8 = new PKCS8EncodedKeySpec(Base64.decode(key));
KeyFactory kf = KeyFactory.getInstance("RSA", pro);
return kf.generatePrivate(pkgs8);
}
public static byte[] encrypt(String input) throws Exception {
long start = System.currentTimeMillis();
Cipher cipher = Cipher.getInstance("RSA", pro);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] re = cipher.doFinal(input.getBytes(charSet));
long end = System.currentTimeMillis();
// System.out.println("encrypt use time "+(end-start)+"");
return re;
}
public static byte[] decrypt(byte[] encrypted) throws Exception {
long start = System.currentTimeMillis();
Cipher cipher = Cipher.getInstance("RSA", pro);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] re = cipher.doFinal(encrypted);
long end = System.currentTimeMillis();
// System.out.println("decrypt use time "+(end-start)+"");
return re;
}
public static String decodeJsValue(String jsValue) throws Exception {
byte[] input = Hex.decode(jsValue);
byte[] raw = decrypt(input);
// 标志位为0之后的是输入的有效字节
int i = raw.length - 1;
while (i > 0 && raw[i] != 0) {
i--;
}
i++;
byte[] data = new byte[raw.length - i];
for (int j = i; j < raw.length; j++) {
data[j - i] = raw[j];
}
return new String(data,charSet);
}
public static void main(String[] args) throws Exception {
generateKeyPair();
PublicKey pb = getPublicRSAKey(publicKeyStr);
System.out.println(pb.equals(publicKey));
PrivateKey ppk = getPrivateRSAKey(privateKeyStr);
System.out.println(ppk.equals(privateKey));
String input = "测试abcABC123";
byte[] en = encrypt(input);
System.out.println(new String(Hex.encode(en)));
byte[] re = decrypt(en);
System.out.println(new String(re, charSet));
// js加密后的值
String de = "08f7e292ccb4c73a981569a9c2dbf2b9c0c2cf615967282863e6e358432af288f1f026ed91a8ff5f6579ac246af9ce1f94f85e92b8a926627b95e6bd05b00b80a5548e9ce1a9bb2a20073cce629936ab9e27021af7370c2664065107a702c1805a4ec131a3573007213da3e390221053867074a427ffc28aa642fe2099ad7332";
System.out.println(decodeJsValue(de));
re = decrypt(en);
System.out.println(new String(re, charSet));
}
}
发表评论
-
用JS刷新指定页面
2016-07-13 17:30 345http://blog.csdn.net/li_yu_ ... -
JS创建和存储 cookie一些方法总结
2016-07-11 15:28 260http://www.zgguan.com/zsfx/jsj ... -
深入理解JavaScript系列
2016-04-26 15:26 329http://www.cnblogs.com/TomXu/ar ... -
js生成二维码
2016-03-21 11:20 381https://github.com/jeromeetien ... -
Node.Js之FS文件操作篇
2015-11-05 16:24 413http://www.tuicool.com/articles ... -
字符串拼接
2015-11-03 17:20 3181. var tr = []; tr.pus ... -
bootstrap api
2015-11-03 17:15 375http://www.runoob.com/bootstrap ... -
zTree v3.5.19 API 文档
2015-11-03 17:14 604http://www.ztree.me/v3/api.php ... -
20151029node解析 excel
2015-10-29 21:46 453node解析 excel https://www.npmjs ... -
radio异常问问题---- prop的使用
2015-08-20 09:57 419判断: if($("#assignType1&quo ... -
百度编辑器ueditor-1.4.3-jsp使用教程
2015-07-07 18:15 1237http://www.uikoo9.com/blog/deta ... -
jQuery 在光标定位的地方插入文字的插件
2015-06-26 16:53 392http://www.jb51.net/article/302 ...
相关推荐
经过本人修改,简化并完善了别人的代码,使其更加的容易理解和学习! 此为一个完整的项目,...功能:服务端随机生成密钥,JS用公钥加密,服务端用私钥解密。用到的JS加密文件是从官网下载的最新版,速度快,稳定性好!
在"rsa加密_js加密_java解密"的场景中,我们首先在前端(通常是浏览器环境)使用JavaScript实现RSA加密。JS库如CryptoJS或Forge提供了RSA加密的功能,可以将待保护的数据转化为密文。这个过程可能涉及将数据分割成...
本文将详细介绍一个实际案例:如何在前端使用JavaScript库`jsencrypt`进行RSA加密,并在后端使用Java进行解密。这个功能实现的核心知识点包括RSA算法、`jsencrypt`库的使用以及前后端的交互。 首先,RSA是一种非...
前后端API交互使用RSA和AES加密解密(js、Java).md
在前端,可以使用`jsencrypt`库进行RSA加密,后端使用Java的`java.security`包中的`RSAPublicKey`和`RSAPrivateKey`进行解密。 **JavaScript加密实现** 在前端,`jsencrypt.js`库提供了RSA加密功能,可以方便地将...
在“RSA通过javascript加密java解密”的场景中,我们有两个主要的技术点:JavaScript端的加密和Java端的解密。以下是对这两个环节的详细说明: 1. JavaScript端的RSA加密: - 使用库:JavaScript中常见的RSA加密库...
在JavaScript中,可以使用库如`crypto-js`来实现DES加密,而Java则有内置的`javax.crypto`包,提供了对DES加密的支持。前端与后端之间,通常通过HTTP或HTTPS协议进行通信,HTTPS能提供基本的传输层安全,但为了...
总之,RSA-JS加密和JAVA解密实例展示了非对称加密技术在实际应用中的工作流程,提供了前端加密和后端解密的一种解决方案,确保了敏感信息在传输过程中的安全性。在实际项目中,可以根据需求选择合适的库和工具来实现...
总结,这个压缩包提供的Java RSA2048加密解密示例涵盖了前端JavaScript和后端Java的实现,旨在帮助开发者快速集成这一安全机制。正确理解和应用这些代码,可以提高应用程序的数据安全性,防止数据在传输过程中被窃取...
很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码
这篇博文"关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名"探讨了如何在JavaScript前端进行RSA加密,并在Java后端进行解密,以及如何使用RSA进行数字签名。 RSA加密的核心在于一对公钥和私钥。公钥用于...
源码的应用场景: ...这样客户端只需要知道rsa加密方式和公钥,前台不知道私钥是无法解密的,此解决方案还是相对比较安全的。 使用源码的注意事项: http://blog.csdn.net/wu_jia123/article/details/50553128
在JavaScript中,没有内置的RSA加密库,但可以使用第三方库,如`node-rsa`或`crypto-js`。这些库提供了类似的公钥/私钥生成和加密/解密功能。需要注意的是,由于JavaScript环境的安全限制,浏览器端可能无法直接处理...
在提供的压缩包中,有两个Java文件(RSACrypt.java和RSACryptTest.java)和一个JavaScript文件(jsencrypt.min.js),这表明代码实现了RSA加密解密的Java版本和JavaScript版本,可以在客户端和服务端之间进行安全的...
2. **前端加密**:前端接收到公钥后,使用JavaScript库(如`crypto-js`或`jsrsasign`)将需要加密的数据与公钥一起进行RSA加密。 3. **数据传输**:加密后的密文通过网络发送到服务器。 4. **服务器解密**:服务器...
RSA非对称加密,指定一个密码种子,使用该密码种子用java生成密钥对,并把公钥分发到客户端(浏览器),保存密码种子;JS采用公钥对重要信息进行加密,然后传回后台,取出密码种子重新生成密码对,使用私钥对密文...
例如,前端可以使用JavaScript库加密用户数据,然后通过HTTP请求发送到后端,后端使用Java解密数据,进行后续处理。这种方法有助于保护用户隐私,防止中间人攻击,确保数据在传输过程中的安全性。 需要注意的是,...