zoukankan      html  css  js  c++  java
  • 密钥交换之DH算法

    密钥交换/协商机制的几种类型

    依靠非对称加密算法

    原理:拿到公钥的一方先生成随机的会话密钥,然后利用公钥加密它;再把加密结果发给对方,对方用私钥解密;于是双方都得到了会话密钥。

    举例:RSA

    依靠专门的密钥交换算法

    原理:见下图

    举例:DH 算法及其变种(ECDH算法)

    DH算法

    DH算法解决了密钥在双方不直接传递密钥的情况下完成密钥交换,这个神奇的交换原理完全由数学理论支持

    1. Alice选择1个素数p,比如509,底数g 比如5,随机数a比如123
        然后计算 然后计算A=g^a mod p=bcmod(bcpow(5,123),509)=215
        Alice现在有[p=509,g=5,a=123,A=215], 把p,g,A发送给Bob
        
    2. Bob收到p=509,g=5后,选择一个随机数b=456
        计算 B=g^b mod p=bcmod(bcpow(5,456),509)=181
        同时计算s=A^b mod p=bcmod(bcpow(215,456),509)=121
        
        Bob现在有[p=509,g=5,b=456,B=181,s=121,A=125]
        Bob把B=181发送给Alice
        
    3.
        Alice现在有[p,g,a,A,B]
    
        Alice计算s=B^a mod p=bcmod(bcpow(181,123),509)=121
    

    所以最终双方协商出的密钥s是121。注意到这个密钥s并没有在网络上传输。而通过网络传输的p,g,A和B是无法推算出s的,因为实际算法选择的素数是非常大的。

    所以,更确切地说,DH算法是一个密钥协商算法,双方最终协商出一个共同的密钥,而这个密钥不会通过网络传输。

    如果我们把a看成甲的私钥,A看成甲的公钥,b看成乙的私钥,B看成乙的公钥,DH算法的本质就是双方各自生成自己的私钥和公钥,私钥仅对自己可见,然后交换公钥,并根据自己的私钥和对方的公钥,生成最终的密钥secretKey,DH算法通过数学定律保证了双方各自计算出的secretKey是相同的

    但是DH算法并未解决中间人攻击,即甲乙双方并不能确保与自己通信的是否真的是对方。消除中间人攻击需要其他方法

    • DH算法是一种密钥交换协议,通信双方通过不安全的信道协商密钥,然后进行对称加密传输。
    • DH算法没有解决中间人攻击。

    但是 DH 算法本身也有缺点——它不支持认证。

    也就是说:它虽然可以对抗“偷窥”,却无法对抗“篡改”,自然也就无法对抗“中间人攻击/MITM”(缺乏身份认证,【必定会】遭到“中间人攻击/MITM”)

    ECDHE

    • 1.客户端随机生成随机值Ra
      计算Pa(x, y) = Ra * Q(x, y),
      Q(x, y)为全世界公认的某个椭圆曲线算法的基点
      将Pa(x, y)发送至服务器

    • 2.服务器随机生成随机值Rb
      计算Pb(x,y) = Rb * Q(x, y)
      Pb(x,y)发送至客户端

    • 3.客户端计算Sa(x,y) = Ra * Pb(x,y)
      服务器计算Sb(x,y) = Rb *Pa(x,y)

    • 4.算法保证了Sa = Sb = S,提取其中的S的x向量作为密钥(预主密钥)

  • 相关阅读:
    Three.js入门和搭建HelloWorld
    CentOS中使用Docker来部署Tomcat
    CentOS中使用Docker来部署Nginx
    Windows中通过bat定时执行命令和mysqldump实现数据库备份
    Geoserver在Linux上的安装(图文教程)
    Linux上怎样停止服务(jar包)、查看进程路径、关闭指定端口
    Java中怎样监测局域网内ip是否互通,类似ping
    Android和JS之间互相调用方法并传递参数
    Android中使用WebView加载本地html并支持运行JS代码和支持缩放
    ARC072C
  • 原文地址:https://www.cnblogs.com/HKUI/p/DH.html
Copyright © 2011-2022 走看看