使用Diffie-Hellman算法(非对称加密算法)得到对称加密需要的秘钥

使用Diffie-Hellman算法(非对称加密算法)得到对称加密需要的秘钥目录 0 摘要 1 概述 2 Diffie Hellman 算法原理 2 1Diffie Hellman 算法原理 2 2Diffie Hellman 算法的优缺点转载自原文在原文基础上优化了一下 加上注释 更好读懂 0 摘要非对称加密算法又称公开密钥加密算法 非对称加密是相对于对称加密而言的 对称加密指的是通信双方使用的密钥是一致的 而非对称加密就是算法使用的密钥不一致 非对称加密的好处是当通信双方没有事先协商密钥的情况下也能进行安全通信 而在互联网普及的今天 很多通信双方往往在事先是无法协商好密钥的

0. 摘要

非对称加密算法又称公开密钥加密算法,非对称加密是相对于对称加密而言的,对称加密指的是通信双方使用的密钥是一致的,而非对称加密就是算法使用的密钥不一致。

非对称加密的好处是当通信双方没有事先协商密钥的情况下也能进行安全通信,而在互联网普及的今天,很多通信双方往往在事先是无法协商好密钥的,从而非对称加密算法得到了广泛应用,本文主要阐述Diffie-Hellman密钥交换这一非对称加密算法。

1. 概述

传统的加密通信需要通信双方共享一个密钥,即用于加密和解密的密钥,此种方法的一个问题就是双方必须就共享密钥达成一致,但是共享密钥的传输又需要通信,从而该密钥有着被攻击者窃取的风险。在互联网普及的今天,在网络世界中通信各方之间可能从来没有接触过,即需要一种在没有预先共享密钥的情况下能进行安全通信的方法,即所谓的非对称加密算法。

假设A要和B之间需要通信,但是A与B并未共享一个密钥,在此情况下他们之间如何进行安全通信呢?

为了方便阐述非对称加密的概念,假定通信者A与B共享一个公钥,这个公钥是公开的,任何人都可以获得(对于攻击者来说也是如此),该公钥用Kpublic表示。

A可以持有一个私钥KprivateA,A基于这个私钥KprivateA进行某种运算f,即f(KprivateA,Kpublic)。B也随机生成私钥KprivateB进行运算f即f(KprivateB,Kpublic),紧接着A,B以明文方式交换他们的运算结果(入侵者可以截取到该信息),即此时A获得了f(KprivateB,Kpublic)记为fB,B获得了f(KprivateA,Kpublic) 记为fA。

然后A与B进行运算g,即A运算得到g(fB,KprivateA,Kpublic),B运算得到g(fA,KprivateB,Kpublic),分别记做gA和gB,并且存在着这样的运算使得gA=gB,此时gA和gB分别是A与B的新的私钥,即通信中加密/解密的私钥。

从上面的过程来看A,B之间任何一方都无须分发任何敏感的私钥(初始的私钥是各自持有的,无须在信道上传输)。假定在A,B通信的过程中有一个攻击者C截获了他们之间的报文,显然入侵者只能获取Kpublic,f(KprivateB,Kpublic)与f(KprivateA,Kpublic),而无法获得真正的私钥gA和gB,因此无法解密报文,保证了通信的安全性。下面我们将介绍应用这一过程的算法-Diffie-Hellman密钥交换算法。

2. Diffie-Hellman算法

Diffie-Hellman密钥交换算法基于数论知识,最初由Whitefield与Martin Hellman在1976年提出,该算法本质上是一个确保共享的私钥穿越不安全网络的方法,它基于单向函数这样一个概念,单向函数的基本思想就是单向函数计算起来相对容易,但求逆运算却非常困难。也就是说,已知x, 我们很容易计算f(x), 但已知f(x), 却很难计算出x。Diffie-Hellman算法运用的单向函数是模运算,如下所示:f(x) = x mod p,已知x与p很容易计算f(x),但是已知f(x)与p却很难准确计算出x,因为x的取值非常多,特别是当x和p取很大的值时。

2.1 Diffie-Hellman算法原理

为了方便叙述,假设A和B需要进行安全通信,需要安全地生成一个密钥,而中间有一个攻击者C在窃听,其基本步骤如下:

  1. A和B公开化达成共识,选择数a素数p(质数,只能被1和自己整除的数),假设分别为a=5p=23,可以当成是公钥,这个信息是A,B和攻击者C都掌握的。
  2. A随机选择一个数,记为s1=29,即A的私钥,计算单向函数f(s1) = as1 mod p的值(表示乘方),记为f1(此处计算得17),f1=529 mod 23=17,然后将计算得到的值发送给B。在这个过程中, B得到单项函数的值17,攻击者C也能截获。
  3. B也选择一个数,记为s2=33,即B的私钥, 计算单向函数f(s2) = as2 mod p的值,记为f2(此处计算得22),f2=533 mod 23=22,然后将计算得到的值发送给A。在这个过程中,A得到单向函数的值22,窃听者C也能截获。
  4. 定义函数g1(x)=f2x mod p,A计算g1(s1)的值作为密钥,此例中为g1(29) = 2229 mod 23=22。
  5. 定义函数g2(x)=f1x mod p,B计算g2(s2)的值作为密钥,此例中为g2(33) = 1733 mod 23=22

