【密码学】RSA公钥加密算法

news2024/11/18 6:42:05

文章目录

      • RSA定义
      • RSA加密与解密
        • 加密
        • 解密
      • 生成密钥对
      • 一个例子
        • 密钥对生成
        • 加密
        • 解密
      • 对RSA的攻击
        • 通过密文来求得明文
        • 通过暴力破解来找出D
        • 通过E和N求出D
          • 对N进行质因数分解
          • 通过推测p和q进行攻击
        • 中间人攻击
      • 一些思考
        • 公钥密码比对称密码的机密性更高?
        • 对称密码会消失?
        • RSA使用过程中,质数对会不会被用光?
        • RSA加密过程中需要对大整数进行质因数分解?
        • N达到多少比特可以抵御质因数分解?

RSA定义

  • RSA是一种公钥密码算法
  • 他的名字由他的三位开发者的形式首字母组成

RSA加密与解密

加密解密

加密
  • 密文 = 明文EmodN

  • 在RSA只能够,明文、密钥和密文都是数字,具体加密过程可由上式来表达,RSA的密文就是对代表明文的数字的E次方求modN的结果

  • E和N的组合就是密钥,一般可写成“密钥是(E, N)”

解密
  • 明文 = 密文DmodN
  • 对表示密文 数字的D次方求modN就可以得到明文
  • D和N的组合就是私钥,一般可写成“私钥是(D, N)”,这里所使用的数字N和加密时使用的数字N是相同的

生成密钥对

  • 公钥是(E, N),私钥是(D, N),因此求E, D, N这三个数的过程就是生成密钥对的过程,即为RSA密钥对的生成过程
  1. 求N
    • 首先准备两个很大的质数p, q
    • 若p和q过小的话,密码会变得容易破译;但若p和q过大的话计算时间又会变得很长
    • N为两质数的乘积
    • N = p*q
  2. 求L
    • L是(p-1)和(q-1)的最小公倍数(least common multiple),用lcm(X, Y)来表示“X和Y的最小公倍数”
    • L = lcm(p-1, q-1)
  3. 求E
    • E是一个比1大、比L小的数
    • E和L的最大公约数(greatest common divisor)必须是1,用gcd(X, Y)来表示X和Y的最大公约数
    • 1 < E < L, gcd(E, L) = 1
    • 要找到满足要求的数,要使用伪随机数生成器,通过伪随机数生成器在1 < E < L的范围内生成E的候选数,然后再判断其是否满足gcd(E, L) = 1这个条件
  4. 求D
    • 1 < D < L, E * D mod L = 1
    • 只要数D满足上述条件,则通过E和N进行加密的密文,就可以通过D和N进行解密

一个例子

密钥对生成
  1. 求N
    • p = 17, q = 19
    • N = p * q = 17 * 19 = 323
  2. 求L
    • L = lcm(p-1, q-1) = lcm(16, 18) = 144
  3. 求E
    • gcd(E, L) = 1
    • E = 5、7、11、13、17…
    • 选取E = 5,N = 323
  4. 求D
    • E * D mod L = 1
    • 将D = 29代入上式即满足
    • E * D mod L = 5 * 29 mod 144 = 145 mo 144 = 1
  • 得公钥(E, N) = (5, 323),私钥(D, N) = (29, 323)
  • 公钥是可以任意公开的,但私钥必须妥善保管
加密
  • 要加密的明文必须是小于N的数,即此处必须是小于323的数,因为在加密过程中有mod N操作
  • 假设需要加密的数是123,公钥(E, N) = (5, 323)
  • 密文 = 明文Emod N = 1235mod 323 = 225
解密
  • 收到密文是225,私钥(D, N) = (29, 323)
  • 明文 = 密文Dmod N = 22529mod 323 = 123

