当前位置: 首页 > news >正文

RSA私钥解密操作

RSA私钥解密操作

  • 一、背景
  • 二、操作
  • 三、常见问题
    • 3.1 invalid key format
    • 3.2 解密的数据太长
    • 3.3 Decryption error

一、背景

项目数据库中存放的敏感字段已使用rsa加密的方式,将内容加密成密文存放,
现在需要在使用的时候,使用私钥进行解密。

二、操作

代码如下:

public class RsaUtil {private static final int MAX_DECRYPT_BLOCK = 256;/*** 解密方法* @param content  需解密内容* @param privateKey 私钥* @return*/public static String decryptByPrivateKey(String content,String privateKey) {String decryptContent;try {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));PrivateKey priKey  = KeyFactory.getInstance("RSA").generatePrivate(keySpec);//RSA解密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, priKey);log.info("provider:{}",cipher.getProvider());byte[] encryptedData = Base64.getDecoder().decode(content);int inputLen = encryptedData.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;// 对数据分段解密while (inputLen - offSet > 0) {if (inputLen - offSet > MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);} else {cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * MAX_DECRYPT_BLOCK;}out.close();decryptContent = out.toString();} catch (Exception e){log.error("rsa解密内容:"+content+"失败",e);throw new RsaException("rsa解密内容:"+content+"失败",e);}return decryptContent;}}

三、常见问题

3.1 invalid key format

错误信息如下:

Caused by: java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key formatat sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)

原因:
私钥转成byte数组时没有使用base64解码的方式:
在这里插入图片描述

3.2 解密的数据太长

参考文章:
https://blog.csdn.net/qq_42795685/article/details/107517196

错误信息如下:

IllegalBlockSizeException: Data must not be longer than 256 bytes

解决:
采用分段解密的方式。具体请参考代码中分段解密注释的部分

3.3 Decryption error

参考文章:

  1. https://blog.csdn.net/a1017680279/article/details/79061412?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-79061412-blog-71627949.235%5Ev38%5Epc_relevant_anti_vip_base&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-79061412-blog-71627949.235%5Ev38%5Epc_relevant_anti_vip_base&utm_relevant_index=1

  2. https://juejin.cn/post/7182388540259450940

错误信息:

javax.crypto.BadPaddingException: Decryption error

原因:
代码中采取分段解密的方式时,配置的最大解密长度不正确,即以上代码中的MAX_DECRYPT_BLOCK 变量配置长度有问题;

解决:
MAX_DECRYPT_BLOCK应等于密钥长度/8(1byte=8bit),
“密钥长度”一般只是指模值的位长度。目前主流可选值:1024、2048、3072、4096,
我使用的密钥长度是2048,所以配置的最大解密长度应该是256。

http://www.lryc.cn/news/143503.html

相关文章:

  • 数据库基本知识
  • 使用Redis统计网站的UV/DAU
  • 【python】报错:ImportError: DLL load failed: 找不到指定的模块 的详细解决办法
  • SemrushBot蜘蛛爬虫屏蔽方式
  • 6 ssh面密登录
  • 基于微信小程序的汽车租赁系统的设计与实现ljx7y
  • 优化学习体验的在线考试系统
  • 1267. 统计参与通信的服务器
  • 【考研数学】矩阵、向量与线性方程组解的关系梳理与讨论
  • 打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问
  • FFI绕过disable_functions
  • 53 个 CSS 特效 2
  • ubuntu学习(六)----文件编程实现cp指令
  • wireshark过滤器的使用
  • Zookeeper 脑裂问题
  • 计算机网络高频面试题解(一)
  • 从0-1的docker镜像服务构建
  • RabbitMQ、Kafka、RocketMQ:特点和适用场景对比
  • 【实战】十一、看板页面及任务组页面开发(四) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十六)
  • 解决docker无法执行定时任务问题
  • 【FreeRTOS】【STM32】中断详细介绍
  • stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)
  • 计算机毕设 基于机器学习与大数据的糖尿病预测
  • 【数据结构】——查找、散列表的相关习题
  • 提升Java开发效率:掌握HashMap的常见方法与基本原理
  • PostgreSQL系统概述
  • 掌握AI助手的魔法工具:解密Prompt(提示)在AIGC时代的应用「中篇」
  • git svn:使用 git 命令来管理 svn 仓库
  • 软考高级系统架构设计师系列论文九十一:论分布式数据库的设计与实现
  • GeoHash之存储篇