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

深入了解RSA加密算法

目录

前言

一、什么是RSA?

二、RSA加密的基本概念

1.非对称加密

2.密钥生成

3.加密和解密

三、RSA加密的工作原理

四、RSA的应用场景

五、RSA加密解密的实现

六、RSA算法的局限性及改进措施


前言

        在当今的数字化时代,信息的安全性成为了人们关注的重点。如何在不安全的通信网络上确保数据传输的安全性?RSA加密算法就是一种非常经典的公钥密码体制,它的安全性和高效性使其成为互联网加密的基石。本文将对RSA加密算法进行详细解读,带大家了解其原理、实现过程以及应用场景。

一、什么是RSA?

        RSA(Rivest-Shamir-Adleman)加密算法是一种非对称加密算法,由罗纳德·里维斯特(Ronald Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)于1977年提出。RSA算法基于数论中的大素数分解难题,其安全性依赖于将一个大数分解成两个大素数的难度。

二、RSA加密的基本概念

1.非对称加密

非对称加密使用一对密钥:公钥(public key)和私钥(private key)。公钥用于加密消息,私钥用于解密消息。这意味着,即使公钥被公开,只有拥有私钥的人才能解密消息。

2.密钥生成

RSA算法涉及三个主要步骤:密钥生成、加密和解密。

  1. 选择两个大素数 ( p ) 和 ( q )

    这两个素数应随机选择且足够大,以确保安全性。

  2. 计算 ( n ) 和 ( \phi(n) )

    ( n = p \times q )

    ( \phi(n) = (p-1) \times (q-1) ),其中 ( \phi ) 是欧拉函数。

  3. 选择公钥指数 ( e )

    ( e ) 应满足 ( 1 < e < \phi(n) ) 且与 ( \phi(n) ) 互质。 

  4. 计算私钥指数 ( d )

    ( d ) 是 ( e ) 关于模 ( \phi(n) ) 的乘法逆元,即 ( d \times e \equiv 1 \mod \phi(n) )。

公钥由 ( (e, n) ) 组成,私钥由 ( (d, n) ) 组成。

3.加密和解密

  • 加密:给定消息 ( M ),使用公钥 ( (e, n) ) 进行加密得到密文 ( C ): [ C = M^e \mod n ]

  • 解密:使用私钥 ( (d, n) ) 进行解密得到明文 ( M ): [ M = C^d \mod n ]

三、RSA加密的工作原理

RSA加密的核心在于大素数的选取和运算的复杂性。以下是详细的步骤:

  1. 密钥生成

    选择两个大素数 ( p ) 和 ( q )。

    计算 ( n = p \times q )。

    计算 ( \phi(n) = (p-1) \times (q-1) )。

    选择公钥指数 ( e ),使其与 ( \phi(n) ) 互质。

    计算私钥指数 ( d ),使 ( d \times e \equiv 1 \mod \phi(n) )。 

  2. 加密

    将明文消息 ( M ) 转换为整数形式。

    计算密文 ( C = M^e \mod n )。

  3. 解密

    使用私钥 ( d ) 解密,计算 ( M = C^d \mod n )。

四、RSA的应用场景

数据加密

RSA常用于保护敏感信息的传输。例如,在HTTPS中,RSA用于交换对称密钥,从而保护数据传输的安全性。

数字签名

RSA还能用于创建数字签名,验证消息的完整性和发送者的身份。发送者使用私钥对消息签名,接收者用公钥验证签名是否正确。

证书颁发机构(CA)

RSA广泛应用于数字证书,证书颁发机构(CA)使用RSA生成和验证数字证书,确保通信双方的身份真实性。

五、RSA加密解密的实现

