java RSA加解密以及用途
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证。对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每次报文本身的加解密(这一般使用AES(最主流的加密算法)/DES加密),对于较为安全的支付通道,则一般是约定定期交换加解密密钥,交换过程本身的报文则是通过RSA进行加解密的。这样就在单纯的对称加密的基础上提供了更好的保障,只要签名复杂,定期的更新足以使得破坏的成本高昂到超过破解的成本。在SSL中,基本上也是这样的实现方式。
想DSA、ECDSA等只能用于签名,无法用于加密。
一般来说,公钥会发布给客户端,客户端用其加密报文。私钥则用于解密报文。在java 实现的RSA中,可参考如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey; import org.apache.commons.codec.binary.Base64; public class RSAUtils {
/**
* 生成公钥和私钥, 一般一次性生成, 存储在文件中进行分发和使用
*/
public static void generateKey() {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024); //一般来说, 长度为2048是最好的, 也是推荐的
KeyPair kp = kpg.genKeyPair();
PublicKey pbkey = kp.getPublic();
PrivateKey prkey = kp.getPrivate();
// 保存公钥
FileOutputStream f1 = new FileOutputStream("d:/pubkey.dat");
ObjectOutputStream b1 = new ObjectOutputStream(f1);
b1.writeObject(pbkey);
// 保存私钥
FileOutputStream f2 = new FileOutputStream("d:/privatekey.dat");
ObjectOutputStream b2 = new ObjectOutputStream(f2);
b2.writeObject(prkey);
} catch (Exception e) {
}
} /**
* 公钥加密, 一般调用者传递明文, 从本地存储读取公钥进行加密
* @param plainTxt
* @return
* @throws Exception
*/
public static String pubEncrypt(String plainTxt) throws Exception {
String s = Base64.encodeBase64String(plainTxt.getBytes("UTF-8"));
// 获取公钥及参数e,n
FileInputStream f = new FileInputStream("d:/pubkey.dat");
ObjectInputStream b = new ObjectInputStream(f);
RSAPublicKey pbk = (RSAPublicKey) b.readObject();
BigInteger e = pbk.getPublicExponent();
BigInteger n = pbk.getModulus();
// 获取明文m
byte ptext[] = s.getBytes("UTF-8");
BigInteger m = new BigInteger(ptext);
// 计算密文c
BigInteger c = m.modPow(e, n);
// 保存密文
String ciperTxt = c.toString();
return ciperTxt;
} /**
* 私钥解密, 一般调用者传递密文, 从本地存储读取私钥进行解密
* @param ciperTxt
* @return
* @throws Exception
*/
public static String privDecrypt(String ciperTxt) throws Exception {
BigInteger c = new BigInteger(ciperTxt);
// 读取私钥
FileInputStream f = new FileInputStream("d:/privatekey.dat");
ObjectInputStream b = new ObjectInputStream(f);
RSAPrivateKey prk = (RSAPrivateKey) b.readObject();
BigInteger d = prk.getPrivateExponent();
// 获取私钥参数及解密
BigInteger n = prk.getModulus();
BigInteger m = c.modPow(d, n);
// 显示解密结果
byte[] mt = m.toByteArray();
String plainTxt = new String(Base64.decodeBase64(mt),"UTF-8");
return plainTxt;
}
public static void main(String args[]) {
try {
// generateKey();
String ciperTxt = pubEncrypt("测试大中华123区");
System.out.println("公钥加密密文:" + ciperTxt);
System.out.println("私钥解密:" + privDecrypt(ciperTxt));
} catch (Exception e) {
System.out.println(e.toString());
}
}
}
PS:关于哪个加密、哪个解密的问题,记住以下原则即可(这个是从合理性角度,不是纯技术角度):
既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。
在java的安全体系范围内,有三个应该掌握的组件:Key Manager, Trust Manager 和Key Store。
Key Manager是用于管理证书的,这意味着在一个会话的建立过程中,Key Manager控制发送哪个证书给对方。参考:http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/X509ExtendedKeyManager.html
Trust Manager用于管理远程证书,这意味着在一个会话的建立过程中,Trust Manager控制来自对方的哪个证书是可信的,如果服务端不认证客户端,则不需要;而客户端一般都要认证服务端,所以需要用到。参考:http://docs.oracle.com/javase/7/docs/api/javax/net/ssl/X509ExtendedTrustManager.html
Key Store是证书的java封装实现。java要求所有的证书要么转换为java专有的二进制格式,要么使用PKCS#12格式,这些格式都是使用Key Store管理的。对于服务器证书,可以使用专有格式,对于客户端的键/证书对,可以使用PKCS#12格式。参考:http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html
java RSA加解密以及用途的更多相关文章
- java rsa 加解密
参考 http://blog.csdn.net/a394268045/article/details/52232120 package rsa; import org.apache.commons.c ...
- RSA加解密用途简介及java示例
在公司当前版本的中间件通信框架中,为了防止非授权第三方和到期客户端的连接,我们通过AES和RSA两种方式的加解密策略进行认证.对于非对称RSA加解密,因为其性能耗费较大,一般仅用于认证连接,不会用于每 ...
- 全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件
作者: zyl910 一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时. 由于 .Net.J ...
- Rsa加解密Java、C#、php通用代码 密钥转换工具
之前发了一篇"TripleDes的加解密Java.C#.php通用代码",后面又有项目用到了Rsa加解密,还是在不同系统之间进行交互,Rsa在不同语言的密钥格式不一样,所以过程中主 ...
- RSA加解密工具类RSAUtils.java,实现公钥加密私钥解密和私钥解密公钥解密
package com.geostar.gfstack.cas.util; import org.apache.commons.codec.binary.Base64; import javax.cr ...
- 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence
遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...
- Java中的RSA加解密工具类:RSAUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils; ...
- 【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿
[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时 ...
- 前后端java+vue 实现rsa 加解密与摘要签名算法
RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...
随机推荐
- 阿里云 云解析使用方法/在阿里云ESC服务器解析域名并绑定服务器IP后上传文件通过域名访问步骤教程
第一步:登录阿里云官网,获取服务器ECS的指定公网IP地址. 1.输入阿里云官网账号进入首页,如下图: 2.点击进入"管理控制台",如下图: 3.点击"云服务器ECS&q ...
- APP性能测试
方法一: 本地安装安卓模拟器,用LR选择模拟器录制方式录制 方法二: 手机真机需要root,可以在电脑上下载一键root工具(如卓大师),然后手机和电脑用数据线连接,然后root. 在手机上运行 Mo ...
- 理论经典:TCP协议的3次握手与4次挥手过程详解
1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...
- java基础—继承题目:编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish
编写一个Animal类,具有属性:种类:具有功能:吃.睡.定义其子类Fish package zhongqiuzuoye; public class Animal { //属性 private Str ...
- Python字符串的encode与decode
首先要搞清楚,字符串在Python内部的表示是unicode编码. 因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unic ...
- SQL Pass北京举办第11次线下活动,欢迎报名(本次活动特别邀请了来自微软总部Xin Jin博士)
活动主题: 探讨SQL Server 2014与Fusion IO在SQL Server中的应用 地点:北京微软(中国)有限公司[望京利星行],三层308室 时间:2013年 10 月19日 13:3 ...
- CSS背景100%平铺 浏览器缩小背景显示不全解决办法
本文我们分享前端CSS背景100%平铺,浏览器缩小背景显示不全bug解决的两个方法,如果你也遇到了,那么就可以参考下面文章. 把浏览器的窗口缩小时,拖动滚动条时你会发现原本设定的CSS背景100%平铺 ...
- MYSQL线程池总结(一)
线程池是Mysql5.6的一个核心功能,对于服务器应用而言,无论是web应用服务还是DB服务,高并发请求始终是一个绕不开的话题.当有大量请求并发访问时,一定伴随着资源的不断创建和释放,导致资源利用率低 ...
- Shine.js – 帮助你实现各种好看的阴影效果
Shine.js 是一个用于实现漂亮阴影的 JavaScript 库.您可以设置动态光的位置,可定制的阴影.不依赖于第三方库,兼容 AMD.能在支持 textShadow 或 boxShadow 的浏 ...
- Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
<Windows Azure Platform 系列文章目录> 之前有很多网友询问我如何通过VS发布Cloud Service至Azure China,这里我专门写篇文章,给大家详细介绍下 ...