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.hqwc.cn/news/309614.html

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

相关文章

[数据结构]树与二叉树的性质

文章目录 0.二叉树的形态和基本性质1.完全二叉树的叶子节点个数2.树的叶子节点个数3.线索二叉树4.树和森林和二叉树5.平衡二叉树的最少结点数6.树/二叉树/森林的转换 0.二叉树的形态和基本性质 一棵二叉树具有5中基本形态n个结点可以构造的二叉树种数: C2n-n/n1 一棵树 n个结点…

项目记录:利用Redis实现缓存以提升查询效率

一、概述 当我们查询所有数据时&#xff0c;如果缓存中没有&#xff0c;则去数据库查询&#xff0c;如果有&#xff0c;直接查缓存的数据就行。注意定期更新缓存数据。 二、主体代码 private static final String ROOM_SCHEDULES_HASH "RoomSchedules";Overridepu…

【十】【C语言\动态规划】376. 摆动序列、673. 最长递增子序列的个数、646. 最长数对链,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

微信小程序开发系列-08自定义组件模版特性

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

红队打靶练习:MISDIRECTION: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

自动驾驶学习笔记(二十三)——车辆控制模型

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo开放平台9.0专项技术公开课》免费报名—>传送门 文章目录 前言 运动学模型 动力学模型 总结…

基于ssm的二手商品交易平台+vue论文

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

《深入理解C++11:C++11新特性解析与应用》笔记五

第五章 提高类型安全 5.1 强类型枚举 5.1.1 枚举&#xff1a;分门别类与数值的名字 具名枚举类型一般声明类似&#xff1a;enum Gender { Male, Female }。 匿名枚举类型可以使用三种方式实现&#xff1a; 第一种方式时宏&#xff0c;比如 #define Male 0 #define Femal…

SpringBoot项目部署及多环境

1、多环境 2、项目部署上线 原始前端 / 后端项目宝塔Linux容器容器平台 3、前后端联调 4、项目扩展和规划 多环境 程序员鱼皮-参考文章 本地开发&#xff1a;localhost&#xff08;127.0.0.1&#xff09; 多环境&#xff1a;指同一套项目代码在把不同的阶段需要根据实际…

【Electron】webview 实现网页内嵌

实现效果&#xff1a; 当在输入框内输入某个网址后并点击button按钮 , 该网址内容就展示到下面 踩到的坑&#xff1a;之前通过web技术实现 iframe 标签内嵌会出现 同源策略&#xff0c;同时尝试过 vue.config.ts 内配置跨域项 那样确实 是实现啦 但不知道如何动态切换 tagert …

Java动态代理机制 代码示例demo

文章目录 JDK动态代理代码实现示例1.定义发送短信的接口2.实现发送短信的接口3.定义一个 JDK 动态代理类4.获取代理对象的工厂类5.实际使用 JDK 动态代理只能代理实现了接口的类CGLIB动态代理代码实现示例1.实现一个使用阿里云发送短信的类2.自定义 MethodInterceptor&#xff…

子网掩码与IP段计算

一.什么叫子网掩码&#xff1a; 子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩&#xff0c;它用来指明一个IP地址的哪些位标识的是主机所在的子网&#xff0c;以及哪些位标识的是主机的位掩码。子网掩码不能单独存在&#xff0c;它必须结合IP地址一起使用。 子网掩…