Java使用RSA的公钥加密,私钥解密;私钥加密,公钥解密

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;/*** @author gggcgba 【wechat:13031016567】* 2021/5/17 0017**/
public class RSAEncrypt_CSDN {private static final Logger log = LoggerFactory.getLogger(RSAEncrypt_CSDN.class);private static final String PUBLIC_KEY="publicKey";private static final String PRIVATE_KEY="privateKey";public static void main(String[] args) throws Exception {//随机生成公钥和秘钥Map<String, String> keyMap = genKeyPair();System.out.println("随机公钥:"+keyMap.get(PUBLIC_KEY));System.out.println("随机私钥:"+keyMap.get(PRIVATE_KEY));String publicKey = keyMap.get(PUBLIC_KEY);String privateKey = keyMap.get(PRIVATE_KEY);//加密字符串String message = "{\"allBillList\":[{\"id\":\"264786\",\"billNo\":\"WB2021051700064\",\"billTypeId\":13,\"billTypeName\":\"定损维修\",\"vehicleNo\":\"京Q683976\",\"vehicleId\":\"532928\",\"vehicleOwner\":\"北京测试公司\",\"vehicleModelName\":\"宝马\",\"orderCar\":0,\"orderCarName\":\"短租\",\"cityId\":null,\"cityName\":\"北京\",\"deptId\":null,\"deptName\":\"北京测试\",\"nowCityId\":null,\"nowCityName\":null,\"nowDeptId\":null,\"nowDeptName\":null,\"belongCityId\":null,\"belongCityName\":\"北京\",\"belongDeptId\":null,\"belongDeptName\":\"知春路店\",\"costBelongAreaName\":\"知春路大片区\",\"costBelongCityName\":\"北京\",\"costBelongDeptName\":\"知春路店\",\"createTime\":\"2021-05-17 10:11\",\"modifyTime\":null,\"billStatusId\":109,\"billStatusName\":\"方案已通过\",\"createEmpName\":\"JD\",\"createEmpDeptName\":\"北京测试\",\"pickupType\":2,\"pickupTypeName\":\"上门\",\"isDelete\":0,\"isDeleteeName\":\"否\",\"garageId\":null}],\"totalCount\":1}";System.out.println("前端请求的原数据:"+message);String messageEn = publicKeyEncrypt(message, publicKey);System.out.println("前端请求的加密:" + messageEn);String messageDe = privateKeyDecrypt(messageEn, privateKey);System.out.println("后端解密出来的数据:" + messageDe);System.out.println("==========================================");//前端数据展示处理//私钥加密,公钥解密String s = privateKeyEncrypt(messageDe, privateKey);System.out.println("后端返回的加密数据:"+s);String s1 = publicKeyDecrypt(s, publicKey);System.out.println("前端解密出来显示的数据:"+s1);}/*** 功能描述:* 〈随机生成密钥对〉** @return : java.util.Map<java.lang.String,java.lang.String>* @author gggcgba 【wechat:13031016567】* @date : 2021/5/17 0017 17:38*/public static Map<String, String> genKeyPair() throws NoSuchAlgorithmException {System.out.println("开始生成公钥私钥对");// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");// 初始化密钥对生成器,密钥大小为96-1024位keyPairGen.initialize(1024, new SecureRandom());// 生成一个密钥对,保存在keyPair中KeyPair keyPair = keyPairGen.generateKeyPair();RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();    // 得到私钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();        // 得到公钥String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));// 得到私钥字符串String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));// 将公钥和私钥保存到MapMap<String, String> map = new HashMap<>();map.put(PUBLIC_KEY, publicKeyString);map.put(PRIVATE_KEY, privateKeyString);return map;}/*** RSA私钥加密** @author gggcgba 【wechat:13031016567】* @param str* @param privateKey* @return* @throws Exception*/public static String privateKeyEncrypt(String str, String privateKey) throws Exception {log.info("{}|RSA私钥加密前的数据|str:{}|publicKey:{}",str);//base64编码的公钥byte[] decoded = Base64.decodeBase64(privateKey);PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, priKey);//当长度过长的时候,需要分割后加密 117个字节byte[] resultBytes = getMaxResultEncrypt(str, cipher);String outStr = Base64.encodeBase64String(resultBytes);log.info("{}|RSA私钥加密后的数据|outStr:{}",outStr);return outStr;}/*** RSA公钥解密** @author gggcgba 【wechat:13031016567】* @param str* @param publicKey* @return* @throws Exception*/public static String publicKeyDecrypt(String str, String publicKey) throws Exception {log.info("{}|RSA公钥解密前的数据|str:{}|publicKey:{}",str);//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(publicKey);PublicKey pubKey =  KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, pubKey);//当长度过长的时候,需要分割后解密 128个字节String outStr = new String(getMaxResultDecrypt(str, cipher));log.info("{}|RSA公钥解密后的数据|outStr:{}",outStr);return outStr;}/*** RSA公钥加密*** @author gggcgba 【wechat:13031016567】* @param str       加密字符串* @param publicKey 公钥* @return 密文* @throws Exception 加密过程中的异常信息*/public static String publicKeyEncrypt(String str, String publicKey) throws Exception {log.info("{}|RSA公钥加密前的数据|str:{}|publicKey:{}", str);//base64编码的公钥byte[] decoded = Base64.decodeBase64(publicKey);RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, pubKey);//当长度过长的时候,需要分割后加密 117个字节byte[] resultBytes = getMaxResultEncrypt(str, cipher);String outStr = Base64.encodeBase64String(resultBytes);log.info("{}|公钥加密后的数据|outStr:{}", outStr);return outStr;}private static byte[] getMaxResultEncrypt(String str, Cipher cipher) throws IllegalBlockSizeException, BadPaddingException {byte[] inputArray = str.getBytes();int inputLength = inputArray.length;log.info("{}|加密字节数|inputLength:{}", inputLength);// 最大加密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 117;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}/*** RSA私钥解密** @author gggcgba 【wechat:13031016567】* @param str        加密字符串* @param privateKey 私钥* @return 铭文* @throws Exception 解密过程中的异常信息*/public static String privateKeyDecrypt(String str, String privateKey) throws Exception {log.info("{}|RSA私钥解密前的数据|str:{}|privateKey:{}", str);//64位解码加密后的字符串byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));//base64编码的私钥byte[] decoded = Base64.decodeBase64(privateKey);RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);
//        String outStr = new String(cipher.doFinal(inputByte));//当长度过长的时候,需要分割后解密 128个字节String outStr = new String(getMaxResultDecrypt(str, cipher));log.info("{}|RSA私钥解密后的数据|outStr:{}", outStr);return outStr;}private static byte[] getMaxResultDecrypt(String str, Cipher cipher) throws IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {byte[] inputArray = Base64.decodeBase64(str.getBytes("UTF-8"));int inputLength = inputArray.length;log.info("{}|解密字节数|inputLength:{}", inputLength);// 最大解密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 128;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}
}

前端一般使用公钥加密,后端一般使用私钥解密.

因为公钥是公开的,很多人可以持有公钥。若用私钥加密,那所有持有公钥的人都可以进行解密,这是不安全的!
若用公钥加密,那只能由私钥解密,而私钥是私有不公开的,只能由特定的私钥持有人解密,保证的数据的安全性。

Java使用RSA进行加密解密【完美版本】;Data must not be longer than 117 bytes【不报此错误】相关推荐

