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

RSA 加密算法的原理与加密过程深度解析(下篇)

文章目录

  • RSA 秘钥生成过程
    • 第一步:选取两个质数 P、Q,计算秘钥长度 N
    • 第二步:根据欧拉函数计算 φ(N) 并选取随机值 E
    • 第三步:计算 E 对 φ(N) 的模反元素 D
    • 第四步:将 N、E 封装为公钥,N、D 封装为私钥
  • 加密和解密
    • 加密需要使用公钥 N、E
      • 如果 M >= N 如何处理
    • 解密需要使用私钥 N、D
      • 如何证明 CD ≡ M (mod N) 成立
  • 其它
    • 为什么 RSA 加密算法可靠性如何保证
    • RSA 的复杂性导致加密过程十分慢,如何优化
  • 个人简介

  • hello,大家好,我是 Lorin,这是 RSA 算法解密的第二期 “RSA 加密算法的原理与加密过程深度解析” 主要介绍如何使用上期学到的数论知识来实现 RSA 加解密过程。

RSA 秘钥生成过程

  • 我们以一个实际场景来描述秘钥的生成过程,假设现在小明和小王要进行通信:

第一步:选取两个质数 P、Q,计算秘钥长度 N

  • 小王随机选取两个质数:P = 61 Q = 53,N = P * Q = 3233
  • N 就是秘钥的长度,3233 写成二进制是 110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

第二步:根据欧拉函数计算 φ(N) 并选取随机值 E

φ(N) = φ(P) * φ(Q) = (P - 1)*(Q -1) = 60 × 52 = 3120随机从 1<E<φ(N) 选取一个整数,且与 N 互质,比如我们选择 17

第三步:计算 E 对 φ(N) 的模反元素 D

ED = 1 (mod φ(N))// 等价于
ED - 1 = Kφ(N) // 即对二元一次方程组求解
E = 17,φ(N) = 3120
17D - 1 = 3120K// 我们算出其中一组解(存在多组解):
D = 2753K = -15

第四步:将 N、E 封装为公钥,N、D 封装为私钥

  • 即在我们例子中公钥:(3233,17)、私钥(3233,2753)
  • 实际应用中,公钥和私钥的数据都采用ASN.1格式表达。

加密和解密

加密需要使用公钥 N、E

  • 小明现在需要把数据 M 传递给小王,则他需要使用小王提供的公钥 N、E 对数据进行加密:
  • M 必须是整数(字符串可以取ascii值或unicode值),且满足 0 ≤ M < N,对 M 加密其实是计算下面的公式:
// 假设 M = 65
M^EC (mod N)65 ^ 172790 (mod 3233)C = 2790

如果 M >= N 如何处理

  • 方式一:将消息分段,分段进行加密
  • 方式二:使用 RSA 加密对称秘钥,然后使用对称加密秘钥加密信息

解密需要使用私钥 N、D

  • 此时,小明将 C = 2790 传递给小王,小王使用私钥进行解密:
// 解密使用下列公式
C^DM (mod N)// 代入 N,D (3233,2753) 你会发现 M 就是我们加密的原文信息
2790 ^ 2753 = M (mod 3233)M = 65

如何证明 CD ≡ M (mod N) 成立

// 根据加密规则
M^EC (mod N)C = (M^E - KN)// 将 C 带入解密公式
(M^E - KN)^DM (mod N)// 等同于
M^(ED)M (mod N)// 由于 ED - 1 = Kφ(N)  则 ED = Kφ(N) + 1 代入得到
M^(Kφ(N) + 1)M (mod N)# 下面分为两种情况来证明
1M N 为互质关系
由欧拉定理 M^φ(N)1 (mod N) 可得(M^φ(N))^K * MM (mod N) 原式得到证明2M N 不为互质关系
这里就不写证明过程了,感兴趣的朋友可以自己尝试推导一下。

其它

为什么 RSA 加密算法可靠性如何保证

从上面我们可以看到一共涉及:
P Q N φ(N) E DNE 为公钥,ND 为私钥
因此,其中最关键的是 D,若 D 泄漏相当于私钥泄漏。// 在已知 N、E 条件下可以推导出 D?
1、由 ED = 1 (mod φ(N)) 可知,需要知道 φ(N) 才可以算出 D
2、φ(N) = φ(P) * φ(Q) = (P - 1)*(Q -1) 和欧拉公式可知,想要计算 φ(N) 一定要对 N 进行质因数分解但是大数的质因数分解十分困难,只有使用暴力破解的方式,目前报道被破解的最长RSA密钥就是768位,因此可以说 1024 位长度的秘钥基本安全,2048 位秘钥非常安全。当然,如果出现其它有效分解大数质因数的方法,或者计算机算力提高,比如量子计算机,那么 RSA 也是不安全的。

RSA 的复杂性导致加密过程十分慢,如何优化

  • 因此实际使用过程中,一般使用 RSA 算法加密对称秘钥,方便对称秘钥的传输,使用对称秘钥加密实际传输的信息。比如常见的 HTTPS。

个人简介

👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

📖 保持关注我的博客,让我们共同追求技术卓越。

相关文章:

  • java.lang.NoClassDefFoundError: javax/servlet/Filter
  • hive sql 遇到的一些函数使用
  • elementui el-upload 上传文件
  • 引擎系统设计思路 - 用户态与系统态隔离
  • LeetCode 501. 二叉搜索树中的众数【二叉搜索树中序遍历+Morris遍历】简单
  • PHP服务器端电商API原理及示例讲解(电商接口开发/接入)
  • diffusers-Load pipelines,models,and schedulers
  • #stm32整理(一)flash读写
  • pytorch 笔记:GRU
  • 0基础学习PyFlink——使用DataStream进行字数统计
  • Java操作word
  • 服务器遭受攻击如何处理(记录排查)
  • Redis入门02-基础概念
  • 分类预测 | Matlab实现KOA-CNN-BiLSTM-selfAttention多特征分类预测(自注意力机制)
  • 亲测解决Pytorch TypeError: object of type ‘numpy.int64‘ has no len()
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • @jsonView过滤属性
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • C++类的相互关联
  • export和import的用法总结
  • express + mock 让前后台并行开发
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java知识点总结(JavaIO-打印流)
  • Linux中的硬链接与软链接
  • PAT A1050
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 动态魔术使用DBMS_SQL
  • 多线程事务回滚
  • 给github项目添加CI badge
  • 前端存储 - localStorage
  • 微信小程序:实现悬浮返回和分享按钮
  • 用jquery写贪吃蛇
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $jQuery 重写Alert样式方法
  • (分享)自己整理的一些简单awk实用语句
  • (强烈推荐)移动端音视频从零到上手(下)
  • ... 是什么 ?... 有什么用处?
  • .net 按比例显示图片的缩略图
  • .Net接口调试与案例
  • .NET中使用Redis (二)
  • .ui文件相关
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [C]整形提升(转载)
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [Head First设计模式]策略模式
  • [Java][Liferay] File system in liferay
  • [JavaWeb]—Spring入门
  • [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列
  • [NOIP2007 普及组] 纪念品分组--贪心算法