RSA加密解密——用shell加密java解密

功能描述

使用shell opensll对明文进行RSA加密,将密文用java的RSA工具对密文解密。这应该是全网第一个同时用到shell和java的RSA加密解密教程。中间有很多坑,都踩过了,可以放心使用代码。

正确的实现流程

shell端

首先生成公钥私钥

(1)进入opensll交互

opensll

(2)生成私钥,1024为私钥长度

genrsa -out private_key.pem 1024

(3)将私钥以pkcs8的格式存储

pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out pkcs8

(4)生成公钥

rsa -in private_key.pem -pubout -out public_key.pem

整个过程如下图所示。在这个过程中生成了pkcs8、private_key.pem、 public_key.pem三个文件

编写shell加密脚本

# 初始化原始需要加密数据
data_string="1q2w3e4r"
# 把数据保存到文件中。openssl似乎只能从文件中读取数据
echo $data_string > data_string
# 对数据进行base64编码
data_base64=$(echo -n "$data_string" | base64)
# 把数据保存到文件中,方便openssl进行读取。
echo $data_base64 > data_base64
# 使用openssl rsautl加密,保存数据到encrypted_data文件
openssl rsautl -encrypt -in data_base64 -inkey public_key.pem -pubin -out encrypted_data
# 读取encrypted_data并echo输出
encrypted_data=$(<encrypted_data)
# 以原始格式打印
echo $encrypted_data
# 以base64格式打印
echo $encrypted_data |base64

下图是运行结果,如果不在 echo $encrypted_data 后面加 |base64,就会出现乱码的输出,但这并不是错误。

java端

java端使用私钥对密文解密

