对称密码中的密钥是如何实现安全配送的?

devtools/2024/9/25 3:27:07/

对称密码在设计时就存在一个天然的缺陷,就是要求通信双方都要持有相同的密钥。确保密钥的安全传输和防止密钥泄露,往往比加密算法本身更为复杂和困难。一旦密钥被第三方获取,通信的安全性就会受到严重威胁,从而可能暴露敏感信息。接下来跟随博主一起来探索下如何在不安全网络传输通道中实现密钥共享。

1. 什么是密钥配送问题

密钥配送问题是指在对称密码算法中,加密和解密使用同一个密钥,发送方必须设法将密钥安全地发送给接收方,而不会被第三方窃听者截获。如果密钥被窃取,那么加密的数据也会被破解,因此密钥的安全配送成为对称密码算法的一个关键问题

为了解决这个问题,密码学领域发展出了多种策略和解决方案。下面分别介绍几种主要的方法:

  • 通过通信双方事先共享密钥密钥来解决
  • 通过密钥分配中心(KDC)来解决
  • 通过密钥交换Diffie-Hellman(DH)来解决
  • 通过公钥密码来解决

为了让以下讲解更容易被大家理解,我们假设有如下场景:Alice在网上认识了Bob,现在Alice想给Bob发一封邮件,Alice不想让别人知道邮件的内容,所以她采用了对称密码算法。

接下来Alice就需要想办法让对称密码(此处也可称为密钥或加密密钥) 通过安全的方式提供给Bob。

Alice与Bob采用对称密码方式通信

2. 如何解决密钥配送问题?

2.1. 通过通信双方事先共享密钥来解决

事先共享是指事先用安全的方式将密钥交给对方。这种方法最为简单,但却存在以下局限

  • 地理位置限制:如果Alice和Bob家距离较近,Alice找到Bob,直接告诉他密钥就可以了。如果他们相距较远,就很难事先共享密钥了。通信双方地理位置较远
  • 记录和管理困难:即使能够实现事先共享密钥,但在人数较多的场景下,通信所需要的密钥数量也会增大,记录和管理如此多的密钥将变更非常困难。比如果Alice除了和Bob发加密邮件,还和另外1000个网友发加密邮件,那么Alice就需要记忆和管理1000个密钥,对于Alice来说,这几乎不可能。

2.2. 通过密钥分配中心(KDC)来解决

若所有参与通信的双方都要事先共享密钥,从而导致密钥的数量巨大,可以使用密钥分配中心(Key Distribution Center,KDC)来解决密钥配送问题。密钥分配中心会给每个人生成一个通信密钥,每个人只要和KDC事先共享密钥就可以了。

:实质上是把数量巨大的密钥交给KDC记录和管理了,每个人只需要记录自己与KDC的事先共享密钥。

有了KDC后,Alice向Bob发送加密邮件时,具体的步骤如下:

  1. Alice向KDC发出希望与Bob进行通信的请求。
  2. KDC生成一个会话密钥S,用于Alice和Bob在本次通信中用于加解密邮件;
  3. KDC从数据库中取出Alice的密钥A和Bob的密钥B
  4. KDC用Alice的密钥(KDC与Alice的事先共享密钥A)对会话密钥S进行加密,并发送给Alice;
  5. KDC用Bob的密钥(KDC与Bob的事先共享密钥B)对会话密钥S进行加密,并发送给Bob;
  6. Alice对来自KDC的会话密钥(己使用Alice的密钥A加密)进行解密,得到会话密钥S
  7. Alice用会话密钥S对邮件进行加密,并将邮件发送给Bob;
  8. Bob对来自KDC的会话密钥(己使用Bob的密钥B加密)进行解密,得到会话密钥S
  9. Bob用会话密钥S对来自Alice的加密邮件进行解密。
  10. Alice和Bob删除会话密钥S

KDC工作原理

上图为在KDC的参与下,Alice与Bob的加密通信过程。虽然KDC有效,但也存在局限

  • 所有的加密通信都由KDC处理,随着通信参与方增多,KDC的负荷也随之增加,可能出现单点故障导致整个加密通信平台瘫痪;
  • 如果 KDC被攻破,所有的通信都会被攻击者破译

2.3. 通过密钥交换Diffie-Hellman(DH)来解决

