本人手写已测试,大家可以参考使用

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的更多相关文章

  1. RSA加解密工具类RSAUtils.java,实现公钥加密私钥解密和私钥解密公钥解密

    package com.geostar.gfstack.cas.util; import org.apache.commons.codec.binary.Base64; import javax.cr ...

  2. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  3. C# 中使用 RSA加解密算法

    一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...

  4. 与非java语言使用RSA加解密遇到的问题:algid parse error, not a sequence

    遇到的问题 在一个与Ruby语言对接的项目中,决定使用RSA算法来作为数据传输的加密与签名算法.但是,在使用Ruby生成后给我的私钥时,却发生了异常:IOException: algid parse ...

  5. 前后端java+vue 实现rsa 加解密与摘要签名算法

    RSA 加密.解密.签名.验签.摘要,前后端java+vue联调测试通过 直接上代码 // 注意:加密密文与签名都是唯一的,不会变化.// 注意:vue 端密钥都要带pem格式.java 不要带pem ...

  6. Lua 中的 RSA 加解密实现

    记得之前,部门某款游戏陆陆续续收到一些玩家反馈,抱怨在登录游戏时会等待很久.初步排查后基本断定可能是此游戏的登录服务器程序某块代码有问题,于是即安排了服务器同事作排查分析但一直无果. 之后我时间有了空 ...

  7. Java中的AES加解密

    直接上代码,Base64使用的是Java8的方法,如没有,替换即可 KEY:即密码 IV:即偏移量,可自订,十六位 加密方式:AES/CBC/PKCS5Padding,128位加密 如果想用256位和 ...

  8. VUE+webpack+npm项目中的RSA加解密

    一.安装jsencrypt npm i jsencrypt node_modules文件夹中出现jsencrypt 二.引入jsencrypt 在main.js中import: import JsEn ...

  9. Vue项目中的RSA加解密

    前后端使用rsa加密:  一般是客户端初始化时访问登录服务时,服务端面动态生成一对RSA对,公钥传给客户端,客户端拿到后,用户输入密码后,点登录时用公钥加密返回给服务端,服务端用私钥解就行了 一.安装 ...

随机推荐

  1. CMDB和运维自动化

    IT运维,指的是对已经搭建好的网络,软件,硬件进行维护.运维领域也是有细分的,有硬件运维和软件运维 硬件运维主要包括对基础设施的运维,比如机房的设备,主机的硬盘,内存这些物理设备的维护 软件运维主要包 ...

  2. Ubuntu14.04 下安装Vmware-Tools

    1.切换到ubuntu 图形界面 startx , 点击虚拟机菜单栏-安装VMware Tools 2. 在Ubuntu系统中找到VMwareTools-9.2.2-893683.tar.gz ,右键 ...

  3. 3.1.2 condition 条件

    package 第三章.重入锁; import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Reent ...

  4. 用nodejs搭建最简单、轻量化的http server(转)

    出处:http://www.cnblogs.com/wangfupeng1988/p/4143996.html 1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后 ...

  5. [GO]文件的读写

    首先写一个文件 package main import ( "os" "fmt" ) func WriteFile(path string) { //打开文件, ...

  6. [GO]空接口

    package main import "fmt" //空接口的实际意义就在于在使用函数时,空接口可以接收任意类型的值,类似于python中的*args, **kwargs fun ...

  7. (转)Linux下安装Android的adb驱动-解决不能识别的问题(国产板子)

    注:本文不涉及怎么安装adb等工具.本方法通用.到目前为止已经解决rk3188和展讯SC6820(波导T9500)的识别问题. 以前调试的Android板子,都是直接用的Google的usb设备id, ...

  8. 部署图像深度学习Web网站

    1. 内网穿透 2. 深度学习Web化 https://www.cnblogs.com/haolujun/p/9778939.html

  9. servlet及xml文件处理流程

    启动项目----会找到web.xml文件---跳转到默认jsp----页面重定向----转到xml.文件下 通过<servlet-mapping>映射找到<servlet>标签 ...

  10. requestAnimationFrame 定时器

    这个方法是通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并 ...