可以发现g1(x)= g2(x),即(as2 mod p)s1 mod p= (as1 mod p)s2 mod p 。事实上根据数论理论可以证明对任意整数,有上式成立。通信双方只需知道公钥a,p以及交换非敏感信息f1,f2就可以完成密钥交换这一工作,从而在后续的通信中使用生成的密钥来加密/解密信息。

Diffie-Hellman算法的有效性依赖于计算离散对数的难度 ,即此时窃听者尽管能截获f1,f2以及获知所用的公钥,但是想从f1、f2、a与p计算出指数s1,s2是十分困难的,进而也就无法计算出私钥g1,g2。

2.2 Diffie-Hellman算法的优缺点

Diffie-Hellman算法让通信双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥,这个密钥一般作为对称加密的密钥而被双方在后续数据传输中使用。

Diffie-Hellman算法仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会,除对全局参数即公钥的约定外,密钥交换不需要事先约定其它参数,这也是非对称加密的优势所在。

然而Diffie-Hellman算法也有着以下一些缺点:

  1. 通信时没有提供双方身份的任何信息;
  2. 该算法是计算密集性的,因此容易遭受阻塞性攻击,即对手请求大量的密钥时本机会花费了相对多的计算资源来求解参数而不是在做真正的工作;
  3. 没办法防止重演攻击,即攻击者截获了先前的整个过程的通信报文,然后来重演这一过程,向本机重发一模一样的报文;
  4. 容易遭受中间人的攻击,即攻击者C在和A通信时扮演B,在和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听A,B的通信过程;

以上的一些缺点并没有阻止Diffie-Hellman算法在实际工程中的广泛应用,通常可以采用一些辅助技术来弥补上述缺点,如数字签名技术、鉴别协议与MAC(Message Authentication Code)技术等。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228816.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:08
下一篇 2026年3月16日 下午6:08


相关推荐

  • Maven菜鸟教程:Maven仓库的分类[通俗易懂]

    Maven菜鸟教程:Maven仓库的分类[通俗易懂]Maven菜鸟教程中有很多知识点需要大家学习,Maven仓库分类就是其中一点,为了更具体地增加对仓库的理解,这里详细介绍一下各种仓库。本地仓库Maven在根据坐标查找依赖的构件时,先是在本地仓库中查找。默认情况下,不管是Windows操作系统还是Linux操作系统,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的目录,这个目录就是Maven的本地仓库目录。比如,笔者的用户名是Noble,计算机上的默认本地仓库的目录就是C:\Users\Noble.m2

    2025年10月8日
    4
  • unittest 测试框架

    unittest 测试框架一、unittest测试框架1、测试固件1.1setUp()1.2tearDown()2、unittest基本使用3、测试套件(suit)3.1测试用例执行顺序3.2忽略测试用例的执行4、断言5、HTML报告生成5.1测试报告5.2异常捕捉与错误截图5.2.1错误截图:get_scunittest是python的单元测试框架,unittest单元测试提供了创建测试用例,测试套件以及批量执行的方案。作为单元测试的框架,unittest也是可以对程序最小

    2022年10月15日
    5
  • PHP抖音SDK搭建问题整理

    PHP抖音SDK搭建问题整理

    2022年2月15日
    51
  • Nano Banana Pro新出20种邪修玩法,做手办已经落后N个版本了

    Nano Banana Pro新出20种邪修玩法,做手办已经落后N个版本了

    2026年3月15日
    2
  • 解锁开发的未来:Cursor AI 和模型上下文协议 (MCP) 的全面指南

    解锁开发的未来:Cursor AI 和模型上下文协议 (MCP) 的全面指南

    2026年3月15日
    2
  • Neo4j+D3展现的应用实例

    Neo4j+D3展现的应用实例之前已经写过一篇文章简要介绍了图数据库 neo4j 的概念 没看过的读者可以在此点链接 图数据库 Neo4j 简介 本文主要讲解图数据库在真实项目中的实践应用 取自于笔者参与的真实项目代码 后端用的是图数据库 neo4j 来存节点和关系 前端用的是 D3 来画图 前后端交互是通过 json 数据来完成的 即 neo4j 查出的结果组装成 json 后 传递给 D3 来画图

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号