对RSA的攻击

  • 密码破译者知道的信息
    • 密文:可以通过窃听来获取
    • 公钥(E, N):公钥是公开信息
  • 密码破译者不知道的信息
    • 明文:需要破译的内容
    • 私钥中的D:私钥中的D是不知道的
    • 其他:密码破译者不知道生成密钥对时所使用的p、q、L
通过密文来求得明文
  • 若在加密过程中,没有mod N的操作,通过密文求解明文的难度并不大,因为可以看作是一个求对数的问题
  • 但是,加上mod N后,求明文就变成了求离散对数的问题,这种操作非常困难,目前还没有发现求解离散对数的高效算法
通过暴力破解来找出D
  • 只要能知道D,就能对密文进行解密。因此可以逐一尝试有可能作为D的数字来破译RSA,即暴力破解法
  • 暴力破解法的难度会随着D的长度增大而增大,当D足够长时,就不可能在现实的时间内通过暴力破解找出D
  • 现在RSA所使用的p和q的长度都是1024比特以上的,N的长度为2048比特以上的,由于E和D的长度可以和N差不多,因此要找出D,就需要进行2048比特以上的暴力破解
通过E和N求出D
对N进行质因数分解
  • p和q是不能被密码破译者知道的,因为N = p * q,而且N是公开的,p和q都是质数,因此由N求p和q只能通过将N进行质因数分解来完成
  • 一旦发现了对大整数进行质因数分解的高效算法,RSA就能够被破译
  • 然而,现在还没有发现对大整数进行质因数分解的高效算法,而且也尚未证明质因数分解是否真的是非常困难的问题,甚至不知道是否存在一种分解质因数的简单方法
通过推测p和q进行攻击
  • 由于p和q是通过伪随机数生成器产生的,如果伪随机数生成器的算法很差,密码破译者就有可能推测出来p和q,因此使用能够被推测出来的随机数是非常危险的
中间人攻击
  • man-in-the-middle attack
  • 这种方法虽不能破译RSA,但却是一种针对机密性的有效攻击
  • 中间人攻击就是主动攻击者M混入发送者和接收者中间,对发送者伪装成接收者,对接收者伪装成发送者的攻击方式,此时M就是“中间人”

中间人攻击

  1. 消息发送者A向B发送邮件索取公钥
  2. 攻击人M通过窃听发现A在向B索取公钥
  3. B看到A的邮件,并将自己的公钥发送给A
  4. M拦截B的邮件,使其无法发送给A,然后将B的公钥保存起来
  5. M伪装成B,将M自己的公钥发送给A
  6. A将自己的消息用B的公钥(此时其实是M的公钥)进行加密
  7. A将加密后的消息发送给B
    • 但A所持有的并非B的公钥,而是M的公钥,因此A是用M的公钥对邮件进行加密
  8. M拦截A的加密邮件
    • 这封加密邮件是用M的公钥进行加密的,因此M能够对其进行解密
  9. M伪装成A写一封假的邮件,并用4中保存下来的B的公钥对邮件进行加密,再发送给B
  • 上述过程可以反复多次,B向A发送加密邮件也可能受到同样的攻击
  • 中间人攻击可以针对任何公钥密码,攻击过程中,公钥密码并没有被破译,所有的密码算法也都正常工作并确保了机密性,然而所谓的机密性并不存在在A与B之间,而成立在A与M之间与M与B之间
  • 仅靠公钥密码本身,是无法防御中间人攻击的,这种情况,可以使用公钥的证书

一些思考

公钥密码比对称密码的机密性更高?
  • 不一定
  • 机密性的高低是根据密钥长度而变化的
对称密码会消失?
  • 不会
  • 虽然有了公钥密码,但对称密码也不会消失
  • 一般来说,在采用具备同等机密性的密钥长度的情况下,公钥密码的处理速度只有对称密码的几百分之一,因此公钥密码并不适合用来对很长的消息内容进行加密
  • 根据目的的不同,还可能会配合使用对称密码和公钥密码
