迪菲-赫尔曼密钥交换

  迪菲-赫尔曼密钥交换(英语:Diffie–Hellman key exchange,缩写为D-H) 是一种安全协议,用于双方在一个不安全的通信网络上建立一个 共享的秘钥,有了共享秘钥以后,就可以使用这个密钥加密交互消息。由于通信双方最终使用的密钥相同,所以可以认为该协议目标是创建一个对称密钥。迪菲-赫尔曼密钥交换本身是一个匿名(无认证)的密钥交换协议,它却是很多认证协议的基础,并且被用来提供传输层安全协议的短暂模式中的前向安全性。

  • 密钥交换(创建)过程

 假设A,B两人通信,约定使用同一个有限循环群G和它的一个生成元g。一般过程如下:

  1. A选择一个随机正整数a,计算rga mod p发送给B。
  2. B选择一个随机正整数b,计算rb gb mod p发送给A。
  3. A收到B消息后 计算R1 = (rb)a mod p
  4. B收到A消息后 计算R2 = (ra)b mod p
  5. 由于R1==R2,所以得到同一个值,作为共同的密钥。

为什么R1==R2? 可以推导如下:

R1= (rb)a mod p =(gb mod p)a (gb)a mod p=gab mod p
R2= (ra)b mod p =(ga mod p)(ga)b mod p=gab mod p

得到R1==R2, 这里用到了指数模运算的性质。于是,A和B就同时协商出一个新的群元素,它可以被用作共享秘密。因为群是乘法交换的。

  • 安全性

   在选择了合适的Gg时,这个协议被认为是窃听安全的。偷听者可能必须通过求解迪菲-赫尔曼问题来得到gab。在当前,这被认为是一个困难问题。如果出现了一个高效的解决离散对数问题的算法,那么可以用它来简化a或者b的计算,那么也就可以用来解决迪菲-赫尔曼问题,使得包括本系统在内的很多公钥密码学系统变得不安全。

  在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份认证服务,因此它很容易受到中间人攻击。 一个中间人在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和Alice另一次和Bob,就能够成功的向Alice假装自己是Bob,反之亦然。而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。

  • 算法实现验证

Rust验证代码:

/// calculate a^power % n 实现参考:https://www.cnblogs.com/ajiaoa/p/13673533.html
fn mod_power(a:u32, power:u32,n:u32) -> u32{
    let mut ans = 1;
    let mut t = (a % n) as u64; // 用u64是运算越界考虑
    let mut bit_val = power;
    while bit_val != 0 {
        if bit_val & 0x01 > 0 {
            ans *= t;
            ans %= n as u64;
        }
        bit_val >>= 1;
        t *= t;
        t %= n as u64;
    }
    ans as u32
}

mod tests{
    use::super::*;
    #[test]
    fn diffie_hellman_test(){
        let (g,p) = (17,9777);
        let a = 12;
        let b = 13;
        let a2b = mod_power(g,a,p);
        let b2a = mod_power(g,b,p);
        println!("a2b = {} b2a = {}",a2b,b2a);
        let key_a = mod_power( b2a,a,p);
        let key_b = mod_power(a2b,b,p);
        println!("key_a = {} key_b = {}",key_a,key_b);
        assert_eq!(key_a,key_b);
    }
  /// 结果输出:
  /* a2b = 7717 b2a = 4088 */

     /* key_a = 2842 key_b = 2842 */


}

 

posted @ 2021-11-08 17:46  ~Silence~  阅读(282)  评论(0编辑  收藏  举报