DH算法实现_关于Imooc上moocer老师的DH算法的补充

本文主要补充了Imooc上moocer老师的DH算法实现,提供了JAVA代码示例,仅作为参考,不适用于实际开发。介绍了DH算法的单向过程,包括密钥对的生成、公钥交换和本地密钥构建。同时也推荐了两篇关于DH算法学习的文章,供读者深入理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下代码串仅供参考

实际开发过程中不采用以下做法
以下做法仅仅是根据imooc的moocer老师的代码结合其他代码的补充
原视频链接
JAVA实现非对称加密 2-3DH算法实现
仅供参考 不喜勿喷 请右上角点X

此类仅仅测试DH算法的单向过程

1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;
乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。
2.甲方使用 私钥、乙方公钥、约定数据加密算法 构建本地密钥,然后通过本地密钥加密数据,发送给乙方加密后的数据;
乙方使用 私钥、甲方公钥、约定数据加密算法 构建本地密钥,然后通过本地密钥对数据解密。

若需要DH算法的详细介绍,我推荐以下自己学习过程中 觉得还不错的文章给大家。
Java 加解密技术系列之 DH
以及
Java加密技术(五)DH

package DH;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.KeyAgreement;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.interfaces.DHPrivateKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;

import org.apache.commons.codec.binary.Base64;

import com.sun.org.apache.xalan.internal.utils.Objects;



public class DH {

    private static String src = "A Boy Can Do Everything For Girl";

    public static void main(String[] args) {
        jdkDH();
    }//main方法结束

    public static void jdkDH(){
        try {
            //1.初始化发送方密钥    甲方产出一对密钥(公钥、私钥)
            //甲方构建密钥对儿,将公钥(senderPublicKeyEnc)公布给乙方,将私钥保留;双方约定数据加密算法

            KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");//为指定的算法 DH 创建发送方密钥对生成器 KeyPairGenerator 对象
            senderKeyPairGenerator.initialize(512);                                      //为发送方密钥对生成器 KeyPairGenerator对象senderKeyPairGenerator设置生成密钥对的长度
            KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();            //生成一个密钥对KeyPair(密钥对(公钥和私钥)持有者);即 发送方的密钥对持有者senderKeyPair
            // 甲方公钥  
            DHPublicKey senderDhPublicKey = (DHPublicKey) senderKeyPair.getPublic();  
            // 甲方私钥  
            DHPrivateKey senderDhPrivateKey = (DHPrivateKey) senderKeyPair.getPrivate();  

            byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();          //以byte[]数组的方式存储   发送方的公钥



            //2.初始化接收方密钥    乙方依照甲方公钥产生乙方密钥对(公钥、私钥)
            //乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留

            // 2.1解析甲方公钥  
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);//根据发送方公布的公钥创建一个X509EncodedKeySpec对象x509EncodedKeySpec(根据发送方公钥产生的 用于生成接收方密钥的原料)
            KeyFactory receiverKeyFactory = KeyFactory.getInstance("DH");                       //为指定的算法 DH 创建接收方密钥工厂对象 receiverKeyFactory  
            //收方密钥工厂对象 receiverKeyFactory使用generatePublic("根据发送方公钥产生,用于生成接收方密钥的原始材料x509EncodedKeySpec")方法
            PublicKey receiverPublicKey = receiverKeyFactory.generatePublic(x509EncodedKeySpec);//接收方公钥

            // 2.2由甲方公钥构建乙方密钥 

            DHParameterSpec dhParameterSpec = ((DHPublicKey)receiverPublicKey).getParams();//从发送方解析出来的参数
            KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance("DH");
            receiverKeyPairGenerator.initialize(dhParameterSpec);//初始化receiverKeyPairGenerator
            KeyPair receiverKeyPair = receiverKeyPairGenerator.generateKeyPair();//由receiverKeyPairGenerator来生成接收方的 KeyPair  密钥对

             // 乙方公钥  
            DHPublicKey receiverDhPublicKey = (DHPublicKey) receiverKeyPair.getPublic();  
            // 乙方私钥  
            DHPrivateKey receiverDhPrivateKey = (DHPrivateKey) receiverKeyPair.getPrivate();  

            PrivateKey receiverPrivateKey = receiverKeyPair.getPrivate();//接收方私钥
            byte[] receiverPublicKeyEnc = receiverKeyPair.getPublic().getEncoded();  //以byte[]数组的方式存储   接收方的公钥

            //3.构建密钥
            //生成接收方的本地密钥
            KeyAgreement receiverKeyAgreement = KeyAgreement.getInstance("DH");
            receiverKeyAgreement.init(receiverPrivateKey);
            receiverKeyAgreement.doPhase(receiverPublicKey, true);
            //3.1用发送方公钥来生成接收方的本地密钥receiverSecretKey
            SecretKey receiverSecretKey = receiverKeyAgreement.generateSecret("DES");



            //生成发送方的本地密钥senderrSecretKey
            //重新初始化x509EncodedKeySpec
            KeyFactory senderKeyFactory = KeyFactory.getInstance("DH");
            x509EncodedKeySpec = new X509EncodedKeySpec(receiverPublicKeyEnc);//根据接收方公布的公钥创建一个X509EncodedKeySpec对象x509EncodedKeySpec(根据接收方公钥产生的 用于生成发送方密钥的原料)
            PublicKey senderPublicKey = senderKeyFactory.generatePublic(x509EncodedKeySpec);
            KeyAgreement senderKeyAgreement = KeyAgreement.getInstance("DH");
            senderKeyAgreement.init(senderKeyPair.getPrivate());
            senderKeyAgreement.doPhase(senderPublicKey, true);
            SecretKey senderSecretKey = senderKeyAgreement.generateSecret("DES");

            //比较发送方和接收方的本地密钥是否相同
            if(Objects.equals(senderSecretKey, receiverSecretKey)){
                System.out.println("双方本地密钥相同");
            }

            //4.发送方加密
            Cipher senderCipher = Cipher.getInstance("DES");
            senderCipher.init(Cipher.ENCRYPT_MODE, senderSecretKey);
            byte[] senderEncodeResult = senderCipher.doFinal(src.getBytes());
            System.out.println("jdk dh encrypt:"+Base64.encodeBase64String(senderEncodeResult));

            //4.接收方解密
            Cipher receiverCipher = Cipher.getInstance("DES");
            receiverCipher.init(Cipher.DECRYPT_MODE, receiverSecretKey);
            byte[] receiverDecodeResult = receiverCipher.doFinal(senderEncodeResult);
            System.out.println("jdk dh decrypt:"+new String(receiverDecodeResult));


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }//jdkDH()方法结束
}//DH类结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值