密码技术扫盲:非对称加密

news2024/11/17 21:20:03

个人博客

  • 密码技术扫盲:对称加密
  • 🎯 密码技术扫盲:非对称加密
  • 密码技术扫盲:认证

在上一篇对称加密的介绍中,我们了解到对明文的加密需要使用到密钥,而解密时也必须用到同一把密钥,也就是说发送者和接收者都需要有这把密钥,都可以做加密、解密操作。

我们想要安全地传递信息,所以选择使用密钥对信息进行加密后再传送,这样即使在传递过程被窃听,也不会泄露具体内容。现在接收者收到的是密文,需要经过解密才能得到具体内容,解密需要密钥,问题来了,接收者怎么知道密钥?或者说,双方如何知道同一个密钥?密钥在发送者或接收者手上,那么必然有一个将密钥从一方转移到另一方的过程。到这里,问题就转化为如何安全地配送密钥 —— 称为密钥配送问题。
在这里插入图片描述

这里,两个问题是同质的,只是需要应对的问题规模不一样,问题规模的缩小带来了可操作空间。解决密钥配送问题一般有 4 种方案:

  • 事先共享;
  • 通过密钥配送中心交换;
  • 通过 Diffie-Hellman 算法交换;
  • 通过非对称加密算法交换。

非对称加密的解决方式非常巧妙——也是其名称的由来,非对称加密算法有两个唯一成对的密钥,一个是公钥,对外公开的,一个是私钥,对外保密的,在非对称加密中用一个密钥加密的信息只有对应的另一个密钥才能解密,也就是说,使用公钥加密的信息只有拥有私钥的一方可以解密。任何人拿到公钥,也无法解密被公钥加密的信息,如此就不用保障公钥配送的安全性了。唯一的问题是,如何确认公钥的合法性,确保不被中间人攻击。
在这里插入图片描述

非对称加密算法的代表是 RSA,目前被广泛应用于各种场景,随着近年对个人隐私的关注度提高,聊天工具中又兴起采用非对称加密保障用户聊天内容机密的应用场景,称为 E2EE。和对称加密依赖于异或运算不同,RSA 的加解密机制主要依赖于取模运算(mod)—— 除法之后求余数。

  • RSA 加密:密文 = 明文E mod N
  • RSA 解密:明文 = 密文D mod N

以上两个就是 RSA 算法加解密的公式,其中明文、密文都是数字,公钥就是(E,N)组合,私钥就是(D,N)组合。
在这里插入图片描述

下面看看 E、D、N 是如何计算出来的:

  • ① N = p * q, p、q 为两个挑选出的质数
  • ② L = lcm (p-1, q-1), lcm 表示求最小公倍数,求 E、D 时需要
  • ③ gcd (E, L) = 1, 1 < E < L, gcd 表示求最大公约数
  • ④ (E * D) mod L = 1, 1 < D < L

因为公钥就是(E,N),是公开的,只要求出 D,私钥就被破解了。计算 D 需要知道 L,计算 L 需要知道 p、q,N 是知道的,所以问题核心就是将 N 质因数分解得到 p、q。目前没有发现对大整数进行质因数分解的高效算法,也尚未证明质因数分解是否真是非常困难的问题,甚至不知道是否存在一种分解质因数的简单方法,在现实的时间里,无法对 N 进行质因数分解。RSA 的安全性就在这里。

非对称加密虽然非常优秀,但在采用同等机密性密钥条件下,非对称加解密效率只有对称加密的几百分之一,所以非对称加密算法并不能取代对称加密算法。所以在类似 TLS 这样的混合场景中,会采用非对称加密来传递对称密钥,使用对称加密来加密应用数据,同时兼顾安全性和效率。

在 TLS 中,传递密钥可以选择使用 RSA 进行加密传递,还有一种选择是 Diffie-Hellman 算法,Diffie-Hellman 也很巧妙,有必要写一下:

  • ① 选择一个非常大的质数 P 及其生成元 G(G1-GP-1 mod P 要能映射出所有 1 到 P-1 这 P-1 个数字),P、G 公开
  • ② 发送端生成一个随机数 A,不公开,1 < A < P-2
  • ③ 接收端生成一个随机数 B,不公开,1 < B < P-2
  • ④ 发送端计算 GA mod P 给接收端,接收端计算密钥 (GA mod P)B mod P
  • ⑤ 接收端计算 GB mod P 给发送端,发送端计算密钥 (GB mod P)A mod P
  • ⑥ 最后发送端和接收端都得到密钥 GA*B mod P

