DH 密钥交换算法

1、引言

CSDN搞什么短信验证,7年的账号居然登陆不了,真心抓狂,WTF!!!!

DH,全称为“Diffie-Hellman”,这是一种确保共享KEY安全穿越不安全网络的方法,换句话说就是密钥一致协议,由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。

简单的说就是允许两名用户在公开媒体上交换信息以生成“一致”的、可以共享的密钥。也就是由甲方产出一对密钥(公钥、私钥),乙方依照甲方公钥产生乙方密钥对(公钥、私钥)。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。

2、DH密钥交换模型分析

那具体是怎样的一个流程呢?我们还是以甲乙双方发送数据为模型进行分析

  • 1、甲方(消息发送方,下同)构建密钥对(公钥+私钥),甲方公布公钥给乙方(消息接收方,下同)
  • 2、乙方以甲方发送过来的公钥作为参数构造密钥对(公钥+私钥),将构造出来的公钥公布给甲方
  • 3、甲方用“甲方的私钥+乙方的公钥”构造本地密钥
  • 4、乙方用“乙方的私钥+甲方的公钥”构造本地的密钥
  • 5、这个时候,甲乙两方本地新构造出来的密钥应该一样,甲乙双方可以通过本地密钥进行数据的加密和解密
  • 6、然后就可以使用AES这类对称加密算法进行数据的安全传送了。

3、DH密钥交换算法数学原理

有两个全局公开的参数,一个素数p和一个整数g,g是p的一个原根。

服务端的私钥和公钥分别是a和A,客户端的私钥和公钥分别是b和B;

服务端根据a、p、g,可以计算出公钥A;

服务端将g, p, A明文传送给客户端,客户端可以计算自己的公钥B,以及共享密钥K;

客户端将B明文发送给服务端,服务端也可以计算出共享密钥K。

4、中间人攻击

在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务,因此它很容易受到中间人攻击。 
一个中间人“丙”在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和甲,另一次和乙,就能够成功的向甲假装自己是乙,反之亦然。
而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。
有很多种安全身份验证解决方案使用到了迪菲-赫尔曼密钥交换。例如当甲和乙共有一个公钥基础设施时,可以将他们的返回密钥进行签名。

时间: 2024-08-10 06:39:41

DH 密钥交换算法的相关文章

DH密钥交换(Diffie–Hellman key exchange)算法笔记

注意:只是笔记,可能有不正确的地方 ?下文中^代表乘方运算,例如2^3=2*2*2=6,参考:http://zh.wikipedia.org/wiki/%E5%86%AA %代表模运算,例如5%3=2,参考:http://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4? DH密钥交换算法的作用是使通信双方可以在不安全的通道中建立一个相同的密钥,用于加密通信. 基本原理示例: 1.通信方A和通信方B约定一个初始数g,g是公开的,如g=5 2.A生成一个随机数a,a

DH密钥交换和ECDH原理(转)

DH密钥交换和ECDH原理 时间 2013-06-24 18:50:55 CSDN博客相似文章 (0) 原文  http://blog.csdn.net/sudochen/article/details/9164427 下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理. 1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g. 2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个

DiffieHellman(迪菲-赫尔曼)密钥交换算法原理及其实现

本文参考来源https://segmentfault.com/a/1190000010917737与https://zh.wikipedia.org/wiki/%E6%A8%A1%E9%99%A4  及其 https://www.cnblogs.com/DarkValkyrie/p/10962231.html (大佬的这篇文章的基础公式帮了大忙) 什么是Diffie-Hellman密钥交换算法? Diffie-Hellman:一种确保共享KEY安全穿越不安全网络的方法,它是OAKLEY的一个组成

迪菲.赫尔曼(Diffie–Hellman)密钥交换算法

迪菲.赫尔曼算法是通信线路不安全情况下,交换密钥的一个算法,应用于TLS协议中 首先说一下生成密钥的流程,我们有这样一种计算叫做求摸运算 mod, 比如:27 mod 17 = 10,也就是求余数的运算. 现在有两个通信者A和B,我们使用一种计算 假如我们这里选用 3 ^ x mod 17,A和B分别生成一个随机的整数,这个整数即为x,比如A是2,B是3,那么A使用2计算: 3^2 mod 17 = 9 ① B使用3计算: 3^3 mode 17 = 10 ② 然后A将9发送给B,B将10发送给

DH算法

1.通信方A和通信方B约定一个初始数g,如g=5,一个质数p,如p=23,g和p是公开的,且1< g < p 2.A生成一个随机数a,a是保密的,如a=6 3.A计算g^a%p发送给B,g^a%p=5^6%23=8 4.B生成一个随机数b,b是保密的,如b=15 5.B计算g^b%p发送给A,g^b%p=5^15%23=19 6.A接收到g^b%p后,再使用保密的a,计算(g^b%p)^a%p=19^6%23=2 7.B接收到g^a%p后,再使用保密的b,计算(g^a%p)^b%p=8^15%

Diffie_Hellman 密钥商议算法

Diffie-Hellman 算法描述: 目前被许多商业产品交易采用. DH 算法为公开的密钥算法,发明于1976年.该算法不能用于加密或解密,而是用于密钥的传输和分配.      DH 算法的安全性体现在:在有限域上计算离散对数非常困难,或者说:已知gx 和gy,若不知道x和y,则计算gxy是困难的.      离散对数 :定义素数p的原始根(primitive root)为这样一个数,它能生成1~p-1所有数的一个数.现设a为p的原始根,则 a mod p, a2 mod p,…,ap-1 

SSL握手过程

一.SSL握手有三个目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致:2. 它们需要确立一组由那些算法所使用的加密密钥:3. 握手还可以选择对客户端进行认证. 二.SSL握手过程:1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器:2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端:该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数:3. 客户端对服务器的证书进行验证(有关验证证书,可以参考

160829、Java加解密与数字签名

** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二.消息摘要算法加密————主要用于验证数据完整性. MD(消息摘要): SHA(安全散列) JDK实现和MD一样. BC实现如下:(Digest类) CC实现最简单(就是一个DigestUtils的静态方法): MAC(消息认证码)——含有密钥的散列函数算法 兼容MD和SHA的特性,但加入了密钥.

转:加密与解密

加密算法简介 签名算法 应用场景:检查报文正确性 方案:从报文文本中生成报文摘要 常用SHA或者MD5作为签名算法 缺点:签名算法不是加密算法,不能用来加密,作用是检查篡改 对称加密算法 应用场景:传递不适合明文传输的报文 方案:如果用一个密码把消息加密,解密的时候还用这个密码,这种加密算法就是对称加密算法 常用AES加密算法 缺点:密码需要定期更新,带来密码安全传递问题 DH密钥交换算法 应用场景:通信双方需要约定一个密码,但是又必须通过一个不安全的信道传递密码 方案:  发送方私有一个 a