密钥交换算法之六

2021-12-10  本文已影响0人  喏喏2021

1. 背景

大数据量加密,及加密安全性,在对称加密上已经得到了保证,剩下的问题是我们怎么来安全地传输密钥呢?
这时就衍生出了密钥交换算法DH,它的安全性完全是由数学理论支撑的。

2. 基本交换过程

  1. 双方各自生成自己的公钥和私钥
  2. 将自己公钥传递给对方
  3. 各自将收到的公钥,结合自己的私钥生成相同的密钥
  4. 双方可以使用相同的密钥进行对称加密交流

3. 代码示例

public class DHTest {

    //用户类
    public static class User {
        private String name; //名称
        private PublicKey publicKey; //密钥对之公钥
        private PrivateKey privateKey; //密钥对之私钥
        private byte[] secretKey; //生成的相同的密钥
        public User(String name) {
            this.name = name;
        }
        //生成本地的密钥对
        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(Exception e) {
                throw new RuntimeException(e);
            }
        }
        
        //根据对方的公钥生成最终的密钥
        public void generateSecretKey(byte[] rcvPubKeyByte) {
            try {
                X509EncodedKeySpec keySpec = new X509EncodedKeySpec(rcvPubKeyByte);
                KeyFactory keyFactory = KeyFactory.getInstance("DH");
                PublicKey rcvPubKey = keyFactory.generatePublic(keySpec);
                //生成本地密钥
                KeyAgreement keyAgreement = KeyAgreement.getInstance("DH");
                keyAgreement.init(this.privateKey);
                keyAgreement.doPhase(rcvPubKey, true);
                //生成最终的密钥
                this.secretKey = keyAgreement.generateSecret();
            }catch(Exception e) {
                throw new RuntimeException(e);
            }
        }
        
        //输出公钥私钥,密钥
        public void printInfo() {
            System.out.println("name:" + this.name);
            System.out.printf("公钥:%x\n",new BigInteger(1,this.publicKey.getEncoded()));
            System.out.printf("私钥:%x\n",new BigInteger(1,this.privateKey.getEncoded()));
            System.out.printf("密钥:%x\n",new BigInteger(1,this.secretKey));
        }
    }
    
    public static void main(String[] args) {
        User user1 = new User("user1");
        User user2 = new User("User2");
        
        //生成各自的密钥对
        user1.generateKeyPair();
        user2.generateKeyPair();
        
        //交换公钥,方便各自生成密钥
        user1.generateSecretKey(user2.publicKey.getEncoded());
        user2.generateSecretKey(user1.publicKey.getEncoded());
        
        user1.printInfo();
        user2.printInfo();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读