- 浏览: 37986 次
文章分类
最新评论
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 320http://blog.csdn.net/li_yu_ ... -
JS创建和存储 cookie一些方法总结
2016-07-11 15:28 243http://www.zgguan.com/zsfx/jsj ... -
深入理解JavaScript系列
2016-04-26 15:26 311http://www.cnblogs.com/TomXu/ar ... -
js生成二维码
2016-03-21 11:20 347https://github.com/jeromeetien ... -
Node.Js之FS文件操作篇
2015-11-05 16:24 390http://www.tuicool.com/articles ... -
字符串拼接
2015-11-03 17:20 2931. var tr = []; tr.pus ... -
bootstrap api
2015-11-03 17:15 343http://www.runoob.com/bootstrap ... -
zTree v3.5.19 API 文档
2015-11-03 17:14 573http://www.ztree.me/v3/api.php ... -
20151029node解析 excel
2015-10-29 21:46 407node解析 excel https://www.npmjs ... -
radio异常问问题---- prop的使用
2015-08-20 09:57 395判断: if($("#assignType1&quo ... -
百度编辑器ueditor-1.4.3-jsp使用教程
2015-07-07 18:15 1198http://www.uikoo9.com/blog/deta ... -
jQuery 在光标定位的地方插入文字的插件
2015-06-26 16:53 351http://www.jb51.net/article/302 ...
相关推荐
经过本人修改,简化并完善了别人的代码,使其更加的容易理解和学习! 此为一个完整的项目,...功能:服务端随机生成密钥,JS用公钥加密,服务端用私钥解密。用到的JS加密文件是从官网下载的最新版,速度快,稳定性好!
很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码
js加密 js 解密 java加密
RSA通过javascript加密java解密
前端js加密, 后端java解密,引用项目工程里面js、java代码到自己工程里面即可,使用方便, 可以自行生成密钥
RSA非对称加密,指定一个密码种子,使用该密码种子用java生成密钥对,并把公钥分发到客户端(浏览器),保存密码种子;JS采用公钥对重要信息进行加密,然后传回后台,取出密码种子重新生成密码对,使用私钥对密文...
前后端API交互使用RSA和AES加密解密(js、Java).md
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
js前台通过RSA,DES加解密,java后台解密、加密
rsa aes 加解密 js java 前后端互通
RSA,js前台加密java后台解密
AES+RSA加密解密(js和java互通).zip AES+RSA加密解密(js和java互通).zip
rsa加密技术是js前端加密,服务端解密,很适合密文加密传输
使用JS RSA公钥加密,可使用PHP RSA私钥解密、使用PHP RSA公钥加密,可使用JS RSA私钥解密
包含js和java代码,导入项目即可使用
Js Java Rsa 加密解密,具体用法请看blog,里面包含js库,java jar包,和一个别人写的可以完成加密解密的demo
java接口数据加密解密,基于RSA原理,java与js对数据加密,解密的demo案例。 java+js基于RSA解密解密。
综合网上javasript和java RSA加密解密资源,实现了java和javascript RSA加密解密的互操作,都可以生成公钥传给对方加密然后回传密文用自己的私钥解密。