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

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换

本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。

加密数据的方法可以分为两种:加密和解密都使用相同密钥的“共享密钥加密”和分别使用不同密钥的“公开密钥加密”。以下将分别介绍。

共享密钥加密

共享密钥加密是加密和解密都使用相同密钥的一种加密方式。由于使用的密钥相同,所以这种算法也被称为**“对称加密”**。

在这里插入图片描述

假设 A 准备通过互联网向 B 发送数据。由于有被窃听的风险,所以需要把想要保密的数据加密后再发送。A使用密钥加密数据后再发送给B。B 收到密文后,使用相同的密钥对其进行解密。这样,B 就取得了原本的数据。只要是加密好的数据,就算被第三者恶意窃听也无须担心。

*实现共享密钥加密的算法有凯撒密码、AES、DES、动态口令等,其中 AES 的应用最为广泛。

AES: Advanced Encryption Standard

DES: Data Encryption Standard

共享密钥加密中存在的问题

在这里插入图片描述

B收到A发送密文时,密文可能已经被窃听。假设A和B无法直接沟通,B不知道加密时使用的什么密钥。A 需要通过某种手段将密钥交给 B。和密文一样,A 又在互联网上向 B 发送了密钥。B 使用收到的密钥对密文进行解密。但是,该密钥也有可能会被 X 窃听。这样一来, X 也可以使用密钥对密文进行解密了。

在这里插入图片描述

为了解决这个问题,需要找到可以把密钥安全送出的方法,即“密钥分配问题”。要想解决这个问题,可以使用**“密钥交换协议”“公开密钥加密”**两种方法。

公开密钥加密

公开密钥加密是加密和解密使用不同密钥的一种加密方法。由于使用的密钥不同,所以这种算法也被称为“非对称加密”。加密用的密钥叫作**“公开密钥”**,解密用的叫作“私有密钥”。

在这里插入图片描述

假设 A 准备通过互联网向 B 发送数据。首先,需要由接收方 B 来生成公开密钥 P 和私有密钥 S 。然后把公开密钥发送给A。A 使用 B 发来的公开密钥加密数据。A 将密文发送给 B,B 再使用私有密钥对密文进行解密。这样,B 就得到了原本的数据。

在这里插入图片描述

*实现公开密钥加密的算法有RAS 算法、椭圆曲线加密算法等,其中使用最为广泛的是 RSA 算法。

与共享密钥加密不同的是, 公开密钥加密不会出现密钥分配问题。

公开密钥和密文都是通过互联网传输的,因此可能会被 X 窃听。但是,使用公开密钥无法解密密文,因此 X 也无法得到原本的数据。

在这里插入图片描述

此外,在和多人传输数据时,使用公开密钥加密十分方便。

在这里插入图片描述

公开密钥是不怕被人知道的,所以 B 可以把公开密钥发布在网上。与此相反,私有密钥不能被人知道,必须严密保管。假设有许多人都想向 B 发送数据。想发送数据的人首先在网上取得 B 发布的公开密钥。然后用它加密要发送的数据。最后把密文发给 B。

B 用私有密钥对收到的密文进行解密,取得原本的数据。这种情况就不需要为每个发送对象都准备相对应的密钥了。需要保密的私有密钥仅由接收方保管,所以安全性也更高。

在这里插入图片描述

公开密钥加密中存在的问题

“中间人攻击“

在这里插入图片描述

X 把公开密钥 PB 替换成自己的公开密钥 PX。A 使用公开密钥 PX 对数据加密。当A把想要给B的密文发送出去后,X接收了这个密文。这个密文由X 生成的公开密钥PX 加密而成,所以 X 可以用自己的私有密钥 SX 对密文进行解密。接下来,X 用 B 生成的公开密钥 PB 加密数据。X把密文发送给B,这个密文由B发出的公开密钥PB 加密而成,所以B可以用自己的私有密钥 SB 来解密。

从收到密文到解密密文都没发生任何问题,因此 B 也意识不到数据已经被窃听。


公开密钥的可靠性会出现问题,就是因为 A 无法判断收到的公开密钥是否来自 B。要想解决这个问题,就要用到之后会讲到的**“数字证书”**。

