信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现

一、实验目的

理解Diffie-Hellman算法的实现原理,编程实现Diffie-Hellman算法的程序,能够实现密钥协商的目的

二、实验原理

w.Diffie与M.Hellman在1976年提出一个称为Diffie——Hellman密钥交换的公钥密码算法。该算法能用来在两个用户之间安全地交换密钥材料,从而使双方得到一个共享的会话密钥,但该算法只能用于交换密钥,不能用于加/解密。

Diffie-Hellman密钥交换的安全性基于求解有限域上离散对数的困难性。首先,双方需要约定一个大素数 p 和它的一个本原根 g ,然后整个密钥交换的过程分两步完成:

(1)双方(记为A和B)分别挑选一个保密的随机整数Xa和Xb,并分别计算Ya=g^Xa mod p和Yb=g^Xb mod p,然后互相交换,即A将YA发送给B,B将YB发送给A。其中,YA和Yb分别相当于A和B的公开密钥(但却不能用于真正的消息加密)。

(2)A和B分别计算K=Yb^Xa mod p和K=Ya^Xb mod p,得到双方共享的密钥K。这是因为

Yb^Xa mod p=(g^Xb mod p)^Xa mod p=g^XaXb mod p

Ya^Xb mod p=(g^Xa mod p)^Xb modp=g^XaXb mod p

由于Xa和Xb是保密的,因此攻击者最多能够得到p、g、Ya和Yb如果攻击者希望得到K,那么至少计算出Xa和Xb中的一个,这意味着需要求解离散对数,这在计算上是不可行的。

三、代码实现

package czx.xupt.DH;

import java.util.Scanner;

/**
 * #Author:槐序二四
 * #Time:2020/1/7 22:48
 * #Motto:人间荒唐市侩 不如山中作怪.
 */

/**
 * 注意:该实验数字最大数的范围不超过int型范围
 */
public class DH {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入生成元(0~9):");
        int g = scanner.nextInt();

        Scanner scanner1 = new Scanner(System.in);
        System.out.println("请输入模数(0~9):");
        int p = scanner1.nextInt();

        Scanner scanner2 = new Scanner(System.in);
        System.out.println("请A输入自己选定的随机数(0~9):");
        int xa = scanner2.nextInt();

        Scanner scanner3 = new Scanner(System.in);
        System.out.println("请B输入自己选定的随机数(0~9):");
        int xb = scanner2.nextInt();

        int Ya = mod(g, xa, p);
        int Yb = mod(g, xb, p);
        System.out.println("a算出的公钥是:" + Ya);
        System.out.println("b算出的公钥是:" + Yb);

        int Ka = mod(Yb, xa, p);
        int Kb = mod(Ya, xb, p);
        System.out.println("a算出的会话密钥是:" + Ka);
        System.out.println("b算出的会话密钥是:" + Kb);

    }

    public static int mod(int g, int x, int p) {
        int pow = (int) Math.pow(g, x);
        return (pow % p);
    }
}

信息安全密码学实验四:Diffie-Hellman密钥交换协议的设计与实现_第1张图片

四、DH中间人攻击

通过以上实验,我们可以从其中看出:A 和 B 的值并没有什么关系。简单来说就是:A 和 B 都不能证明对方的身份,这使得重放攻击可以轻易产生。

我们假设在 A 和 B 之间存在攻击者T。当 A 向 B 发送 g ,p,Xa 时,T截获了信息,并计算

Yt = g^Xt mod p

然后 T 将计算好的 Yt 发送给 A。同时向 B发送 g,p,Xt,这样B会将这三个参数当成是 A 发过来的,B 就会向 T 发送 Yb

然后 A B 双方都得到了一个密钥,然后各自用各自得到的密钥来创建会话密钥,然而A B 双方创建的会话密钥都是与 T 创建的

此时在 A 与 T 之间创建的密钥是

K=Yt ^Xa mod p

在 B 与 T 之间创建的密钥是

K=Yt ^Xb mod p

这样,会话密钥创建完成。

到此时,A 与 B 都认为是自己与对方分享了只有他们两人知道的密钥,实际上 A、B 都只能与 T 进行通信

当 A 给 B 发信息时,会被 T 收到并解密,这样 T 就可以对信息进行截获、篡改、乱序、删除等一系列操作,甚至可以假装成 A 向 B 发送消息。B 收到信息后会认为是 A 发来的,实际上信息是经过 T 加工的信息。

当 B 给 A 发送消息是也是如此。

至此,DH中间人攻击产生。

你可能感兴趣的:(信息安全实验)