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-->PublicKeybyte[] 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-->PrivateKeybyte[] 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 -----
转载于:https://www.cnblogs.com/wrcold520/p/8630882.html
Java中的RSA加解密工具类:RSAUtils相关推荐
- java aes 工具类_Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
- RSA加解密工具类(PKCS8公钥加密,PKCS1私钥解密)
场景:如果项目上生成的秘钥,公钥是PKCS8格式,私钥却是PKCS1格式.需要在这种场景加解密的话可以直接使用下面工具类. 依赖 <dependency><groupId>or ...
- 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥
测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...
- 密钥生成工具类:RSA2 256位 加解密工具类 RsaUtils
import java.io.IOException; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; i ...
- rsa java ao_RSA加解密工具类
Java 实现 import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairG ...
- Java各种方式加解密工具类
文章目录 前言 1.AES 2.DES 3.BCrypt 4.Http Basic 5.MD5 6.RSA 7.SHA256 8.SM3 9.SM4 前言 JAVA能够实现各种加解密方式,这里对各种加 ...
- 阿里云专属KMS信封加解密工具类
此工具类主要实现,字符串的加密,输出为Base64编码的字符串.字符串的解密,输入为Base64编码的字符串.工具类里的IV向量参数,需要用户自己保存,工具类中是默认写死在代码中的,并不规范.IV向量 ...
- 国密算法-SM4加解密工具类
import cn.hutool.crypto.symmetric.SymmetricCrypto;/*** @author : chenfan* @className : SM4Utils* @da ...
- 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence
遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...
最新文章
- apache一个ip多个端口虚拟主机
- IDEA2021.03 项目全部变红,但是可以正常编译运行
- react使用setState注意事项
- Intent Bundle页面跳转信息的传递
- 我身边的手机应用开发者
- 【Git】Git修改Repository语言类型
- 漫画:云市场下,运营商甲方爸爸也出来抢乙方生意了?
- 2440 linux文件写,添加yaffs2文件系统 - Linux2.6.39在S3C2440上的移植_Linux编程_Linux公社-Linux系统门户网站...
- 【jQuery笔记Part2】02-jQuery展开收起动画帷幔效果案例下拉菜单案例显示隐藏更多案例折叠菜单案例
- HashMap遍历有序性问题——map.entrySet()的无序性
- [置顶] Jquery实现网页marquee效果
- 如何在 Mac 上打开或关闭专注模式?
- [论文]基于强化学习的控制输入非线性水下机器人自适应神经网络控制
- Nifi Api访问
- 你只管打开这个视频,剩下的交给「卧槽」
- 银联携手酷客多协助百万商家上线小程序
- 特征选择方法-统计方法
- 知乎高赞:电气工程专业学生的最好归宿在哪里?
- plus project的mpp文件导出问题和plus project的xml导出
- 怎么样在家拍出好看的证件照?标准证件照拍摄技巧分享