美文网首页
[ 加密 ] DH 安全地传输密钥 要想人不知?

[ 加密 ] DH 安全地传输密钥 要想人不知?

作者: 一个好汉 | 来源:发表于2021-09-05 10:01 被阅读0次

如何传递密钥?

密钥交换算法即DH算法:Diffie-Hellman算法应运而生。

DH算法是一个密钥协商算法,双方最终协商出一个共同的密钥,而这个密钥不会通过网络传输。解决了密钥在双方不直接传递密钥的情况下完成密钥交换,这个神奇的交换原理完全由数学理论支持

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

代码? 代码!

import javax.crypto.KeyAgreement;
import java.math.BigInteger;
import java.security.*;
import java.security.spec.X509EncodedKeySpec;

/**
 * dh 算法
 * 传输秘钥
 * 不能解决中间人攻击
 */
public class DhEncrypt {
    public static void main(String[] args) {
        // Bob和Alice:
        Person bob = new Person("Bob");
        Person alice = new Person("Alice");

        // 各自生成KeyPair:
        bob.generateKeyPair();
        alice.generateKeyPair();

        // 双方交换各自的PublicKey:
        // Bob根据Alice的PublicKey生成自己的本地密钥:
        bob.generateSecretKey(alice.publicKey.getEncoded());
        // Alice根据Bob的PublicKey生成自己的本地密钥:
        alice.generateSecretKey(bob.publicKey.getEncoded());

        // 检查双方的本地密钥是否相同:
        bob.printKeys();
        alice.printKeys();
        // 双方的SecretKey相同,后续通信将使用SecretKey作为密钥进行AES加解密...
    }
}

class Person {
    public final String name;

    public PublicKey publicKey;
    private PrivateKey privateKey;
    private byte[] secretKey;

    public Person(String name) {
        this.name = name;
    }

    // 生成本地KeyPair:
    public void generateKeyPair() {
        try {
            KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DH");
            kpGen.initialize(512);
            KeyPair kp = kpGen.generateKeyPair();
            this.privateKey = kp.getPrivate();
            this.publicKey = kp.getPublic();
        } catch (GeneralSecurityException e) {
            throw new RuntimeException(e);
        }
    }

    public void generateSecretKey(byte[] receivedPubKeyBytes) {
        try {
            // 从byte[]恢复PublicKey:
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(receivedPubKeyBytes);
            KeyFactory kf = KeyFactory.getInstance("DH");
            PublicKey receivedPublicKey = kf.generatePublic(keySpec);
            // 生成本地密钥:
            KeyAgreement keyAgreement = KeyAgreement.getInstance("DH");
            keyAgreement.init(this.privateKey); // 自己的PrivateKey
            keyAgreement.doPhase(receivedPublicKey, true); // 对方的PublicKey
            // 生成SecretKey密钥:
            this.secretKey = keyAgreement.generateSecret();
        } catch (GeneralSecurityException e) {
            throw new RuntimeException(e);
        }
    }

    public void printKeys() {
        System.out.printf("Name: %s\n", this.name);
        // %x 只能打印整形的数字
        // 类型包含 Byte Short Integer Long BigInteger
        // 不是整形会报错 
        // Exception in thread "main" java.util.IllegalFormatConversionException: x != [B
        System.out.printf("Private key: %x\n", new BigInteger(1, this.privateKey.getEncoded()));
        System.out.printf("Public key: %x\n", new BigInteger(1, this.publicKey.getEncoded()));
        System.out.printf("Secret key: %x\n", new BigInteger(1, this.secretKey));
    }
}

总结

dh 算法
传输秘钥
不能解决中间人攻击

知识点

System.out.printf("Private key: %x\n", new BigInteger(1, this.privateKey.getEncoded()));

%x 只能打印整形的数字
类型包含 Byte Short Integer Long BigInteger
不是整形会报错
Exception in thread "main" java.util.IllegalFormatConversionException: x != [B

相关文章

  • [ 加密 ] DH 安全地传输密钥 要想人不知?

    如何传递密钥? 密钥交换算法即DH算法:Diffie-Hellman算法应运而生。 DH算法是一个密钥协商算法,双...

  • Diffie-Hellman 密钥交换算法

    Diffie-Hellman 密钥交换算法 DH算法的特点是可以在非加密的传输线路上,交换好密钥,然后服务器客户端...

  • 密钥交换算法之六

    1. 背景 大数据量加密,及加密安全性,在对称加密上已经得到了保证,剩下的问题是我们怎么来安全地传输密钥呢?这时就...

  • https(2)

    一、共享密钥加密(对称密钥加密)客户端和服务端采用同一个密钥加密进行传输,传输的内容加密和解密用同一套密钥在传递该...

  • 3.1 DH算法简介

    非对称加密算法 - DH算法 DH算法是非对称加密算法的鼻祖,为非对称加密算法奠定了基础,主要用途是进行密钥交换。...

  • 加密算法之证书

    公钥传输问题? 我们知道,通过用非对称加密对对称加密的密钥进行加密然后在网络中传输,解决了对称加密密钥的不安全传输...

  • 非对称加密解密:DH算法+RSA算法+ElGamal算法[小戴某

    非对称加密算法是一种基于密钥的保密方法,需要公开密钥和私有密钥,在文件加密、尤其是网银中应用广泛。 DH密钥交换算...

  • 算法和数据结构5.6混合加密

    共享密钥加密无法安全传输密钥的的密钥分配问题,公开密钥加密又存在加密解密速度较慢问题。 结合这两种方法以实现互补的...

  • 常用加密算法介绍及https加密原理

    对称加密 特点:加密、解密采用同一密钥。优点:加密速度快缺点:因用同一密钥加解密,在密文传输过程中需要把密钥也进行...

  • HTTPS是如何保证安全的

    小结:简单的说,是通过对称加密来加密传输的内容,采用非对称加密来加密对称加密的密钥(不直接采用非对称加密传输内容是...

网友评论

      本文标题:[ 加密 ] DH 安全地传输密钥 要想人不知?

      本文链接:https://www.haomeiwen.com/subject/ypcjwltx.html