加密与安全_使用Java代码操作RSA算法生成的密钥对

文章目录

  • Pre
  • 概述
    • 什么是非对称加密算法?
    • 如何工作?
    • 示例:RSA算法
    • 特点和优势
    • ECC:另一种非对称加密算法
  • Code
    • 生成公钥和私钥
    • 私钥加密
    • 私钥加密私钥解密 ( 行不通 )
    • 私钥加密公钥解密
    • 公钥加密和公钥解密 (行不通)
    • 保存公钥和私钥
    • 读取私钥
    • 读取公钥
    • 使用读取的公钥加密,私钥解密
  • Source

在这里插入图片描述


Pre

加密与安全_探索非对称加密算法_RSA算法


概述

在数字化时代,网络通信的安全性是必须关注的重要问题之一。非对称加密算法作为现代密码学的重要组成部分,为保护通信的隐私提供了一种可靠的解决方案。


什么是非对称加密算法?

非对称加密算法,又称为公钥加密算法,是一种密码学中的重要概念。它与传统的对称加密算法不同,需要一对密钥:公钥和私钥。这对密钥之间存在着特殊的数学关系,但无法通过公钥推导出私钥,从而保证了通信的安全性。

如何工作?

当发送方A希望将数据发送给接收方B时,A可以使用B的公钥对数据进行加密,得到密文。只有拥有对应私钥的B才能解密这个密文。同样地,B也可以使用A的公钥加密数据,只有A持有私钥才能解密。这种加密和解密使用不同的密钥的特点,使得非对称加密算法成为了保护通信隐私的重要工具。

示例:RSA算法

RSA算法是非对称加密算法中最常见的一种,它利用了大数分解的数学难题,保证了通信的安全性。在RSA算法中,公钥是公开的,私钥是保密的。发送方使用接收方的公钥对数据进行加密,而接收方使用自己的私钥进行解密,从而实现了安全的通信。

特点和优势

  • 加密和解密使用不同的密钥,提高了通信的安全性。
  • 如果使用私钥加密,只能使用公钥解密;反之亦然。
  • 非对称加密算法安全性高,但处理数据速度较慢。

ECC:另一种非对称加密算法

除了RSA算法,还有一种备受关注的非对称加密算法,即椭圆曲线密码学(ECC)。ECC利用了椭圆曲线上的数学难题,相比RSA算法,它能够以更短的密钥长度实现相当于甚至更高的安全级别,同时在资源受限的环境下拥有更好的性能表现。


Code

生成公钥和私钥

