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对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...
随机推荐
- gogland golang 颜色&字体 colors&font 配置文件
<scheme name="Ya" version="142" parent_scheme="Darcula"> <opt ...
- 开源SLAM
GitHub 上优秀的开源SLAM repo (更新中):https://www.jianshu.com/p/464ca0d0c254 当前的开源SLAM方案:https://www.cnblogs. ...
- C# 生成dll文件 并导入使用
首先 在unity创建一个脚本 并编写内容,其中需要调用的方法.变量要公有化(也可以直接新建cs文件用编译器打开编译,但要先导入UnityEngine.dll). 然后,复制脚本关闭unity,在外界 ...
- 编写高质量代码改善C#程序的157个建议——建议106:为静态类添加静态构造函数
建议106:为静态类添加静态构造函数 静态类可以拥有构造方法,这就是静态构造方法.静态构造方法与实例构造方法比较有几个自己的特点: 只被执行一次,且在第一次调用类成员之前被运行时执行. 代码无法调用它 ...
- SVN客户端--TortoiseSVN使用说明【转】
TortoiseSVN是windows下其中一个非常优秀的SVN客户端工具.通过使用它,我们可以可视化的管理我们的版本库.不过由于它只是一个客户端,所以它不能对版本库进行权限管理. TortoiseS ...
- Java对称加密算法
对称加密算法概念 加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆. 特点:算法公开.(相比非对称加密)计算量小.加密速度快.效率高. 弱点:双方都使用同样的密钥,安全性得不到保证. 常用对称加密算 ...
- scalaWindows和Linux搭建
Windows搭建 https://www.cnblogs.com/freeweb/p/5623372.html Linux搭建 https://www.cnblogs.com/freeweb/p/5 ...
- [QPlugins]概述
一个需求:显示一个窗体,并显示"Hello,World".(这个例子不一定合适) 用DELPHI 实现上面的需求非常的简单,用向导创建一个项目,同时也创建好了一个窗体,再拖一个La ...
- 从hive将数据导出到mysql(转)
从hive将数据导出到mysql http://abloz.com 2012.7.20 author:周海汉 在上一篇文章<用sqoop进行mysql和hdfs系统间的数据互导>中,提到s ...
- for和$.each 的记录
$.each(ForbidSDT, function (i, obj) { if ($(obj).val() <= 8) { alert("请输入禁止操作开始时间"); $( ...