RSA使用过程中,质数对会不会被用光?
  • 不会
  • 512比特能够容纳的质数数量约为10的150次方,假设世界上有100亿人,每人每秒生成100亿个密钥对,那么在经过100亿年后会生成:100亿人 * 100亿个 * (366 * 24 * 60 * 60)秒 * 100亿年 = 316224 * 1032 < 1039 << 10150
RSA加密过程中需要对大整数进行质因数分解?
  • 不需要
  • RSA加密和解密的过程都无需对大整数进行质因数分解操作
  • 只有在需要有数N求p和q的密码破译过程中才需要对大整数进行质因数分解,RSA的设计是将质因数分解的难题留给密码破译者
N达到多少比特可以抵御质因数分解?
  • 不能抵御
  • N无论有多长,总有一天能被质因数分解,因此问题是能否在现实的时间内对N进行质因数分解

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

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

相关文章

七、MyBatis-Plus高级用法:最优化持久层开发-个人版

七、MyBatis-Plus高级用法&#xff1a;最优化持久层开发 目录 文章目录 七、MyBatis-Plus高级用法&#xff1a;最优化持久层开发目录 一、MyBatis-Plus快速入门1.1 简介1.2 快速入门回顾复习 二、MyBatis-Plus核心功能2.1 基于Mapper接口CRUDInsert方法Delete方法Update方法Se…

主从复制原理及操作

主从复制的概念 主从复制是一种在数据库系统中常用的数据备份和读取扩展技术&#xff0c;通过将一个数据库服务器&#xff08;主服务器&#xff09;上的数据变更自动同步到一个或多个数据库服务器&#xff08;从服务器&#xff09;上&#xff0c;以此来实现数据的冗余备份、读…

springboot集成tika解析word,pdf,xls文件文本内容

介绍 Apache Tika 是一个开源的内容分析工具包&#xff0c;用于从各种文档格式中提取文本和元数据。它支持多种文档类型&#xff0c;包括但不限于文本文件、HTML、PDF、Microsoft Office 文档、图像文件等。Tika 的主要功能包括内容检测、文本提取和元数据提取。 官网 https…

一口气拿下Faster-RCnn三部曲系列01:Selective Search 和 R-CNN、Fast-CNN 简介

Selective Search 和 R-CNN、Fast-CNN 简介 1 目标检测算法简介1.0滑窗法的思路1.1 Selective Search 和 R-CNN 简介1.2.1 Selective Search简介1.1.1 Selective Search的思路1.1.2 Selective Search图解 1.2 Selective Search 和 Fast-CNN简介1.2.1 SPP和ROI Pooling简介1.2.2…

招聘一个1-3年经验的Java工程师:企业视角的技能与素质要求

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

es6新语法

es6新语法 1 什么是ES6 JS语法分三块 ECMAScript : 基础语法BOM 浏览器对象 history location windowDOM 文档对象 document 编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA&#xff08;一个类似W3C的标准组织&#xff09;参与进行标准化的语法规范。ECMAS…

python 实现docx指定语言翻译(不丢失格式)

我这边有个需求需要把一份docx翻译成指定语言的文档并且保存&#xff0c;研究了下&#xff0c;记录。 首先先安装依赖 pip install python-docx1.1.2 googletrans4.0.0rc1 python-docx是用来读取docx的&#xff0c;googletrans使用来翻译的。 googletrans PyPI 这个是官方文…

MATLAB 2024b 更新了些什么?

MATLAB 2024b版本已经推出了预览版&#xff0c;本期介绍一些MATLAB部分的主要的更新内容。 帮助浏览器被移除 在此前的版本&#xff0c;当我们从MATLAB中访问帮助文档时&#xff0c;默认会通过MATLAB的帮助浏览器&#xff08;Help browser&#xff09;。 2024b版本开始&…

uniapp 去掉小数末尾多余的0