  1. RSA加密内容过长导致抛异常javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

    在进行对内容加密时发现内容长度过长就会导致Data must not be longer than 117 bytes的问题,后来百度的一番才得知由于是RSA的加密长度只能加密117bytes的内容, ...

  2. Java实现RSA分段加密解密

    本文完成的是公钥加密,私钥解密(私钥加密公钥解密是一样的). 注意点: 秘钥生成的格式不同,使用算法也不同,公钥是X509EncodedKeySpec,私钥是PKCS8EncodedKeySpec. ...

  3. Java实现RSA 2048加密解密

    文章目录 生成RSA公钥和密钥 编写RSA加密解密类 生成RSA公钥和密钥 openssl genrsa -out rsa_private_key_2048.pem 2048 # 生成rsa私钥,X5 ...

  4. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

  5. java rsa 117_java实现RSA非对称加密解密

    之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...

  6. RSA分段加密/解密 nodejs 和java联调

    RSA分段加密/解密 nodejs 和java联调 文章目录 RSA分段加密/解密 nodejs 和java联调 1 nodejs 环境 1.1 axios配置 1.2 API接口 1.3 业务 1. ...

  7. [转]JAVA与.NET DES加密解密

    [转]原文地址:http://www.cnblogs.com/prince3245/archive/2010/03/23/1692630.html JAVA与.NET DES加密解密 前几天做了个项目 ...

  8. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  9. 加密解密_使用RSA密钥对加密解密数据

    使用RSA密钥对加密解密数据 作者: 郭政鸿 2021/1/6 前言: 前几天看了非对称加密, 那非对称加密处理常见的https中的应用, 平时我们可以用来做什么呢? 1. 生成RSA密钥对 使用op ...

最新文章

  1. 独家 | 一文解析统计学在机器学习中的重要性(附学习资源)
  2. 报告 | 数字孪生城市研究报告(2019年)
  3. SaltStack(五) SaltStack与ZeroMQ
  4. buffer sort Oracle,[转]BUFFER SORT是BUFFER却不是SORT
  5. 【Minimum Depth of Binary Tree】cpp
  6. 前端学习(2033)vue之电商管理系统电商系统之通过路由加载报表
  7. django mysql 2059_Django mysqlclient后端生成django.db.utils。操作错误:(2059,NULL)在Windows中...
  8. TortoiseSVN修改服务器地址
  9. Jmeter之Constant Timer与constant throughput timer的区别
  10. python机器人开发学校,机器人Python青少年编程开发实例
  11. Hibernate框架(一)——总体介绍
  12. mysql 服务器配置信息和运行状态的查看(show variables like)
  13. 关闭Cadence Orcad Capture CIS原理图弹出startpage页面的方法
  14. HDR高动态范围成像
  15. 七脉轮位置_十分钟告诉你七个脉轮的全部,从未如此简单
  16. CSS 样式书写顺序及规范
  17. 如何让C盘可用空间变大
  18. 互联网年终奖出炉,腾讯多个核心G,10个月打底,华为人均分红47.6w,虾皮 B绩效0.5个月,网友:羡慕哭了!...
  19. 给你一个全新的软件,你就是负责人,你怎么去开展工作
  20. Reinforcement learning-强化学习基础

热门文章

  1. 黑马程序员—关于黑马,关于学习,关于求职,关于工作
  2. xml中[CDATA[]]浅解
  3. 每日学到 25 - 抽象类和接口
  4. Java中Scanner详细用法
  5. 几种连续型随机变量分布总结
  6. dubbo multicast 连接失败解决方案
  7. 数据包络分析-二阶段网络带feedback(第二篇)
  8. 什么是「文本基因计划」?
  9. 使用 charts.js、flot-charts、Echarts图表插件。
  10. 程序设计与算法(三)第09周测验(2020春季)