package com.artisan;import com.sun.org.apache.xml.internal.security.utils.Base64;import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;/*** @author 小工匠* @version 1.0 */
public class RsaKeyPair {public static void main(String[] args) throws Exception {// 指定加密算法为RSAString algorithm = "RSA";// 创建密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成RSA密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 获取生成的私钥PrivateKey privateKey = keyPair.getPrivate();// 获取生成的公钥PublicKey publicKey = keyPair.getPublic();// 获取私钥的编码字节数组byte[] privateKeyEncoded = privateKey.getEncoded();// 获取公钥的编码字节数组byte[] publicKeyEncoded = publicKey.getEncoded();// 对公私钥的编码字节数组进行Base64编码String privateKeyString = Base64.encode(privateKeyEncoded);String publicKeyString = Base64.encode(publicKeyEncoded);// 打印私钥的Base64编码字符串System.out.println(privateKeyString);System.out.println("----------------------------------");// 打印公钥的Base64编码字符串System.out.println(publicKeyString);}
}

使用RSA算法生成一个密钥对,并将私钥和公钥进行Base64编码后打印出来了。

在这里插入图片描述


私钥加密

package com.artisan;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;/*** @author 小工匠* @version 1.0* @mark: 显示代码,改变世界*/
public class PrivateKeyEnc {public static void main(String[] args) throws Exception {String input = "小工匠的IT生活";// 指定加密算法为RSAString algorithm = "RSA";// 创建密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成RSA密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 获取生成的私钥PrivateKey privateKey = keyPair.getPrivate();// 获取生成的公钥PublicKey publicKey = keyPair.getPublic();// 获取私钥的编码字节数组byte[] privateKeyEncoded = privateKey.getEncoded();// 获取公钥的编码字节数组byte[] publicKeyEncoded = publicKey.getEncoded();// 对公私钥的编码字节数组进行Base64编码String privateKeyString = Base64.encode(privateKeyEncoded);String publicKeyString = Base64.encode(publicKeyEncoded);// 打印生成的密钥对System.out.println("私钥(Base64编码): " + privateKeyString);System.out.println("公钥(Base64编码): " + publicKeyString);// 创建加密对象,参数表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密对象// 第一个参数:加密模式// 第二个参数:使用私钥进行加密cipher.init(Cipher.ENCRYPT_MODE, privateKey);// 使用私钥加密输入的字符串byte[] encryptedBytes = cipher.doFinal(input.getBytes());// 对加密后的字节数组进行Base64编码,并打印System.out.println("加密后的字符串(Base64编码): " + Base64.encode(encryptedBytes));}
}

私钥加密私钥解密 ( 行不通 )

在上面的代码上追加

// 私钥进行解密 (错误的演示)
cipher.init(Cipher.DECRYPT_MODE,privateKey);// 对密文进行解密,不需要使用base64,因为原文不会乱码byte[] bytes1 = cipher.doFinal(encryptedBytes);System.out.println(new String(bytes1));

在这里插入图片描述


私钥加密公钥解密

将上述代码的 私钥解密,换成使用公钥解密

// 公钥进行解密
cipher.init(Cipher.DECRYPT_MODE,publicKey);
// 对密文进行解密,不需要使用base64,因为原文不会乱码
byte[] bytes1 = cipher.doFinal(encryptedBytes);
System.out.println("解密后的字符串: " + new String(bytes1));

在这里插入图片描述


公钥加密和公钥解密 (行不通)

在这里插入图片描述

在这里插入图片描述


保存公钥和私钥

生成RSA非对称加密算法的密钥对,并将生成的公钥和私钥保存在本地文件中。

package com.artisan;import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.io.FileUtils;import java.io.File;
import java.nio.charset.Charset;
import java.security.*;public class KeyPairOperate {public static void main(String[] args) throws Exception {// 加密算法String algorithm = "RSA";// 生成密钥对并保存在本地文件中generateKeyToFile(algorithm, "a.pub", "a.pri");}/*** 生成密钥对并保存在本地文件中** @param algorithm : 算法* @param pubPath   : 公钥保存路径* @param priPath   : 私钥保存路径* @throws Exception*/private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {// 获取密钥对生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 获取密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 获取公钥PublicKey publicKey = keyPair.getPublic();// 获取私钥PrivateKey privateKey = keyPair.getPrivate();// 获取byte数组byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 进行Base64编码String publicKeyString = Base64.encode(publicKeyEncoded);String privateKeyString = Base64.encode(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));}
}

在这里插入图片描述


读取私钥

// 读取私钥
PrivateKey privateKey = readPrivateKeyFromFile(algorithm, "a.pri");byte[] encoded = privateKey.getEncoded();String privateContent = Base64.encode(encoded);System.out.println("私钥内容:" + privateContent);
 /*** @param algorithm* @param filePath* @return* @throws Exception*/private static PrivateKey readPrivateKeyFromFile(String algorithm, String filePath) throws Exception {// 从文件中读取私钥字符串String privateKeyString = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);// 进行Base64解码byte[] privateKeyEncoded = Base64.decode(privateKeyString);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString));return keyFactory.generatePrivate(spec);}

在这里插入图片描述
看下生成的文件中的内容:

在这里插入图片描述


读取公钥

// 读取公钥
PublicKey publicKey = readPublicKeyFromFile(algorithm, "a.pub");byte[] publicKeyEncoded = publicKey.getEncoded();
String publicContent = Base64.encode(publicKeyEncoded);
System.out.println("公钥内容:" + publicContent);
 /*** @param algorithm* @param filePath* @return* @throws Exception*/private static PublicKey readPublicKeyFromFile(String algorithm, String filePath) throws Exception {// 将文件内容转为字符串String publicKeyString = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decode(publicKeyString));// 生成公钥return keyFactory.generatePublic(spec);}

在这里插入图片描述

在这里插入图片描述


使用读取的公钥加密,私钥解密

// 使用公钥私钥实现加解密
String text = "小工匠的IT生活";
System.out.println("原文:" + text);String enc = encryptRSA(algorithm, publicKey, text);
System.out.println("公钥加密后的数据:" + enc);String plainText = decryptRSA(algorithm, privateKey, enc);
System.out.println("私钥解密后的数据:" + plainText);
 /*** 解密数据** @param algorithm : 算法* @param encrypted : 密文* @param key       : 密钥* @return : 原文* @throws Exception*/public static String decryptRSA(String algorithm, Key key, String encrypted) throws Exception {// 创建加密对象// 参数表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 私钥进行解密cipher.init(Cipher.DECRYPT_MODE, key);// 由于密文进行了Base64编码, 在这里需要进行解码byte[] decode = Base64.decode(encrypted);// 对密文进行解密,不需要使用base64,因为原文不会乱码byte[] bytes1 = cipher.doFinal(decode);return new String(bytes1);}/*** 使用密钥加密数据** @param algorithm : 算法* @param input     : 原文* @param key       : 密钥* @return : 密文* @throws Exception*/public static String encryptRSA(String algorithm, Key key, String input) throws Exception {// 创建加密对象// 参数表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一个参数:加密的模式// 第二个参数:使用私钥进行加密cipher.init(Cipher.ENCRYPT_MODE, key);// 私钥加密byte[] bytes = cipher.doFinal(input.getBytes());// 对密文进行Base64编码return Base64.encode(bytes);}

在这里插入图片描述


Source

package com.artisan;import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.apache.commons.io.FileUtils;import javax.crypto.Cipher;
import java.io.File;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/
public class KeyPairOperate {public static void main(String[] args) throws Exception {// 加密算法String algorithm = "RSA";// 生成密钥对并保存在本地文件中generateKeyToFile(algorithm, "a.pub", "a.pri");// 读取私钥PrivateKey privateKey = readPrivateKeyFromFile(algorithm, "a.pri");byte[] encoded = privateKey.getEncoded();String privateContent = Base64.encode(encoded);System.out.println("私钥内容:" + privateContent);// 读取公钥PublicKey publicKey = readPublicKeyFromFile(algorithm, "a.pub");byte[] publicKeyEncoded = publicKey.getEncoded();String publicContent = Base64.encode(publicKeyEncoded);System.out.println("公钥内容:" + publicContent);// 使用公钥私钥实现加解密String text = "小工匠的IT生活";System.out.println("原文:" + text);String enc = encryptRSA(algorithm, publicKey, text);System.out.println("公钥加密后的数据:" + enc);String plainText = decryptRSA(algorithm, privateKey, enc);System.out.println("私钥解密后的数据:" + plainText);}/*** 解密数据** @param algorithm : 算法* @param encrypted : 密文* @param key       : 密钥* @return : 原文* @throws Exception*/public static String decryptRSA(String algorithm, Key key, String encrypted) throws Exception {// 创建加密对象// 参数表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 私钥进行解密cipher.init(Cipher.DECRYPT_MODE, key);// 由于密文进行了Base64编码, 在这里需要进行解码byte[] decode = Base64.decode(encrypted);// 对密文进行解密,不需要使用base64,因为原文不会乱码byte[] bytes1 = cipher.doFinal(decode);return new String(bytes1);}/*** 使用密钥加密数据** @param algorithm : 算法* @param input     : 原文* @param key       : 密钥* @return : 密文* @throws Exception*/public static String encryptRSA(String algorithm, Key key, String input) throws Exception {// 创建加密对象// 参数表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一个参数:加密的模式// 第二个参数:使用私钥进行加密cipher.init(Cipher.ENCRYPT_MODE, key);// 私钥加密byte[] bytes = cipher.doFinal(input.getBytes());// 对密文进行Base64编码return Base64.encode(bytes);}/*** @param algorithm* @param filePath* @return* @throws Exception*/private static PublicKey readPublicKeyFromFile(String algorithm, String filePath) throws Exception {// 将文件内容转为字符串String publicKeyString = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decode(publicKeyString));// 生成公钥return keyFactory.generatePublic(spec);}/*** @param algorithm* @param filePath* @return* @throws Exception*/private static PrivateKey readPrivateKeyFromFile(String algorithm, String filePath) throws Exception {// 从文件中读取私钥字符串String privateKeyString = FileUtils.readFileToString(new File(filePath), StandardCharsets.UTF_8);// 进行Base64解码byte[] privateKeyEncoded = Base64.decode(privateKeyString);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 构建密钥规范 进行Base64解码PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString));return keyFactory.generatePrivate(spec);}/*** 生成密钥对并保存在本地文件中** @param algorithm : 算法* @param pubPath   : 公钥保存路径* @param priPath   : 私钥保存路径* @throws Exception*/private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {// 获取密钥对生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 获取密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 获取公钥PublicKey publicKey = keyPair.getPublic();// 获取私钥PrivateKey privateKey = keyPair.getPrivate();// 获取byte数组byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 进行Base64编码String publicKeyString = Base64.encode(publicKeyEncoded);String privateKeyString = Base64.encode(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));}
}

在这里插入图片描述

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

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

相关文章

字符指针变量

在指针的类型中我们知道有⼀种指针类型为字符指针 char* 1.一般使用方法如下: int main() { char ch w; char *pc &ch; *pc w; return 0; } 2.还有⼀种使⽤⽅式如下: int main() { const char* pstr "hello world."; printf("…

吴恩达深度学习笔记:深度学习引言1.1-1.5

目录 第一门课:神经网络和深度学习 (Neural Networks and Deep Learning)第一周:深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络?(What is a Neural Network)1.3 神经网络的监督学习(Supervised Learning …

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…

【IP178G】分享一个IP178G的8口交换机电路图

前提 IP178G是一个集成度非常高的8口交换机芯片,还可以通过外部EEPROM配置交换机芯片实现一些简单的网管功能**(VLAN/端口镜像etc)**,拿来作为一个网络调试工具来使用非常方便,一个TYPE-C的USB口的线就可以供电(5V USB就可以带的了)

职场成功的秘诀:如何高效管理时间

在职场中,时间管理是一项至关重要的技能。高效的时间管理不仅能够提高工作效率,还能够帮助我们更好地平衡工作与生活,实现职场成功。本文将分享一些职场成功人士都在使用的时间管理秘诀,帮助你更好地管理时间,提升职场…

小红书brief怎么创作?品牌营销技巧

在小红书平台进行品牌传播,首先需要具备的能力,就是与达人进行沟通。那么就一定要学会写小红书brief。今天我们和大家分享一下小红书brief怎么创作?品牌营销技巧! 一、什么是小红书brief brief是工作简报的意思。小红书brief是品牌…

基于Docker搭建Maven私服仓库(Linux)详细教程

文章目录 1. 下载镜像并启动容器2. 配置Nexus3. 配置本地Maven仓库 1. 下载镜像并启动容器 下载Nexus3镜像 docker pull sonatype/nexus3查看Nexus3镜像是否下载成功 docker images创建Nexus3的挂载文件夹 mkdir /usr/local/nexus-data && chown -R 200 /usr/local…

07.axios封装实例

一.简易axios封装-获取省份列表 1. 需求:基于 Promise 和 XHR 封装 myAxios 函数,获取省份列表展示到页面 2. 核心语法: function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …

微服务韧性工程:利用Sentinel实施有效服务容错与限流降级

目录 一、雪崩效应 二、Sentinel 服务容错 2.1 Sentinel容错思路 2.2 内部异常兼容 2.3 外部流量控制 三、Sentinel 项目搭建 四、Sentinel 工作原理 服务容错是微服务设计中一项重要原则和技术手段,主要目标是在服务出现故障、网络波动或其他不可预见的异常情况…

刷题日记——约数的个数KY3

分析 用例的0超过9个&#xff0c;需要使用long long&#xff0c;为了保险&#xff0c;我用的是unsigned long long判断约数有这样的规律&#xff1a;任何正整数a&#xff0c;如果存在约数对<m,n>&#xff0c;即amn&#xff0c;设mmin{m,n},nmax{m,n}&#xff0c;即设m是…

数据库备份.....

一.环境准备 数据库备份&#xff0c;数据库为school&#xff0c;素材如下 >create database school; >use school1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , bi…

【论文阅读】Mamba:选择状态空间模型的线性时间序列建模(一)

文章目录 Mamba:选择状态空间模型的线性时间序列建模介绍状态序列模型选择性状态空间模型动机&#xff1a;选择作为一种压缩手段用选择性提升SSM 选择性SSM的高效实现先前模型的动机选择扫描总览&#xff1a;硬件感知状态扩展 Mamba论文 Mamba:选择状态空间模型的线性时间序列建…

SaulLM-7B: A pioneering Large Language Model for Law

SaulLM-7B: A pioneering Large Language Model for Law 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Model、Legal Domain、SaulLM-7B、Instructional Fine-tuning、Legal Corpora 摘要 本文中&#xff0c;我们介绍了SaulLM-7B&#xff0c;这是为法律领域量…

服务器-->网站制作-->接口开发,一篇文章一条龙服务(1)

作者&#xff1a;q: 1416279170v: lyj_txd前述&#xff1a;本人非专业&#xff0c;兴趣爱好自学自研&#xff0c;很多没有说清楚的地方见谅&#xff0c;欢迎一起讨论的小伙伴~ 概述 不想看概述&#xff0c;直接点击服务器部分 三者之间的关系 服务器、网站制作、接口开发这…

Redis进阶--一篇文章带你走出Redis

目录 什么是Redis?? Redis有哪些使用场景? Redis是单线程还是多线程? 为什么Redis是单线程速度还是很快?? Redis持久化 RDB机制:(Redis DataBase) [是redis中默认的持久化方式] AOF机制:(Append Only File) Redis和MySQL如何保持数据一致????…

NodeJS实现堆排序算法

NodeJS实现堆排序算法 以下是使用 Node.js 实现堆排序算法的示例代码&#xff1a; // 堆排序函数 function heapSort(arr) {// 构建最大堆buildMaxHeap(arr);// 依次取出最大堆的根节点&#xff08;最大值&#xff09;&#xff0c;并调整堆结构for (let i arr.length - 1; i…

STM32 SDRAM知识点

1.SDRAM和SRAM的区别 SRAM不需要刷新电路即能保存它内部存储的数据。而SDRAM&#xff08;Dynamic Random Access Memory&#xff09;每隔一段时间&#xff0c;要刷新充电一次&#xff0c;否则内部的数据即会消失&#xff0c;因此SRAM具有较高的性能&#xff0c;但是SRAM也有它…

c#递归函数

在 C#中&#xff0c;递归函数是指在函数内部直接或间接调用自身的函数。递归函数在解决一些问题时非常有用&#xff0c;例如遍历树形结构、递归计算等。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks…

分享axios+MQTT简单封装示例

MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在19…

二维码门楼牌管理系统在教育领域的应用及其优势

文章目录 前言一、二维码门楼牌管理系统概述二、教育领域的应用场景三、二维码门楼牌管理系统的优势四、结语 前言 随着信息技术的快速发展&#xff0c;二维码门楼牌管理系统在教育领域的应用越来越广泛。该系统不仅提高了地址信息的准确性&#xff0c;还为学校、家长和教育工…