文章目录 在uniapp或者一般的JavaScript环境中&#xff0c;要去掉小数末尾的0&#xff0c;可以使用以下几种方法&#xff1a; 使用parseFloat()函数 let num 123.4500; let result parseFloat(num); console.log(result); // 输出: 123.45字符串处理 将数字转换为字符串&am…

js的作用域链

function test(){} 运行期上下文&#xff1a;当函数执行时&#xff0c;会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境&#xff0c;函数每次执行时对应的执行上下文都是 独一无二的&#xff0c;所以多次调用一个函数对导致创建多个执行上下…

在pycharm里如何使用Jetbrains AI Assistant

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

云联壹云 FinOps:赋能某车企公有云成本管理与精细化运营

背景 某车企&#xff0c;世界 500 强企业&#xff0c;使用了大量的公有云资源&#xff0c;分布于多家公有云&#xff0c;月消费在千万级别。 业务线多且分散&#xff0c;相关的云消耗由一个核心团队进行管理&#xff0c;本次案例的内容将围绕这些云成本的管理展开的。 需求 …

Google重大更新--解读Android Auto认证4.3

Google在今年五月更新了Android Auto 4.2.2版本&#xff0c;而在2024年7月他们推出了Android Auto 4.3版本&#xff0c;这是自2023年9月以来对Android Auto 4.2版本的一次重大更新。 为了确保合规性和顺利认证&#xff0c;OEM和Tire1必须确保PDK组件版本与正在认证的主机的Rece…

如何魔改vnstat-docker项目使其支持每1分钟采样?

文章目录 一、概述二、官网参考1. 官网地址2. 查看打包过程3.打包命令 三、修改过的文件四、部署运行1. 编排文件2. 运行效果 一、概述 接前文 网络流量监控神器vnStat初探 我们已经了解了vnStat的作用、使用和docker部署。 同时也了解到官方版本支持的采样统计间隔最小为5分…

Mysql数据库索引、事务相关知识

索引 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现 查看索引 show index from 表名;创建索引对于非主键、非唯一约束、非外键的字段&#…

制作Ai 数字人和数字人带货全面拆解复盘

看了后不用再花高价钱去买怎么制作数字人 .数字人带货的相关教程了 市面上基本都是通过这几个方法制作的数字人 超级详细 值得注意的是 拆解的太详细 仅供正规个人用途哦 请勿用于任何非法操作 否则 就不用接着往下看了 点击获取完整版资料

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题&#xff1a; 当需要对多个迭代器进行相同遍历操作时&#xff0c;如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题&#xff1f; 2. 解决方法&#xff1a; 使用itertools模块中的chain函数。 示例&#xff1a; from itertools import chainlist_a [2,…

炫云云渲染平台:解锁设计师无限创意的魔法钥匙

在数字创意的浩瀚宇宙中&#xff0c;设计师们如同星辰般璀璨&#xff0c;他们以无尽的想象力和精湛的技能&#xff0c;绘制出一幅幅令人叹为观止的视觉盛宴。然而&#xff0c;在追求完美的道路上&#xff0c;复杂的渲染过程往往成为制约创意飞跃的瓶颈。这时&#xff0c;炫云云…

2024菜鸟春招笔试

第一题 解题思路&#xff1a; 签到题&#xff0c;把帖子按好评度降序排列&#xff0c;再将人按升序排列。 第二题 解题思路 从左到右遍历&#xff0c;如果当前元素没有错排&#xff0c;将其与后一个交换&#xff0c;这样两个元素一定都错排。 第三题 、 解题思路 这题当时暴力…

前端面试题21(js排序方法)

JavaScript 中有多种内置和自定义的排序方法。内置的 .sort() 方法是最直接的排序方式&#xff0c;而自定义排序算法如冒泡排序、选择排序、插入排序、希尔排序、快速排序等则提供了更深层次的学习和应用价值。下面我将详细介绍这些排序方法&#xff0c;并给出相应的示例代码。…