在这里插入图片描述

P、G、GA mod P、GB mod P 是公开的,只要能计算出 A 或者 B,算法就被破解了,但目前还没有找到方法 —— 称为有限域的离散对数问题,Diffie-Hellman 的安全性就在这里。这种交换思想值得借鉴,可以用于应用层在 tls 之外再单独和前端约定自己的数据加密密钥。


参考

  • 《图解密码学》

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

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

相关文章

假如编程是魔法之零基础看得懂的Python入门教程

一、前言 几个月前编写了一份python语言入门的博文&#xff0c;近期重新审阅了一遍发现编写的质量太过随意&#xff0c;可能对于一部分人并不是非常友好&#xff0c;故此重新编写Python语言的零基础教程。 本篇教程将会尽量把一些专业术语给读者讲解清楚&#xff0c;并且让读者…

如何成为一个优秀的Python工程师?

众所周知&#xff0c;Python因其优雅而简洁的语言优势而备受程序员的青睐和追捧。随着人工智能、大数据技术的落地&#xff0c;Python工程师也成为了目前薪资待遇高&#xff0c;发展前景好的热门岗位。虽然&#xff0c;Python入门简单&#xff0c;对初学者友好&#xff0c;但是…

52 如何 尽可能的减少 自定义ClassLoader 造成的影响

前言 // 呵呵 很快又该总结 2022 了, 希望这一年也能总结出很多收获 接着 java.lang.Class/java.lang.ClassLoader/InstanceKlass/ClassloaderData 的卸载 可以先看一下 这一篇文章, 明确一下 上下文 这里 主要说的是 如果我们的场景中存在自定义的 classloader 的情况…

Flask + echarts 轻松解决 nginx 日志可视化

最近&#xff0c;线上的业务系统不太稳定&#xff0c;需要分析下访问情况&#xff0c;能拿到的数据只有 nginx 服务器的访问日志&#xff0c;不过难不倒我&#xff0c;用合适的工具&#xff0c;分分钟做出图形化展示&#xff0c;看看怎么做的吧 思路 nginx 访问日志&#xff…

9 CPP结构体注意事项

注意&#xff1a; 1 结构名是标识符 2 结构体的成员可以是任意数据类型 3 定义结构体描述的代码可以放在程序的人和地方&#xff0c;一般放在main函数的上面或头文件中。 4 结构体成员可以用C的类&#xff08;如string&#xff09;&#xff0c;但是不提倡。 5 在C中&#…

java:AES加密和解密

java&#xff1a;AES加密和解密 1 前言 对称加密&#xff0c;即单秘钥加密&#xff0c;指加密和解密的过程中&#xff0c;使用相同的秘钥&#xff0c;相比于非对称加密&#xff0c;因仅有一把钥匙&#xff0c;故而速度更快&#xff0c;更适合解密大文件&#xff08;常见于如视…

ESP32的arduino IDE代码使用flash download tool进行烧录

ESP32的arduino IDE代码使用flash download tool进行烧录前言arduino代码烧录arduino下载了一些什么文件flash download tool工具烧录总结前言 最近遇到用户在使用 arduino IDE开发环境编写了ESP32的代码&#xff0c;希望提供编写好的程序给用户烧录&#xff0c;但是又不希望让…

Kotlin + SpringBoot + JPA 服务端开发

Kotlin SpringBoot JPA 服务端开发 本篇主要介绍一下 kotlin springboot的服务端开发环境搭建 1.概述 Kotlin 是一个基于JVM的编程语言, 是IDEA开发工具 jetbrains 公司开发的语言,也被google选为android开发的首选语言, 因为它是完全兼容Java的 所以也可以做后端开发 比如…

[Java] 如何理解和设置ThreadPoolExecutor三大核心属性?什么情况下工作线程数会突破核心线程数?任务拒绝策略都有哪些?

文章目录前言ThreadPoolExecutor类是什么&#xff1f;ThreadPoolExecutor的三大核心属性1. 核心线程数&#xff08;corePoolSize&#xff09;属性2. 任务队列&#xff08;workQueue&#xff09;属性3. 最大线程数&#xff08;maximumPoolSize&#xff09;属性总结&#xff1a;T…