公开密钥加密还有一个问题,那就是加密和解密都比较耗时,所以这种方法不适用 于持续发送零碎数据的情况。要想解决这个问题,就要用到**“混合加密”**。

*考虑到加密所需的计算流程,算法必须满足如下条件。

① 可以使用某个数值对数据进行加密(计算)。

② 使用另一个数值对加密数据进行计算就可以让数据恢复原样。

③ 无法从一种密钥推算出另一种密钥。

混合加密

共享密钥加密存在无法安全传输密钥的密钥分配问题公开密钥加密又存在加密解密速度较慢的问题。结合这两种方法以实现互补的一种加密方法就是混合加密

在这里插入图片描述

在混合加密中,要用处理速度较快的共享密钥加密对数据进行加密。不过,加密时使用的密钥,则需要用没有密钥分配问题的公开密钥加密进行处理。

在这里插入图片描述

使用处理速度较快的共享密钥加密对数据进行加密。加密时所用的密钥在解密时也要用到,因此 A 需要把密钥发送给 B。将密钥通过公开密钥加密进行加密后,A 就可以将其安全地发送给 B 了。因此,作为接收方,B 需要事先生成公开密钥 P 和私有密钥 S 。然后,B 将公开密钥发送给 A。

在这里插入图片描述

A 使用收到的公开密钥,对共享密钥加密中需要使用的密钥进行加密,并将加密后的密钥法发送给B。B 使用私有密钥对密钥进行解密。

在这里插入图片描述

接下来,A 只要将使用这个密钥加密好的数据发送给 B 即可。加密数据时使用的是处理速度较快的共享密钥加密。

像这样,混合加密在安全性和处理速度上都有优势。能够为网络提供通信安全的 SSL 协议也应用了混合加密方法。SSL 是 Secure Sockets Layer(安全套接层)的简写,该协议经过版本升级后,现在已正式命名为 TLS(Transport Layer Security,传输层安全)。但是,SSL 这个名字在人们心中已经根深蒂固,因此该协议现在也常被称为 SSL 协议或者 SSL / TLS 协议。

迪菲-赫尔曼密钥交换

迪菲 - 赫尔曼(Diffie-Hellman)密钥交换是一种可以在通信双方之间安全交换密钥的方法。这种方法通过将双方共有的秘密数值隐藏在公开数值相关的运算中,来实现双方之间密钥的安全交换。

在这里插入图片描述

假设有一种方法可以合成两个密钥。使用这种方法来合成密钥 P 和密钥 S,就会得到由这两个密钥的成分所构成的密钥 P-S。这种方法有三个特征:

一、即使持有密钥 P 和合成的密钥 P-S, 也无法把密钥 S 单独取出来。即密钥之间可以合成,但不能分解。

二、不管是怎样合成而来的密钥,都可以把它作为新的元素,继续与别的密钥进行合成。即使用密钥 P 和密钥 P-S,还能合成出新的密钥 P-P-S。

三、密钥的合成结果与合成顺序无关,只与用了哪些密钥有关。如下图。

在这里插入图片描述

应用实例:

在这里插入图片描述

通过图示方法,A 和 B 都得到了密钥 P-SA-SB。这个密钥将作为 “加密密钥”和“解密密钥”来使用。

在这里插入图片描述

由于密钥无法被分解, 所以 X 无法取得私有密钥 SA 和 SB。在公开的密钥中,X无法用自己 窃听到的密钥合成出 P-SA-SB,因此这种交换方式是安全的。

在这里插入图片描述

以上用公式来表示这种密钥交换法。用 P、G 两个整数来表示一开始生成的公开密钥 P。其中 P 是一 个非常大的素数,而 G 是素数 P 所对应的生成元(或者“原根”)中的一个。

A 和 B 分别准备了各自的秘密数字 X 和 Y。X 和 Y 都必须小于 P-2。

A 和 B 分别计算“(G 的 秘密数字次方)mod P”。mod 运算就是取余运算 。“ G mod P”就是计算G 除以P 后的余数。此处的运算等同于概念意义上的“合成”

然后,A和B交换以上计算结果,并计算这个值的秘密数字次方,然后再mod P。最后会得到相同结果。

在这里插入图片描述

同理,窃听者X无法获得最终结果。