public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {new 我的解密().fromhalf2();
}
public void decodeRSA() throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {//获取pkcs8格式的私钥和密文final String PRIVATE_KEY_FILE = "pkcs8.pem";final String ENCRPT_BYTE_FILE = "encrypted_data";BufferedReader privateKey = new BufferedReader(new FileReader(PRIVATE_KEY_FILE));FileInputStream encryptedData =new FileInputStream(new File(ENCRPT_BYTE_FILE));String line = "";String strPrivateKey = "";//由于文件里的数据分了好几行,所以需要在读取时连接起来while((line = privateKey.readLine()) != null){strPrivateKey += line;}//由于文件里有前缀和后缀,也需要去除String strPrivKey = strPrivateKey.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "");//将私钥变为bytebyte [] privKeyByte = Base64.decodeBase64(strPrivKey.getBytes());//密文也变为bytebyte[] encryptByte=new byte[encryptedData.available()];encryptedData.read(encryptByte);encryptedData.close();PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(privKeyByte);KeyFactory kf = KeyFactory.getInstance("RSA");PrivateKey privKey = kf.generatePrivate(privKeySpec);//解密String resultStr = decrypt(encryptByte, privKey);//打印结果,但输出的是base64格式的数据,这是由于在我们在加密时用base64加密了原文System.out.println(resultStr);//解码base64。//resultStr.trim()时必要的,resultStr不止为何带换行符/nbyte[] decodedBytes = java.util.Base64.getDecoder().decode(resultStr.trim());String decodedString = new String(decodedBytes);//打印解密后的原文System.out.println(decodedString);
}public static String decrypt(byte[] text, PrivateKey key) {byte[] dectyptedText = null;try {// get an RSA cipher object and print the providerfinal Cipher cipher = Cipher.getInstance(ALGORITHM);// decrypt the text using the private keycipher.init(Cipher.DECRYPT_MODE, key);dectyptedText = cipher.doFinal(text);} catch (Exception ex) {ex.printStackTrace();}return new String(dectyptedText);
}

出现的各种问题(后续更新)

(1)每次生成的密文都不一样

密文不一样是正常现象

参考文献

利用openssl生成RSA公钥和私钥_基于 openssl 生成 1024 位的 rsa 公钥-私钥对-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/587373.shtml

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

相关文章

【华为机试】2023年真题B卷(python)-冠亚军排名-奖牌榜排名

一、题目 题目描述&#xff1a; 2012伦敦奥运会即将到来&#xff0c;大家都非常关注奖牌榜的情况&#xff0c;现在我们假设奖牌榜的排名规则如下. 1.首先gold medal数量多的排在前面 2.其次silver medal数量多的排在前面 3.然后bronze medal数量多的排在前面 4.若以上三个条…

【数据结构】栈和队列(栈的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 目录 前言 栈 栈的概念和结构 栈的实现 ​…

【时钟】分布式时钟HLC|Logical Time|Vector Clock|True Time

目录 简略 详细 附录 1 分布式系统不能使用NTP的原因 简略 分布式系统中不同于单机系统不能使用NTP(网络时间协议&#xff08;Network Time Protocol&#xff09;)来获取时间&#xff0c;所以我们需要一个特别的方式来获取分布式系统中的时间&#xff0c;mvcc也是使用time保证读…

信号处理设计模式

问题 如何编写信号安全的应用程序&#xff1f; Linux 应用程序安全性讨论 场景一&#xff1a;不需要处理信号 应用程序实现单一功能&#xff0c;不需要关注信号 如&#xff1a;数据处理程序&#xff0c;文件加密程序&#xff0c;科学计算程序 场景二&#xff1a;需要处理信…

HTML---利用CSS3制作网页动画

文章目录 目录 文章目录 本章目标 一.CSS3概述 CSS函数概述 二.CSS3变形 transform属性 translate()&#xff1a;平移函数 scale()&#xff1a;缩放函数 rotate()&#xff1a;旋转函数 skew()&#xff1a;倾斜函数 三.CSS3过渡 四.CSS动画 练习 旋转按钮 本章目标 会使用…

“从零到一“基于Freeswitch二次开发: 应用架构设计(二)

一、架构分享 上一篇文章“从零到一“基于Freeswitch二次开发:Freeswitch入门与网络架构 (一) 对Freeswitch二次开发做了一个介绍&#xff0c;距离这篇文章的发布时间有点久了&#xff0c;之前一直没时间把下文补上来。正好到了年末想起来&#xff0c;就把我们的一个实现架构进…

深度神经网络结构

单层的感知机不能解决“异或”问题。 在前面分别介绍了M-P神经元模型和感知机模型。在M-P神经元模型中&#xff0c;神经元接收到若干个输入信号&#xff0c;并将计算得到的加权后的总输入&#xff0c;经过激活函数的处理&#xff0c;最终产生神经元的输出。而感知机模型则由两层…

腾讯云标准型S5服务器2核2G、2核4G和4核8G五年机来了

腾讯云五年特价服务器来了&#xff0c;标准型S5云服务器&#xff0c;可选2核2G、2核4G和4核8G配置&#xff0c;一次性购买五年低至2折&#xff0c;免去续费贵烦恼。腾讯云百科txybk.com分享腾讯云5年服务器特价优惠活动、购买条件、云服务器配置及优惠价格&#xff1a; 腾讯云五…

linux文件夹介绍

在linux内核文件夹下面存在着许多文件夹&#xff0c;那么那些文件夹是什么用处呢&#xff0c;下面将为你介绍。 (1)documentation 这个文件夹下没有内核代码&#xff0c;仅仅有一套实用的文档&#xff0c;但这些文档的质量不一。比如内核文档的文件系统&#xff0c;在该文件夹下…

计算机网络——传输层(五)

前言&#xff1a; 最重要的网络层我们已经学习完了&#xff0c;下面让我们再往上一层&#xff0c;对网络层的上一层传输层进行一个学习与了解&#xff0c;学习网络层的基本概念和网络层中的TCP协议和UDP协议 目录 ​编辑一、传输层的概述&#xff1a; 1.传输层&#xff1a; …

leetcode 315. 计算右侧小于当前元素的个数(hard)【小林优质解法】

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {int[]counts; //用来存储结果int[]index; //用来绑定数据和原下标int[]helpNums; //用于辅助排序 nums 数组int[]helpIndex; //用于辅助排序 i…

《Linux系统与网络管理》复习题库---shell编程题

1、shell 编程题&#xff1a;在根目录下有四个文件 m1.c&#xff0c;m2.c&#xff0c;m3.c&#xff0c;m4.c&#xff0c;用 Shell 编程&#xff0c;实现自动创建 m1,m2,m3,m4 四个目录&#xff0c;并将 m1.c,m2.c,m3.c,m4.c 四个文件分别剪贴到各自相应的目录下。 #!/bin/bash…

go module本地包导入

go module本地包导入 本文目录 go module本地包导入启用go mod主项目工作目录本地module目录发布和使用模块 golang 1.11之后加入了go mod来替代GOPATH 官方文档参考&#xff1a;https://golang.google.cn/doc/tutorial/call-module-code 启用go mod 开启 Go modules # 临时开…

【谭浩强C程序设计精讲 5】运算符和表达式

文章目录 3.3 运算符和表达式3.3.1 C运算符3.3.2 基本的算术运算符3.3.3 自增&#xff08;&#xff09;、自减&#xff08;--&#xff09;运算符3.3.4 算术表达式和运算符的优先级与结合性3.3.5 不同类型数据间的混合运算3.3.6 强制类型转换运算符 3.3 运算符和表达式 3.3.1 C…

【Java】一文讲解Java类加载机制

Java 类加载机制是 Java 运行时的核心组成部分&#xff0c;负责在程序运行过程中动态加载和连接类文件&#xff0c;并将其转换为可执行代码。理解类加载机制&#xff0c;能更容易理解你一行行敲下的Java代码是如何在JVM虚拟机上运行起来。并且理解类加载机制之后&#xff0c;我…

DevOps持续交付之容器化CICD流水线

DevOps持续交付 随着DevOps⼤规模化的落地和应⽤&#xff0c;持续集成以及持续交付已经是⼀种常态的。CI指的是持续集成&#xff0c;使⽤的开源⼯具是Jenkins&#xff0c;CD指的是持续交付和持续部署&#xff0c;⼀个完整的软件开发⽣命周期为: 主要流程可以具体为: 构建阶段…

CA和证书

安全机制 墨菲定律 如果有两种选择&#xff0c;其中一种将导致灾难&#xff0c;则必定有人会作出这种选择。即&#xff1a;做事不要有侥幸心理。 常用安全技术 认证、授权、审计、安全通信 加密算法和协议 对称加密算法 加密和解密使用同一个秘钥。 特性 加密、解密使…

Python+OpenCV 零基础学习笔记(1-3):anaconda+vscode+jupyter环境配置

文章目录 前言相关链接环境配置&#xff1a;AnacondaPython配置OpenCVOpencv-contrib:Opencv扩展 Notebook:python代码笔记vscode配置配置AnacondaJupyter文件导出 前言 作为一个C# 上位机&#xff0c;我认为上位机的终点就是机器视觉运动控制。最近学了会Halcon发现机器视觉还…

修改css、html后前端没有刷新的解决方法(图文)

修改css、html后前端没有刷新的解决方法&#xff08;图文&#xff09; 修改css、html后前端没有刷新的原因和图文解决方法 1 原因 网页的缓存机制 2 解决方法 禁用网页缓存&#xff0c;具体操作如下 打开F12网络选项勾选禁用缓存。此时再刷新页面即可实时更新 以上就是全…

元旦档首日票房超4.69亿,“下雪场尴尬”上热搜!

哇塞&#xff0c;元旦假期终于来啦&#xff01;&#x1f389;在这个喜庆的时刻&#xff0c;电影院也热闹非凡&#xff0c;据猫眼专业版数据显示&#xff0c;截至12月30日&#xff0c;2023年元旦档首日票房竟然超过了4.69亿&#xff01;这简直是个天文数字啊&#xff01;&#x…