Diffie-Hellman密钥交换是1976年由Whitfield Diffie和Martin Hellman共同发明的一种算法。通过此算法,通信双方仅通过交换一些可公开的信息就能够生成出共享密钥了。

虽然这种算法被称为密钥交换,但双方并没有真正的交换过密钥,而是通过计算生成了一个相同的共享密钥。因此,这种算法也被称为Diffie-Hellman密钥协商

DH密钥交换流程

由于Diffie-Hellman密钥协商原理比较复杂,一两句话说不清楚,在本文就不展开介绍了,如果大家感兴趣可以参阅博主文章《一文读懂密钥交换(DH、ECDH)算法(附密码国标下载)》。

2.4. 通过公钥密码来解决

在公钥密码中加密密钥(公钥)和解密密钥(私钥)是不同的。加密密钥是可以公开的,任何知道加密密钥的人都可以进行加密,但只有拥有解密密钥的人才能解密。

公钥密码原理

为了解决Alice与Bob的加密通信问题,Bob可以将加密密钥(公钥)发送给Alice,即便此加密密钥被他人窃取也关系不大,因为只有Bob才有解密密钥(私钥)。这样一来,其实就不存在密钥配送问题了。即采用公钥密码替代对称密钥可以解决密钥配送问题。

当然还有一种比较好的实践方法(HTTPS通信中常用的方式),即将对称密码的共享密钥通过公钥密码(用对方的公钥加密共享密钥)来配送,由于步骤与公钥密码类似(仅把公钥密码中通信的消息换成了共享密钥),具体工作流程如下图。

通过公钥密码来执行密钥配送

需要注意的是,如果采用了公钥密码来进行密钥配送,就又会涉及到数字证书和数字签名问题。若想了解更多关于公钥密码、数字签名和数字证书的细节,可以参阅博文:

  • 《一文彻底搞懂公钥密码、数字签名和数字证书》



http://www.ppmy.cn/devtools/116784.html

相关文章

Mac 上,终端如何开启 proxy

文章目录 为什么要这么做前提步骤查看 port查看代理的port配置 bash测试 为什么要这么做 mac 上的终端比较孤僻吧,虽然开了,但是终端并不走🪜…产生的现象就是,浏览器可以访问🌍,但是终端不可以访问&#…

大数据Flink(一百二十):Flink SQL自定义函数(UDF)

文章目录 Flink SQL自定义函数(UDF) 一、概述 二、​​​​​​​自定义标量函数(UDSF) 三、​​​​​​​​​​​​​​自定义聚合函数(UDAF) 四、 ​​​​​​​​​​​​​​自定义表值函数(UDTF) Flink SQL自定义函数…

自动化学习3:日志记录及测试报告的生成--自动化框架搭建

一.日志记录 1.配置文件pytest.ini:将日志写入文件方便日后查询或查看执行信息。 需要将文件处理器(文件存放位置/时间/格式等等)添加到配置文件中的【日志记录器】 # pytest.ini [pytest] # ---------------日志文件,需要配合…

力扣算法题总结

lc253 题目:求最多重叠(x,y)的数量 思路:按y排序,把y放入优先队列,逐个比较x,x大于优先队列的堆顶元素就弹出堆顶。 lc148 题目:对链表排序 思路:归并排序。快慢指针找到链表中点&#xff0c…

为什么现在的LLM都是Decoder only的架构?

在我看来,Encoder-Decoder架构和Decoder only架构的主要区别,在于它们的灵活性和专业性有所差别。 Encoder-Decoder架构通常用于处理一些需要在输入和输出间建立精确映射的任务,比如机器翻译、文本摘要等。在这些任务中,理解输入…

蓝桥杯算法之暴力

暴力 1.十进制数转换成罗马数字 2.判断给出的罗马数字是否正确 小知识 %(模除): % 符号用作模除(或取模)运算符。模除运算是一种数学运算,它返回两个数相除的余数。 具体来说,如果 a 和 b 是…

Android CarrierConfig 配置问题的解决流程

开发步骤 确认代码路径 查看编译用的CarrierConfig APK在项目代码的path,一般是源码或者厂商定制的: packages/apps/CarrierConfig/vendor/mediatek/proprietary/packages/apps/CarrierConfig Note:一些overlay的方式是替换xml文件&#…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器,同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…