*根据素数 P、生成元 G 和“G^X mod P”求出 X 的问题就是“离散对数问题”,人们至今还未找到这个问题的解法,而迪菲 - 赫尔曼密钥交换正是利用了这个数学难题。

实际上,双方并没有交换密钥,而是生成了密钥。因此,该方法又被叫作**“迪菲 - 赫尔曼密钥协议”**。

参考资料:我的第一本算法书 (石田保辉 宮崎修一)

相关文章:

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换

安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…...

MYSQL练题笔记-高级字符串函数 / 正则表达式 / 子句-简单3题

这个系列先写了三题,比较简单写在一起。 1.修复表中的名字相关的表和题目如下 看题目就知道是有关字符串函数的,于是在书里查询相关的函数,如下图,但是没有完全对口的函数,所以我还是去百度了。 然后发现结合上面的4个…...

vue扭蛋机抽奖游戏

简易扭蛋机demo 这是一个使用CSS3和JavaScript实现的扭蛋机抽奖游戏。该游戏的主要功能是通过点击按钮进行抽奖,抽奖过程中会显示滚动的小球,最终随机停止并显示一个中奖小球。 该游戏的抽奖过程如下: 当用户点击抽奖按钮时,首先检查当前是否正在进行抽奖任务或者当前有小…...

代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数