【开发百宝箱之猿如意使用指南】「工欲成其事,必先利其器」一文教你如何通过“猿如意”便捷的使用数据库管理工具DBeaver

开发百宝箱之猿如意使用指南欢迎您使用“猿如意”百宝箱大家科普一下什么是猿如意&#xff1f;赶快趁热下载个【猿如意】吧每个程序猿值得拥有的学习开发工作必备“良药”没有猿如意的“我们”&#xff08;猿如意帮我们解决了哪些问题&#xff1f;&#xff09;【如何快速下载自…

非零基础自学Golang 第12章 接口与类型 12.2 接口的创建与实现 12.2.1 接口创建

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.2 接口的创建与实现12.2.1 接口创建第12章 接口与类型 12.2 接口的创建与实现 Go语言接口是方法的集合&#xff0c;使用接口是实现模块化的重要方式。 下面将重点介绍如何创建和实现一个Go语言接口。 12…

Pytest用例执行的先后顺序

[内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ 温馨提示 「本篇约1600字&#xff0c;看完需3-5分钟&#xff0c;学习学半小时&#xff0c;加油&#xff01;」 先看普通函数运行顺序 import pytestdef test_one():print("我是清安")def tes…

React学习27(react-redux多组件共享数据)

项目结构 准备工作 1&#xff09;定义一个person组件&#xff0c;和count组件通过redux共享数据 2&#xff09;为person组件编写&#xff1a;reducer &#xff0c;action和contant常量 3&#xff09;重点&#xff1a;Person的reducer和Count的reducer要用combineReducers进行…

深度学习-优化器

优化器 文章目录优化器1. 引言1. SGD1.1 vanilla SGD1.2 SGD with Momentum1.3 SGD with Nesterov Acceleration2. AdaGrad3. RMSProp4. AdaDelta5. Adam优化器选择出处1. 引言 优化算法可以分成一阶优化和二阶优化算法&#xff0c;其中一阶优化就是指的梯度算法及其变种&#…

Linux——vi,vim的使用

三种模式 正常模式 以vi或vim打开一个档案就直接进入一般模式了(这是默认的模式)。在这个模式中&#xff0c;你可以使用 【上下左右】 按键来移动光标&#xff0c;你可以使用 【删除字符】或 【删除整行】来处理档案内容&#xff0c;也可以使用 【复制&#xff0c;粘贴】来处…

3D激光里程计其三:点云畸变补偿

3D激光里程计其三&#xff1a;点云畸变补偿1. 产生原因2. 补偿方法Reference: 深蓝学院-多传感器融合 1. 产生原因 一帧点云&#xff1a;通常指雷达内部旋转一周扫描得到的点的集合。 优点&#xff1a;有足够数量的点云才能进行匹配&#xff0c;且一周正好是周围环境的完整采…

认识Java中的异常处理

文章目录Java异常处理异常体系的介绍常见运行时异常常见编译时异常Java异常处理 异常体系的介绍 什么事异常处理? 异常是程序在“编译”或者“执行”的过程中可能出现的问题&#xff0c;比如: 数组索引越界、空指针异常、 日期格式化异常&#xff0c;等… 注意&#xff1a;语…

常用损失函数

常见损失函数 文章目录常见损失函数引言回归1. 均方差2.平均绝对误差(MAE)3. 均方根误差(RMSE)4. 交叉熵分类二分类多分类引言 无论在机器学习还是深度领域中,损失函数都是一个非常重要的知识点。损失函数&#xff08;Loss Function&#xff09;是用来估量模型的预测值 f(x) 与…

Eslint 8.23 Flat Config 新配置迁移升级指南

前言 直入正题&#xff0c;eslint 目前为止的配置文件格式&#xff08; 如 .eslintrc.js &#xff09; 存在很多无法避免的历史问题&#xff1a; 配置格式混乱&#xff0c;层层不明确的继承&#xff0c;不易理解。 插件配置时不支持实体运用&#xff08;不能传 function / ob…

学完框架后的反思—为什么要使用框架?

学习前端也有一定的时间了,最近在网上看到了一个问题让我反思了很久——为什么要使用前端框架? 我发现自己当初学习框架时并没有想那么多,只是看中了其在业界企业的应用,大部分公司开发页面基本上都是使用框架进行开发的,而最为被大厂广泛接受的就是 React 框架,所以我当…