深入了解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())));  
			// 将公钥和私钥保存到Map
			keyMap.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+MCl
		System.out.println(messageEn.length());
		}

	}

结果:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE3脚手架工具cli配置搭建及创建VUE工程

1、VUE的脚手架工具(CLI&#xff09; 开发大型vue的时候&#xff0c;不能通过html编写一个大型的项目&#xff0c;这个时候需要用到vue的脚手架工具 通过vue的脚手架&#xff0c;可以快速的生成vue工程 1.1、安装nodejs和npm 【下载nodejs】 https://nodejs.org/en 【安装…

厂里资讯之自媒体文章自动审核

自媒体文章-自动审核 1)自媒体文章自动审核流程 1 自媒体端发布文章后&#xff0c;开始审核文章 2 审核的主要是审核文章的内容&#xff08;文本内容和图片&#xff09; 3 借助第三方提供的接口审核文本 4 借助第三方提供的接口审核图片&#xff0c;由于图片存储到minIO中&…

Caffe、PyTorch、Scikit-learn、Spark MLlib 和 TensorFlowOnSpark 概述

在 AI 框架方面,有几种工具可用于图像分类、视觉和语音等任务。有些很受欢迎,如 PyTorch 和 Caffe,而另一些则更受限制。以下是四种流行的 AI 工具的亮点。 Caffee Caffee是贾扬青在加州大学伯克利分校(UC Berkeley)时开发的深度学习框架。该工具可用于图像分类、语音和…

UniVue更新日志:SuperGrid组件的使用

github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator SuperGrid组件的实现…

docker和docker compose 部署

一. 将微服务运行在docker上&#xff1a; 1.新建一个空文件夹docker-demo&#xff0c;在里面再新建文件夹app&#xff0c;在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…

UniVue更新日志:使用ObservableList优化LoopList/LoopGrid组件的使用

github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 如果大家…

C++ | Leetcode C++题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA nullptr ? headB : p…

Axios进阶

目录 axios实例 axios请求配置 拦截器 请求拦截器 响应拦截器 取消请求 axios不仅仅是简单的用基础请求用法的形式向服务器请求数据&#xff0c;一旦请求的端口与次数变多之后&#xff0c;简单的请求用法会有些许麻烦。所以&#xff0c;axios允许我们进行创建axios实例、ax…

LeetCode | 344.反转字符串

设置头尾两个指针&#xff0c;依靠中间变量temp交换头尾指针所指元素&#xff0c;头指针后移&#xff0c;尾指针前移&#xff0c;直到头尾指针重合或者头指针在尾指针后面一个元素 class Solution(object):def reverseString(self, s):""":type s: List[str]:r…

Gone框架介绍26 - Gone v1.x 版本 正式发布,更加强大的依赖注入,更加卓越的执行效率

gone是可以高效开发Web服务的Golang依赖注入框架 github地址&#xff1a;https://github.com/gone-io/gone 文档地址&#xff1a;https://goner.fun/zh/ 文章目录 优化和新特性gone 核心功能增强内置Goners覆盖测试 后续计划 优化和新特性 gone 核心功能增强 重构了函数参数依…

关于HTTP劫持,该如何理解、防范和应对

一、引言 HTTP劫持&#xff08;HTTP Hijacking&#xff09;是一种网络安全威胁&#xff0c;它发生在HTTP通信过程中&#xff0c;攻击者试图通过拦截、篡改或监控用户与服务器之间的数据流量&#xff0c;以达到窃取敏感信息或执行恶意操作的目的。今天我们就来详细了解HTTP劫持…

C语言 | Leetcode C语言题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {if (headA NULL || headB NULL) {return NULL;}struct ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA NULL ? headB : pA->ne…

express+vue在线im实现【二】

expressvue在线im实现【一】 在线体验 本期完成了&#xff1a; 1、心跳检测 2、支持发送表情与图片【这个目前还需要优化下&#xff0c;当图片上传后会被默认选中&#xff0c;需要点击一下旁边&#xff0c;使之失去选中效果&#xff0c;才能正常&#xff0c;留待下期优化吧】…

基于Quartus Prime18.1的安装与FPGA的基础仿真教程

Quartus是一种美国科技公司Intel&#xff08;英特尔&#xff09;公司开发的FPGA&#xff08;现场可编辑门阵列&#xff09;设计编译软件&#xff0c;用作设计、仿真、综合和布局、支持多种编程语言&#xff0c;包括VHDL、Verilog等&#xff0c;并具有丰富的功能和工具库&#x…

17.Meta AI 大模型家族 LLaMA

Meta LLaMA 1 大模型技术解读 LLaMA 1&#xff1a;小模型大数据 LLaMA 1 在万亿 Token 公开数据集上预训练 LLaMA 1 模型网络架构改进 大模型网络架构差异性配置总览 典型大模型网络架构对比 LLaMA 1 预训练超参数配置 典型大模型训练超参数对比 LLaMA 1 预训练效率提升与成本…

net start mysql服务名无效

问题背景 起因是我的电脑因为停电烧坏了系统固态硬盘&#xff0c;再新装系统后&#xff0c;之前的MySQL服务无法通过下面的命令启动。 net start mysql # 报错&#xff1a;服务名无效 报错&#xff1a;服务名无效 报错信息 未找到&#xff1a;在Windows服务中找不到MySQL 找…

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容&#xff0c;我们深入研究了一种称为量化低秩调整&#xff08;QLoRA&#xff09;的参数高效微调&#xff0…

【APP_汽修宝】数据采集案例APP_数据解密分析

如果不会写代码&#xff0c;那就出书、写博客、做视频、录播客。 &#x1f4da; S35赛季末王者昭君罗 关键代码定位 使用方法【逆向-快速定位关键代码】通过hook常用函数HashMap方法 动态分析 下面是我们通过访问目标页面时 Frida hook 捕获HashMap的调…

Nginx与Gateway

Nginx与Gateway Nginx 基本介绍 Nginx 是一款轻量级的高性能 Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。它由俄罗斯的 Igor Sysoev 所开发&#xff0c;最初供俄罗斯大型的门户网站及搜索引擎 Rambler 使用。 Nginx 的特点在于其占用…

RIP解决不连续子网问题

#交换设备 RIP解决不连续子网问题 一、不连续子网的概念 相同主网下的子网&#xff0c;被另一个主网分割&#xff0c;例如下面实验拓扑在某公司的网络整改项目中&#xff0c;原先R1 和RS 属于同一主网络 10.0.0.0/8&#xff0c;现被 R2、R3、R4 分离&#xff0c;整网采用了 …