二叉树专题,重点掌握后续的递归和中间节点的处理。 104. 二叉树的最大深度 - 力扣(LeetCode) 本题在前一章已经解决了层序遍历的解法,现在来聊一下递归法。 首先需要明确两个概念:深度和高度。(注意&…...

༺༽༾ཊ—设计-简介-模式—ཏ༿༼༻

我对设计模式的理解就是一种可复用的且面向对象的设计工具,它与代码无关,我们可以利用设计模式设计出高内聚、低耦合的应用程序,并且最大程度实现程序的复用,以应对复杂的需求变化。 程序的可复用性就是用已存在的程序模块进行更新…...

Matplotlib快速入门,Python通用的绘图工具库上手

Matplotlib是一个用于Python编程语言的综合性绘图库。 它可以生成各种类型的图表,包括折线图、条形图、散点图、直方图、饼图等。Matplotlib支持多种数据格式,包括NumPy数组、Pandas DataFrame和CSV文件。它还可以从URL读取数据。 Matplotlib可以在交互…...

Linux 基本语句_16_Udp网络聊天室

代码&#xff1a; 服务端代码&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <unistd.h> #include <string…...

使用ffmpeg命令进行视频格式转换

1 ffmpeg介绍 FFmpeg 是一个非常强大和灵活的开源工具集&#xff0c;用于处理音频和视频文件。它提供了一系列的工具和库&#xff0c;可以用于录制、转换、流式传输和播放音频和视频。 FFmpeg 主要特点如下&#xff1a; 格式支持广泛&#xff1a;FFmpeg 支持几乎所有的音频和视…...

Mac安装Adobe AE/pr/LR/ai/ps/au/dw/id 2024/2023报错问题解决(常见错误:已损坏/2700/146/130/127)

1.打开允许“允许任何来源” 如何打开允许任何来源&#xff1f;在 Finder 菜单栏选择 【前往】 – 【实用工具 】&#xff0c;找到【终端】程序&#xff0c;双击打开&#xff0c;在终端窗口中输入&#xff1a;sudo spctl --master-disable 输入代码后&#xff0c;按【return …...

Python三级 每周练习题31

如果你感觉有收获&#xff0c;欢迎给我微信扫打赏码 ———— 以激励我输出更多优质内容 练习一: 作业1:编写程序&#xff0c;在下面的字典中找出身高137的同学并输出姓名&#xff0c;如果没找到&#xff0c; 输出没有 a{‘小赵’:136,‘小钱’:141,‘小孙’:146,‘小李’:13…...

【DataSophon】大数据服务组件之Flink升级

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&am…...

Android笔记(十八):面向Compose组件结合Retrofit2和Rxjava3实现网络访问

一、Retrofit2 Square公司推出的Retrofit2库&#xff08;https://square.github.io/retrofit/&#xff09;&#xff0c;改变了网络访问的方式。它实现了网络请求的封装。Retrofit库采用回调处理方式&#xff0c;使得通过接口提交请求和相应的参数的配置&#xff0c;就可以获得…...

mybatis中oracle的sql没走索引导致特别慢(未加jdbcType的)

如果直接跑sql是能走索引很快&#xff0c;在mybatis中不能&#xff0c;可能就是jdbcType的原因。 比如&#xff0c;我有一个属性A&#xff0c;在表里面是VARCHAR2类型&#xff0c;但是在mybatis中的sql是#{a}&#xff0c;缺少jdbcTypeJdbcType.VARCHAR&#xff0c;就会导致myba…...

QT自带打包问题:无法定位程序输入点?metaobject@qsound

文章目录 无法定位程序输入点?metaobjectqsound……检查系统环境变量的配置&#xff1a;打包无须安装qt的文件 无法定位程序输入点?metaobjectqsound…… 在执行release打包程序后&#xff0c;相应的release文件夹下的exe文件&#xff0c;无法打开 如有错误欢迎指出 检查系…...

7.3 lambda函数

一、语法 1.基础语法 [capture](paramLists) mutable ->retunType{statement} capture。捕获列表&#xff0c;用于捕获前文的变量供lambda函数中使用&#xff0c;可省略。(paramLists)。参数列表&#xff0c;可省略。mutable。lambda表达式默认具有常量性&#xff0c;可以…...

dcoker-compose一键部署EFAK —— 筑梦之路

简介 EFAK&#xff08;Eagle For Apache Kafka&#xff0c;以前称为 Kafka Eagle&#xff09;是一款由国内公司开源的Kafka集群监控系统&#xff0c;可以用来监视kafka集群的broker状态、Topic信息、IO、内存、consumer线程、偏移量等信息&#xff0c;并进行可视化图表展示。独…...

音视频:Ubuntu下安装 FFmpeg 5.0.X

1.安装相关依赖 首可选一&#xff1a; sudo apt-get update sudo apt-get install build-essential autoconf automake libtool pkg-config \libavcodec-dev libavformat-dev libavutil-dev \libswscale-dev libresample-dev libavdevice-dev \libopus-dev libvpx-dev libx2…...

【LSM tree 】Log-structured merge-tree 一种分层、有序、面向磁盘的数据结构

文章目录 前言基本原理读写流程写流程读流程 写放大、读放大和空间放大优化 前言 LSM Tree 全称是Log-structured merge-tree, 是一种分层&#xff0c;有序&#xff0c;面向磁盘的数据结构。其核心原理是磁盘批量顺序写比随机写性能高很多&#xff0c;可以通过围绕这一原理进行…...

配置OSPF与BFD联动示例

定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种用于检测转发引擎之间通信故障的检测机制。 BFD对两个系统间的、同一路径上的同一种数据协议的连通性进行检测&#xff0c;这条路径可以是物理链路或逻辑链路&#xff0c;包括隧道。 …...

01到底应该怎么理解“平均负载”

1、如何了解系统的负载情况&#xff1f; 每次发现系统变慢时&#xff0c; 我们通常做的第⼀件事&#xff0c; 就是执⾏top或者uptime命令&#xff0c; 来了解系统的负载情况。 ⽐如像下⾯这样&#xff0c; 我在命令⾏⾥输⼊了uptime命令&#xff0c; 系统也随即给出了结果。 …...

jmeter,动态参数之随机数、随机日期

通过函数助手&#xff0c;执行以下配置&#xff1a; 执行后的结果树&#xff1a; 数据库中也成功添加了数据&#xff0c;对应字段是随机值&#xff1a;...

uniApp常见知识点-问题答案

1、uniApp中如何进行页面跳转&#xff1f; 答案&#xff1a;可以使用 uni.navigateTo、uni.redirectTo 和 uni.reLaunch 等方法进行页面跳转。其中&#xff0c;uni.navigateTo可以实现页面的普通跳转&#xff0c; uni.redirectTo可以实现页面的重定向跳转&#xff0c; uni.reL…...

云原生基础入门概念

文章目录 发现宝藏云原生的概念云原生的关键技术为何选择云原生&#xff1f;云原生的实际应用好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 云原生的概念 当谈及现…...

一个 tomcat 下如何部署多个项目?附详细步骤

一个tomcat下如何部署多个项目&#xff1f;Linux跟windows系统下的步骤都差不多&#xff0c;以下linux系统下部署为例。windows系统下部署同理。 1 不修改端口&#xff0c;部署多个项目 清楚tomcat目录结构的应该都知道&#xff0c;项目包是放在webapps目录下的&#xff0c;那…...

pycharm强制让terminal停止执行的快捷键

CtrlC即可...

MFC(Microsoft Foundation Classes)中 MessageBox

在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;MessageBox是一个常用的对话框类&#xff0c;用于显示消息框并与用户进行交互。MessageBox类提供了多种用法和选项&#xff0c;以下是一些常见的用法和示例说明&#xff1a; 显示简单的消息框&#x…...

如何让.NET应用使用更大的内存

我一直在思考为何Redis这种应用就能独占那么大的内存空间而我开发的应用为何只有4GB大小左右&#xff0c;在此基础上也问了一些大佬&#xff0c;最终还是验证下自己的猜测。 操作系统限制 主要为32位操作系统和64位操作系统。 每个进程自身还分为了用户进程空间和内核进程空…...

【从零开始学习JVM | 第九篇】了解 常见垃圾回收器

前言&#xff1a; 垃圾回收器&#xff08;Garbage Collector&#xff09;是现代编程语言中的一项重要技术&#xff0c;它提供了自动内存管理的机制&#xff0c;极大地简化了开发人员对内存分配和释放的繁琐工作。通过垃圾回收器&#xff0c;我们能够更高效地利用计算机的内存资…...

Wordle 游戏实现 - 使用 C++ Qt

标题&#xff1a;Wordle 游戏实现 - 使用 C Qt 摘要&#xff1a; Wordle 是一款文字猜词游戏&#xff0c;玩家需要根据给定的单词猜出正确的答案&#xff0c;并在限定的次数内完成。本文介绍了使用 C 和 Qt 框架实现 Wordle 游戏的基本思路和部分代码示例。 引言&#xff1a;…...

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…...

做58推广网站找哪家好/独立网站

原标题&#xff1a;全市第一&#xff01;镇江新区新建成6家省级研发机构为进一步促进新区产业发展&#xff0c;推动区内研发机构提档升级&#xff0c;提升企业自主创新能力&#xff0c;新区科信局持续推动省级企业工程技术研究中心培育申报工作。2020年全区共申报省级企业工程技…...

广东省建设工程金匠奖公布网站/百度手机助手下载2021新版

为什么80%的码农都做不了架构师&#xff1f;>>> 原理 很多网站为了实现即时聊天&#xff0c;使用的是轮询方式&#xff08;在特定的时间间隔&#xff0c;由浏览器向服务器端发出 Http request&#xff0c;然后由服务器返回最新的数据&#xff09;实现。这种传统的 …...

上海市建设管理委员会网站/百度超级链数字藏品

面试中经常问到的一个问题&#xff1a;StringBuilder和StringBuffer的区别是什么&#xff1f;我们非常自信的说出&#xff1a;StringBuilder是线程安全的&#xff0c;StirngBuffer是线程不安全的面试官&#xff1a;StringBuilder不安全的点在哪儿&#xff1f;这时候估计就哑巴了…...

从用户需求看b2b网站的营销策略/福州百度推广电话

7.1 HBase与Hive的对比 1.Hive (1) 数据分析工具 Hive的本质其实就相当于将HDFS中已经存储的文件在Mysql中做了一个双射关系&#xff0c;以方便使用HQL去管理查询。 (2) 用于数据分析、清洗 Hive适用于离线的数据分析和清洗&#xff0c;延迟较高。 (3) 基于HDFS、MapReduce Hi…...

网站上漂亮的甘特图是怎么做的/交易平台

C11产生随机数 代码 #include <iostream> #include <ctime> #include <random> #include <algorithm>using namespace std;/*随机数的结果一样*/ void generate_random_1(int num){default_random_engine e; /*未用时间初始化种子&#xff0c;所以每…...

做网站流量怎么赚钱吗/seo的外链平台有哪些

大数加法 对于加法来说&#xff0c;思路和阶乘的一样&#xff0c;就是每一位每一位地依次来看。 首先把两个数都装进数组里&#xff0c;同时比较长度&#xff0c;&#xff08;len1比len2长则之后只是依次加到len1长度&#xff09;&#xff0c;如果某位相加的结果>10&#…...