RSA私钥解密操作

news2024/11/26 8:28:58

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 format
	at 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.coloradmin.cn/o/941023.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-Python机器学习 - AdaBoost函数

它是最成功的增强集成算法之一。该算法的主要关键在于它们对数据集中的赋予权重的方式。因此,在构建后续模型时,该算法无需过多关注。 在以下Python配方中,我们将通过使用Pima Indians糖尿病数据集上的 sklearn 的 AdaBoostClassifier 类来构建用于分类的Ada Boost集成模型。 …

【计算机基础】一文带你了解 Linux

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…

【DevOps视频笔记】6 - 7. Jenkins 介绍 和 安装

一、Integrate 工具 二、Jenkins 介绍 1. Jenkins 最主要的工作 2. CI / CD 可以理解为: 2.1 CI 过程 2.2 CD 过程 三、Jenkins 安装 1. 安装准备工作 2. 安装 Jenkins Stage 1:拉取 jenkins 镜像 Stage 2:编写docker-compose.yml St…

Postgresql的一个bug_涉及归档和pg_wal

故障描述: 服务器ocmpgdbprod1,是流复制主节点,它的从节点是ocmpgdbprod2,两个节点的Postgresql数据库版本都是PostgreSQL 11.6,主节点ocmpgdbprod1配置了pg_wal归档,从节点ocmpgdbprod2没有配置pg_wal归档…

雅思作文复习

目录 我使用的词汇: 上升: 下降: 波动: 保持: 幅度 大变化: 小变化: 雅思评价标准改变 小作文一般花费20分钟,我觉得自己能在18分钟解决是最好 考生在雅思考试中的小作文&a…

kali的学习

网络配置 1.kali的网络设置 首先我们了解kali的网络设置 DHCP:动态主机配置协议 是一个局域网的协议 使用UDP 协议工作静态IP:用于大部分的中小型网络 通过网络管理员手动分配IP原理进程 /etc 系统大部分服务启动过程都要访问该目录 我们直接去看看…

高效便捷的法律咨询小程序的设计与实践

现如今,随着智能手机的普及和移动互联网的发展,小程序成为了一种新兴的应用形式。对于律师事务所来说,开发一款专属的法律咨询小程序,无疑可以为客户提供更加便捷和高效的服务。那么,对于初次接触小程序制作的新手来说…

spring:AOP面向切面编程+事务管理

目录 一、Aop( Aspect Oriented Programming) 二、springAOP实现 1.XML实现 2.注解实现 三、spring事务管理 一、Aop( Aspect Oriented Programming) 将程序中的非业务代码抽取,使非业务代码与业务代码相隔离,为目标类创建一个代理对象让代理对象调用…

【C++初阶】stack的常见操作和模拟实现

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

LNMT动静分离+keepalived

目录 前言 一、实验拓扑 二、配置tomcat 三、nfs配置 四、配置NGINX 五、配置NGINX的双机热备 六、验证双机热备 前言 LNMT动静分离是指在LNMT架构中使用动静分离技术,将动态请求和静态请求分开处理和分发,以提高性能和可扩展性。这种架构使用Nginx…

在GPU服务器(Linux)上安装Anaconda和PyTorch环境

安装Anaconda3 Anaconda官网&#xff1a;https://repo.anaconda.com/archive/ 根据自己需要&#xff0c;复制安装包名字&#xff0c;以Anaconda3-2023.07-2-Linux-x86_64.sh为例 命名规则&#xff1a;Anaconda3-<版本号>-Linux-x86_64.sh 在终端输入命令&#xff0c;下…

设备分类、设备号申请和注销

一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件d&#xff1a;目录文件p&#xff1a;管道文件s&#xff1a;本地socket文件l&#xff1a;链接文件c&#xff1a;字符设备b&#xff1a;块设备 Linux内核按驱动程序实现模型框架的不同&#xff0…

JSX底层渲染机制

JSX底层渲染机制 一,.步骤 1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象&#xff1a;框架自己内部构建的一套对象体系&#xff08;对象的相关成员都是React内部绑定的&#xff09;&#xff0c;基于这些属性描述出我们所构建视图中的DOM接的相关特征 1基于ba…

【crypto++使用】使用crypto++库函数运行RSA非对称加密

系列文章目录 1.&#xff08;全网最详细攻略&#xff09;【Crypto】在Visual studio2022中运行Cryptopp 文章目录 系列文章目录前言一、RSA加密过程、步骤可学习的网址 二、代码部分1.visual studio编程注意一个标准案例提供给大家 2.RSA密钥生成思考&#xff1a; 3.关于RSA的…

计算机视觉-卷积神经网络

目录 计算机视觉的发展历程 卷积神经网络 卷积&#xff08;Convolution&#xff09; 卷积计算 感受野&#xff08;Receptive Field&#xff09; 步幅&#xff08;stride&#xff09; 感受野&#xff08;Receptive Field&#xff09; 多输入通道、多输出通道和批量操作 …

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种&#xff0c;直连交换机、广播交换机、主题交换机&#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定&#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可&#xff1b; 主题交换机最大的特…

dml dql 约束 数据库设计

dml 1.添加数据 *语法 &#xff1a; *insert into 表名&#xff08;列名1&#xff0c;列名2&#xff0c;……..列名n&#xff09;values(值1&#xff0c;值2&#xff0c;…值n) *注意&#xff1a; 1.列名和值要一一对应 2.如果表名后&#xff0c;不写列名&#xff0c;就要给…

QT 获取程序编译时间并且转化格式

前言 有的时候我们要在程序的关于界面加上程序的编译时间等信息。可以通过如下代码实现 QString buildTime QStringLiteral("%1 %2").arg(__DATE__).arg(__TIME__);ui->label->setText(buildTime);QDateTime dateTime QLocale("en_US").toDateTim…

easyx图形库6:实现飞机大战:

飞机大战 一.飞机大战的基本窗体&#xff1a;二.飞机大战的主要战斗场景元素&#xff1a;一.透明图片&#xff1a;二.精灵对象&#xff1a; 三.主游戏场景的元素&#xff1a;1.英雄飞机的结构体定义&#xff1a;2.英雄飞机的代码实现&#xff1a;3.游戏背景的结构体定义&#x…

Day5:react函数组件与类组件

「目标」: 持续输出&#xff01;每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 「主要面向群体&#xff1a;」前端开发工程师&#xff08;初、中、高级&#xff09;、应届、转行、培训、自学等同学 Day4-今日话题 react「函数组件和类组件」的区别&…