Java中的RSA加解密工具类:RSAUtils
本人手写已测试,大家可以参考使用
package com.mirana.frame.utils.encrypt; import com.mirana.frame.utils.log.LogUtils;
import org.apache.commons.codec.binary.Base64; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec; /**
* Title:RSA加解密工具
*
* @CreatedBy Mirana
* @DateTime 2018/3/2315:30
*/ public class RSAUtils { // 字符编码格式
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
// 换行
public static final String NEXTLINE = System.getProperty("line.separator");
// RSA 算法,Java默认"RSA"="RSA/ECB/PKCS1Padding"
public static final String ALGORITHM_RSA = "RSA"; /**
* 生成指定长度的keypair,最小长度512,目前1024的长度已经很难破解
*
* @param keysize 秘钥对长度
* @return
* @throws NoSuchAlgorithmException
*/
public static KeyPair genKeyPair (int keysize) throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM_RSA);
keyPairGenerator.initialize(keysize);
return keyPairGenerator.generateKeyPair();
} /**
* 公钥加密,默认UTF-8
*
* @param contentBytes 要加密的Bytes
* @param publickey 公钥
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidKeySpecException
*/
public static byte[] encrypt (byte[] contentBytes, PublicKey publickey)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException { Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
cipher.init(Cipher.ENCRYPT_MODE, publickey);
byte[] encryptBytes = cipher.doFinal(contentBytes);
encryptBytes = Base64.encodeBase64(encryptBytes);
return encryptBytes;
} /**
* 公钥加密字符串
*
* @param content 要加密的文本
* @param base64PublickeyStr base64编码后的公钥
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidKeySpecException
*/
public static String encryptStr (String content, String base64PublickeyStr)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException { // publickeyStr-->PublicKey
byte[] buffer = Base64.decodeBase64(base64PublickeyStr.getBytes());
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
PublicKey publickey = keyFactory.generatePublic(keySpec); return new String(encrypt(content.getBytes(DEFAULT_CHARSET), publickey), DEFAULT_CHARSET);
} /**
* 私钥解密
*
* @param contentBytes 要解密的Bytes
* @param privatekey 私钥
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidKeySpecException
*/
public static byte[] decrypt (byte[] contentBytes, PrivateKey privatekey)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException {
Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
cipher.init(Cipher.DECRYPT_MODE, privatekey);
return cipher.doFinal(Base64.decodeBase64(contentBytes));
} /**
* 私钥解密字符串,默认UTF-8
*
* @param content 要解密的文本
* @param base64PrivatekeyStr Base64编码后的私钥
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws InvalidKeySpecException
*/
public static String decryptStr (String content, String base64PrivatekeyStr)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException { // privatekeyStr-->PrivateKey
byte[] buffer = Base64.decodeBase64(base64PrivatekeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);
PrivateKey privatekey = keyFactory.generatePrivate(keySpec); return new String(decrypt(content.getBytes(DEFAULT_CHARSET), privatekey), DEFAULT_CHARSET);
} /**
* RAS加密
*
* @param content 原文本
* @param base64PublickeyStr base64编码后的公钥
* @return
*/
public static String rsaEncrypt (String content, String base64PublickeyStr) {
StringBuffer rsaLogStr = new StringBuffer();
rsaLogStr.append(NEXTLINE);
rsaLogStr.append("----- [ RSA加密 ] Start -----" + NEXTLINE);
rsaLogStr.append("----- [ RSA加密 ] 加密前文本:" + content + NEXTLINE);
rsaLogStr.append("----- [ RSA加密 ] 公钥:" + base64PublickeyStr + NEXTLINE); try {
content = encryptStr(content, base64PublickeyStr);
rsaLogStr.append("----- [ RSA加密 ] 加密后文本:" + content + NEXTLINE);
rsaLogStr.append("----- [ RSA加密 ] End -----" + NEXTLINE);
LogUtils.info(rsaLogStr);
} catch (Exception e) {
rsaLogStr.append("----- [ RSA加密 ] 加密时发生异常:" + e.toString() + NEXTLINE);
rsaLogStr.append("----- [ RSA加密 ] End -----" + NEXTLINE);
LogUtils.error(rsaLogStr);
e.printStackTrace();
} return content;
} /**
* RSA解密
*
* @param content 要解密的文本
* @param base64PrivatekeyStr Base64编码后的私钥
* @return
*/
public static String rsaDecrypt (String content, String base64PrivatekeyStr) {
StringBuffer rsaLogStr = new StringBuffer();
rsaLogStr.append(NEXTLINE);
rsaLogStr.append("----- [ RSA解密 ] Start -----" + NEXTLINE);
rsaLogStr.append("----- [ RSA解密 ] 解密前文本:" + content + NEXTLINE);
rsaLogStr.append("----- [ RSA解密 ] 私钥:" + base64PrivatekeyStr + NEXTLINE); try {
content = decryptStr(content, base64PrivatekeyStr);
rsaLogStr.append("----- [ RSA解密 ] 解密后文本:" + content + NEXTLINE);
rsaLogStr.append("----- [ RSA解密 ] End -----" + NEXTLINE);
LogUtils.info(rsaLogStr);
} catch (Exception e) {
rsaLogStr.append("----- [ RSA解密 ] 解密时发生异常:" + e.toString() + NEXTLINE);
rsaLogStr.append("----- [ RSA解密 ] End -----" + NEXTLINE);
LogUtils.error(rsaLogStr);
e.printStackTrace();
} return content;
} public static void main (String[] args) {
KeyPair keypair = null;
try {
keypair = genKeyPair(512);// 公钥私钥对
} catch (Exception e) {
LogUtils.error("生成公钥私钥发生异常:" + e.toString());
}
PublicKey publickey = keypair.getPublic();// 公钥
PrivateKey privatekey = keypair.getPrivate();// 私钥 // 原文本
String content = "{'name':'mmmirana','age':'27','phone':'17112345678'}"; // base64编码后的公钥(一般从文件id_ras.pub中读取)
String base64PublickeyStr = Base64.encodeBase64String(publickey.getEncoded());
// base64编码后的私钥(一般从文件id_rsa中读取)
String base64PrivatekeyStr = Base64.encodeBase64String(privatekey.getEncoded()); // RSA加密
String encryptedContent = rsaEncrypt(content, base64PublickeyStr); // RSA解密
rsaDecrypt(encryptedContent, base64PrivatekeyStr);
}
}
测试日志如下:
[INFO ]
----- [ RSA加密 ] Start -----
----- [ RSA加密 ] 加密前文本:{'name':'mmmirana','age':'27','phone':'17112345678'}
----- [ RSA加密 ] 公钥:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIrG4j+lLbluoG4n6pJ24YO/j4+0OIRhBFOCdERchN/np3inpo8uFw/tg5m4q1x85juqqzXTKyHrMG+dTwaSgOsCAwEAAQ==
----- [ RSA加密 ] 加密后文本:OH0/+ISqITRTaXX8fej9pDu4v/hcZmFUw6HdxZgDUNbti0SJc8mltW/QlIkODbC116/98/gmSsNTq6bUdmq3mw==
----- [ RSA加密 ] End ----- [INFO ]
----- [ RSA解密 ] Start -----
----- [ RSA解密 ] 解密前文本:OH0/+ISqITRTaXX8fej9pDu4v/hcZmFUw6HdxZgDUNbti0SJc8mltW/QlIkODbC116/98/gmSsNTq6bUdmq3mw==
----- [ RSA解密 ] 私钥:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAisbiP6UtuW6gbifqknbhg7+Pj7Q4hGEEU4J0RFyE3+eneKemjy4XD+2DmbirXHzmO6qrNdMrIeswb51PBpKA6wIDAQABAkEAhLs4RhtcIlE2zGUNLEzb4MDlNFLxA1wvYRgS0BeVVvi2+J70tk4fZ/HHyLn5TnICU/87LMStogHfNFTc7Xo3IQIhAMV5xenT2bWwRv0xpg0qgNhcRwO+5Sbak8MA/C7gFr/zAiEAs+e1d95Z/CUJ6KbYsFfjTSTBa6P8eQpeKUrFSg9e8SkCIF86ngposzA+1bz72Eu5F3E+7rALuo3GEkOTkgk43z+pAiBMFIoehg6h3fwBwkVS1egPIKMXZUMI4QSPC8rBFhz9eQIgN4cUN0EdANFCVBHtqQ9I7A2v+S2jk7yhDMsXQc8ddYM=
----- [ RSA解密 ] 解密后文本:{'name':'mmmirana','age':'27','phone':'17112345678'}
----- [ RSA解密 ] End -----
Java中的RSA加解密工具类:RSAUtils的更多相关文章
- RSA加解密工具类RSAUtils.java,实现公钥加密私钥解密和私钥解密公钥解密
package com.geostar.gfstack.cas.util; import org.apache.commons.codec.binary.Base64; import javax.cr ...
- Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- C# 中使用 RSA加解密算法
一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...
- 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence
遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...
- 前后端java+vue 实现rsa 加解密与摘要签名算法
RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...
- Lua 中的 RSA 加解密实现
记得之前,部门某款游戏陆陆续续收到一些玩家反馈,抱怨在登录游戏时会等待很久.初步排查后基本断定可能是此游戏的登录服务器程序某块代码有问题,于是即安排了服务器同事作排查分析但一直无果. 之后我时间有了空 ...
- Java中的AES加解密
直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...
- VUE+webpack+npm项目中的RSA加解密
一.安装jsencrypt npm i jsencrypt node_modules文件夹中出现jsencrypt 二.引入jsencrypt 在main.js中import: import JsEn ...
- Vue项目中的RSA加解密
前后端使用rsa加密: 一般是客户端初始化时访问登录服务时,服务端面动态生成一对RSA对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...
随机推荐
- kalilinux-权限提升
meterpeter: 可以在 Meterpreter 使用 incognito 来开始模拟过程: use incognito 展示 incognito 的帮助文档,通过输入 help 命令: hel ...
- (转)深入理解最强桌面地图控件GMAP.NET --- 百度地图
原文地址:http://www.cnblogs.com/enjoyeclipse/archive/2013/01/14/2859026.html 前两篇介绍了GMAP.NET的一些基本功能和如何在自己 ...
- (转载)get和 post方法的不同
HTTP的Get/Post请求区别归纳 1. get是从服务器上获取数据,post是向服务器传送数据.g et 和 post只是一种传递数据的方式,get也可以把数据传到服务器,他们的本质都是发送请求 ...
- ACM 韩信点兵 、n的另一种阶乘、6174的问题
3.6174问题 描述 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作.例如,从1234出发,依次可以得到4321- ...
- Linux 判断进程是否已经运行的程序
bool ServerProcess::isAlreadyRunning() { #ifndef __linux__ WarningLog(<<"can't check if p ...
- mysql查询最近7天的数据,没有数据自动补0
问题描述 查询数据库表中最近7天的记录 select count(*),date(create_time) as date from task where datediff(now(),create_ ...
- Python相关基础
1>变量: 2>条件判断与缩进: sex = raw_input("Please input your gender:") if sex == "girl&q ...
- cenos7切换阿里源
备份并安装base reop源 cd /etc/yum.repos.d sudo mv CentOS-Base.repo CentOS-Base.repo.bak 下载阿里源并配置 sudo wget ...
- 阿里云ECS云服务器编译安装PHP遇到virtual memory exhausted: Cannot allocate memory
阿里云编译安装php时遇到virtual memory exhausted: Cannot allocate memory 买了个服务器, 1G 的内存阿里云服务器,编译东西按说应该够了,安装相关的内 ...
- DbSet中Find,AsNoTracking,Attach及DBEntityEntry,ChangeTracker
Find,AsNoTracking,Attach,DBEntityEntry,ChangeTracker,Local 一:DBSet 我们在SaveChange的时候,如果获取到DbSet中一些Ent ...