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对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...
随机推荐
- configparser模块读写ini配置文件
在自动化测试过程中,为了提高脚本的可读性和降低维护成本,将一些通用信息写入配置文件,将重复使用的方法写成公共模块进行封装,使用时候直接调用即可. 这篇博客,介绍下python中利用configpars ...
- Android canvas bug
安卓4.1.1-4.1.2的webkit在渲染canvas元素时有bug. 具体表现是出现重影,即canvas的clearRect()方法不能彻底清空画布,仍然保留之前某个状态当“背景”. 目前的修复 ...
- ExecutorService的submit方法的坑
先看一段代码: public Future<?> submit(Runnable task) { if (task == null) throw new NullPointerExcept ...
- 【扫盲贴】为什么屏幕分辨率是 640x480
本文原地址:http://www.easyx.cn/skills/View.aspx?id=172 常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640x480,当初 ...
- node后台启动
node启动后会占用当前shell 后台启动方式: 1.用forever进行管理 npm install -g forever forever start index.js 2.使用nohub命令 ...
- .net 有参属性 index (索引)
public class IndexTempte { public ArrayList nameList = new ArrayList(); public string this[int index ...
- ML.NET Cookbook --- 1.如何从文本文件中加载数据?
使用ML.NET中的TextLoader扩展方法从文本文件中加载数据.你需要知道在文本文件中数据列在那里,它们的类型是什么,在文本文件中什么位置可以找到它们. 请注意:对于ML.NET只读取文件的某些 ...
- Java的进程内缓存框架:EhCache
EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache缓存的特点: 1. 快速. 2. 简单. 3. 多种 ...
- CSS:如何清除a标签之间的默认留白间距
即使我们使用了类似 *{margin: 0;padding: 0;} 这样的代码重置了浏览器默认样式,也会发现类似<a>标签这种inline-block元素,它们之间也还存在着间距. de ...
- 食物(矩阵快速幂)(DP)
这个题..我们可以想到用递推写!!qwq(好吧,其实我的DP水平不高啊qwq) 就是我们以两个为单位(一共九种组合情况),然后往后面推下一位的情况. 通过手动模拟,我们可以找到它们之间的递推关系(详见 ...