package com.ctb.demo;import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class RSADemo {private static Map<Integer, String> keyMap = new HashMap<Integer, String>();  //用于封装随机产生的公钥与私钥/** * 随机生成密钥对 * @throws NoSuchAlgorithmException */  public static void genKeyPair() throws NoSuchAlgorithmException {  // KeyPairGenerator类用于生成公钥和私钥对,获取一个RSA密钥对生成器实例,基于RSA算法生成对象  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  // 初始化密钥对生成器,密钥大小为96-1024位,指定密钥的长度为1024位//SecureRandom类提供的随机数生成器生成随机数作为种子keyPairGen.initialize(1024,new SecureRandom());  // 生成一个密钥对,保存在keyPair中  KeyPair keyPair = keyPairGen.generateKeyPair();  RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私钥  RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公钥  //得到公钥字符串String publicKeyString = new String(Base64.getEncoder().encode(publicKey.getEncoded()));  // 得到私钥字符串  String privateKeyString = new String(Base64.getEncoder().encode((privateKey.getEncoded())));  // 将公钥和私钥保存到MapkeyMap.put(0,publicKeyString);  //0表示公钥keyMap.put(1,privateKeyString);  //1表示私钥System.out.println("公钥"+publicKeyString);System.out.println("私钥"+privateKeyString);}  /** * RSA公钥加密 *  * @param str *            加密字符串* @param publicKey *            公钥 * @return 密文 * @throws Exception *             加密过程中的异常信息 */  public static String encrypt( String str, String publicKey ) throws Exception{//通过Base64类对公钥字符串进行解码,得到原始的字节数组//base64编码的公钥byte[] decoded = Base64.getDecoder().decode(publicKey);//通过KeyFactory.getInstance("RSA")获取RSA密钥工厂实例,//并使用generatePublic()方法根据解码后的字节数组生成RSA公钥对象RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));//RSA加密,获取RSA加密算法的密码器实例Cipher cipher = Cipher.getInstance("RSA");//初始化密码器,指定加密模式为Cipher.ENCRYPT_MODE,并传入公钥对象cipher.init(Cipher.ENCRYPT_MODE, pubKey);//使用cipher.doFinal()方法对输入字符串进行加密操作,得到加密后的字节数组//通过Base64类对加密后的字节数组进行编码,并将编码后的字符串返回String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes("UTF-8")));return outStr;}/** * RSA私钥解密*  * @param str *            加密字符串* @param privateKey *            私钥 * @return 铭文* @throws Exception *             解密过程中的异常信息 */  public static String decrypt(String str, String privateKey) throws Exception{//通过Base64类对加密后的字符串进行解码,得到原始的字节数组//64位解码加密后的字符串byte[] inputByte = Base64.getDecoder().decode(str.getBytes("UTF-8"));//base64编码的私钥//通过Base64类对私钥字符串进行解码,得到原始的字节数组byte[] decoded = Base64.getDecoder().decode(privateKey);  //通过KeyFactory.getInstance("RSA")获取RSA密钥工厂实例,//并使用generatePrivate()方法根据解码后的字节数组生成RSA私钥对象RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));  //RSA解密 获取RSA解密算法的密码器实例Cipher cipher = Cipher.getInstance("RSA");//初始化密码器,指定解密模式为Cipher.DECRYPT_MODE,并传入私钥对象cipher.init(Cipher.DECRYPT_MODE, priKey);//使用cipher.doFinal()方法对输入字节数组进行解密操作,得到解密后的字节数组//将解密后的字节数组转换为字符串,并返回解密后的明文。String outStr = new String(cipher.doFinal(inputByte));return outStr;}public static void main(String[] args) throws Exception {//生成公钥和私钥genKeyPair();//加密字符串String message = "123";System.out.println("随机生成的公钥为:" + keyMap.get(0));System.out.println("随机生成的私钥为:" + keyMap.get(1));System.out.println("----------------------------");String messageEn = encrypt(message,keyMap.get(0));System.out.println(message + "\t加密后的字符串为:" + messageEn);String messageDe = decrypt(messageEn,keyMap.get(1));System.out.println("还原后的字符串为:" + messageDe);//MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2ocAG/DBOxQRIWDVpo79jjst9Aakcna7dfKugQI4SfjApVYXJdLmk6UU4VPERMb//MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALahwAb8ME7FBEhYNWmjv2OOy30BqRydrt18q6BAjhJ+MClSystem.out.println(messageEn.length());}}

结果:

六、RSA算法的局限性及改进措施

        尽管RSA算法在加密领域有着广泛的应用,但也存在一些局限性。例如,随着计算能力的提升,大质数的分解变得越来越容易,这可能导致RSA算法的安全性受到威胁。为了应对这些挑战,大佬提出了许多改进措施,比如使用更长的密钥长度、采用椭圆曲线加密算法等。

相关文章:

深入了解RSA加密算法

目录 前言 一、什么是RSA&#xff1f; 二、RSA加密的基本概念 1.非对称加密 2.密钥生成 3.加密和解密 三、RSA加密的工作原理 四、RSA的应用场景 五、RSA加密解密的实现 六、RSA算法的局限性及改进措施 前言 在当今的数字化时代&#xff0c;信息的安全性成为了人们关注…...

github基础使用

前言 将用到的github指令记录下来&#xff0c;持续更新&#xff0c;方便随时查找学习。 一、github用到的指令 1、我们从github克隆下来的代码版本一般都是master主分支&#xff0c;我们要建立自己的分支进行修改&#xff1a; //git branch //查看目前的分支/* * master /…...

Docker使用心得

Docker使用心得 最近使用Docker比较频繁&#xff0c;特此想记录一下&#xff0c;方便后续查找。 Docker常用命令Docker如何配置使用GPU环境&#xff1f;如何使用Dockerfile构建镜像&#xff1f;如何使用docker compose 实例化容器&#xff1f; Docker如何配置使用GPU环境 参…...

QListWidget 插入 item,item显示自定义界面

代码示意&#xff1a; class ItemWidget_action_cfg_w(QWidget):... # 如下方法是在指定item下插入新的item def __do_add_item(self, item):# 获取当前item rowrow self.__list_w.indexFromItem(item).row()# 注意这里没有父类&#xff0c;解释见后面说明new_item QList…...

Python写一个ERP系统和agent智能体协同仓库和订单的案例

这是一个关于使用Python编写一个简单的ERP系统&#xff0c;并与Agent智能体协同完成仓库和订单管理的案例。在这个案例中&#xff0c;我们将使用Python的第三方库sqlite3进行数据库操作&#xff0c;以及discord库实现与Agent智能体的通信。 1. 首先&#xff0c;安装所需库&…...

【计算机网络】已解决:“‘ping‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”报错

文章目录 一、问题分析背景二、可能出错的原因三、错误代码示例四、正确解决方法与示例五、注意事项 已解决“‘ping’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件”报错 一、问题分析背景 在Windows操作系统中&#xff0c;ping 命令是一个常用的网络诊断…...

Web前端学堂:深入探索前端开发的核心领域

Web前端学堂&#xff1a;深入探索前端开发的核心领域 在数字化时代的浪潮中&#xff0c;Web前端开发扮演着至关重要的角色。它不仅是连接用户与互联网世界的桥梁&#xff0c;更是创造丰富、互动网络体验的关键所在。本文将带领读者走进Web前端学堂&#xff0c;从四个方面、五个…...

Java数据结构与算法(0/1背包问题)

前言: 背包问题&#xff08;Knapsack Problem&#xff09;是组合优化问题中的一个经典问题&#xff0c;有多个变种。这里我们讨论的是 0/1 背包问题&#xff0c;这是最基本的一种形式。问题的描述如下&#xff1a; 给定 n 件物品&#xff0c;每件物品有一个重量 wi 和一个价值…...

LLVM 中 的 pass 及其管理机制

概述 LLVM 编译器框架的核心概念是任务调用和执行 编译器开发者将IR分解为不同的处理对象&#xff0c;并将其处理过程实现为单独的pass类型。在编译器初始化&#xff0c;pass被实例化&#xff0c;并被添加到pass管理中 pass 管理器(pass manager) 以流水线的方式将各个独立的…...

第 5 章 监控系统 | 入门案例 - 虚拟机监控

👉 本文目标:为 Linux 虚拟机/服务器安装 node_exporter,实现对虚拟机/服务器的监控。 👀 本文内容: 安装 Node Exporter,暴露 Linux 指标(比如 CPU、磁盘、IO 等)配置 Prometheus 抓取 Node Exporter 暴露的指标数据配置 Recording Rule,便于缓存/加速 Dashboard 频…...

教资认定报名照片要求小于190kb…

教资认定报名照片要求小于190kb…… 要求&#xff1a;文件小于190kb&#xff0c;宽度290-300&#xff0c;高度408-418 方法&#xff1a;vx搜随时照-教资认定 直接制作合规尺寸即可&#xff0c;还可以打印纸质版邮寄到家...

显示类控件——Calendar Widget

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;QT ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、Calendar Widget介绍核心属性重要信号代码示例: 获取选中的日期 一、Calendar Widget 介绍 …...

system与excel族函数区别

1.system #include<stdlib.h> int system(const char *command); comand是命令的路径&#xff0c;一般我们用绝对路径 system函数会创建新的进程&#xff0c;新的进程执行完返回原来的进程&#xff0c;原来的进程则继续执行后面的代码段。 如我们创建一个sys.cpp文件…...

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX

STM32存储左右互搏 模拟U盘桥接SPI总线FATS读写FLASH W25QXX STM32的USB接口可以模拟成为U盘&#xff0c;通过FATS文件系统对连接的存储单元进行U盘方式的读写。 这里介绍STM32CUBEIDE开发平台HAL库模拟U盘桥接SPI总线FATS读写W25Q各型号FLASH的例程。 FLASH是常用的一种非易失…...

jrt从量变到质变

又是一个加班的周末&#xff0c;上周把台式机代码和数据库环境弄好了&#xff0c;这周进行大数据测试&#xff0c;直接把标本、标本医嘱、报告、报告结果、药敏结果等数据插入到1亿的规模&#xff0c;跑了一天一夜插入了5000多万个标本&#xff0c;后面接着补剩下的到一亿。 演…...

NLP主流大模型如GPT3/chatGPT/T5/PaLM/LLaMA/GLM的原理和差异有哪些-详细解读

自然语言处理&#xff08;NLP&#xff09;领域的多个大型语言模型&#xff08;如GPT-3、ChatGPT、T5、PaLM、LLaMA和GLM&#xff09;在结构和功能上有显著差异。以下是对这些模型的原理和差异的深入分析&#xff1a; GPT-3 (Generative Pre-trained Transformer 3) 虽然GPT-4…...

从MySQL到NoSQL:分析传统关系型数据库与NoSQL数据库的协同

引言 数据库是一个系统,用来管理和存储数据的地方。数据在数据库中以一种结构化的方式组织,这样能更容易地查询和处理数据。 关系型数据库是基于关系模型的数据库,它将数据存储在不同的表中,每个表都有各自的独一无二的主键。表与表之间通过共享的数据项相互关联。像MySQ…...

三、树和割集

文章目录 1、树1.1 树的定义1.2 树的性质1.3 极小连通图1.4 树的中心1.5 生成树1.5.1 最小生成树 2、 割点和桥THE END 1、树 1.1 树的定义 \qquad 定义&#xff1a; 一个连通的无圈的图称为树。 \qquad 只有一个顶点的树叫做平凡树。 \qquad 树中度为1的节点称为叶子结点。…...

泛型中<>和()中的类型

尖括号 < > 中的类型参数定义了一组可以被替换的类型占位符&#xff0c;而圆括号 (...) 内的类型使用则是这些类型参数的具体应用场景&#xff0c;展示了这些类型变量如何参与到函数的参数和返回值类型定义中去。这样设计既保证了代码的灵活性&#xff0c;又保持了类型安…...

spark mllib 特征学习笔记 (一)

PySpark MLlib 特征处理详解 PySpark MLlib 提供了丰富的特征处理工具&#xff0c;帮助我们进行特征提取、转换和选择。以下是 PySpark MLlib 中常用的特征处理类及其简要介绍。 1. Binarizer Binarizer 是将连续特征二值化的转换器。 from pyspark.ml.feature import Bina…...

三层架构破解小红书数据采集难题:Appium+MitmProxy双引擎实战

三层架构破解小红书数据采集难题&#xff1a;AppiumMitmProxy双引擎实战 【免费下载链接】XiaohongshuSpider 小红书爬取 项目地址: https://gitcode.com/gh_mirrors/xia/XiaohongshuSpider 在小红书内容生态快速发展的今天&#xff0c;数据工程师和产品分析师面临着内容…...

基于STM32F103与HAL库的总线舵机多模式运动控制实战

1. STM32F103与HAL库开发环境搭建 第一次接触STM32F103和HAL库的朋友可能会觉得有点懵&#xff0c;其实搭建开发环境比你想象中简单多了。我当初用STM32CubeMX配置项目时踩过不少坑&#xff0c;现在把这些经验都分享给你。 首先得准备好硬件&#xff0c;你需要一块STM32F103开发…...

Qwen2.5-Coder-1.5B代码修复实战:常见Bug自动诊断与修复

Qwen2.5-Coder-1.5B代码修复实战&#xff1a;常见Bug自动诊断与修复 你有没有过这样的经历&#xff1f;深夜赶项目&#xff0c;代码跑起来一堆红字&#xff0c;对着报错信息一头雾水&#xff0c;查了半天文档还是找不到问题在哪。或者&#xff0c;接手一个老项目&#xff0c;里…...

收藏!AI技能进化全解析:从聊天搭子到行业专家的成长之路

本文回顾了AI技能的演进过程&#xff0c;从最初只能进行简单对话的聊天机器人&#xff0c;到如今能够理解行业规范、执行复杂任务的智能体。文章详细介绍了AI技能发展的五个阶段&#xff1a;初级聊天机器人、通过函数调用实现工具交互、通用接口MCP规范、智能体引擎赋予环境感知…...

Qwen3-0.6B-FP8惊艳效果:Qwen3-0.6B-FP8在中文法律条文理解任务中表现优异

Qwen3-0.6B-FP8惊艳效果&#xff1a;在中文法律条文理解任务中表现优异 最近&#xff0c;我在测试一个非常有意思的模型——Qwen3-0.6B-FP8。你可能听说过各种大模型&#xff0c;但这个模型有点特别&#xff0c;它是个“小个子”&#xff0c;却想在“大任务”上证明自己。我把…...

AudioSeal效果展示:实测音频隐形水印,听不出区别但能精准检测

AudioSeal效果展示&#xff1a;实测音频隐形水印&#xff0c;听不出区别但能精准检测 1. 音频水印技术概述 1.1 什么是音频隐形水印 音频隐形水印是一种将数字标识信息嵌入到音频信号中的技术&#xff0c;这些信息对人类听觉系统几乎不可感知&#xff0c;但可以通过专用算法…...

从理论到实践:SUNFLOWER MATCH LAB中的Transformer架构详解

从理论到实践&#xff1a;SUNFLOWER MATCH LAB中的Transformer架构详解 如果你对AI图像识别&#xff0c;特别是植物识别感兴趣&#xff0c;可能听说过一些模型背后神秘的“Transformer”架构。它听起来很高深&#xff0c;像是只属于研究论文里的东西。但今天&#xff0c;咱们不…...

终极Windows内存清理指南:如何用Mem Reduct让系统永远流畅运行

终极Windows内存清理指南&#xff1a;如何用Mem Reduct让系统永远流畅运行 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct…...

c++ 字符大小写转化

#include <iostream> using namespace std;int main() {char a;cin >> a;//a-z-97-122//A-Z-65-90//差32//小写转大写 if(97<(int)a && (int)a<122){a(int)a-32;cout << a; return 0; }//大写转小写 if(65<(int)a && (int)a<90)…...

二次开发入门:修改nanobot镜像适配我的OpenClaw需求

二次开发入门&#xff1a;修改nanobot镜像适配我的OpenClaw需求 1. 为什么需要定制nanobot镜像 第一次接触OpenClaw时&#xff0c;我直接使用了官方提供的标准镜像。但在实际使用中&#xff0c;发现几个痛点&#xff1a;默认的chainlit界面过于简单&#xff0c;无法展示我需要…...