DH 加密算法的使用

article/2025/10/2 3:40:13

DH 算法的介绍

上面介绍的 DES,3DES,AES 算法都是对称密码算法,所谓对称,在上面也解释了,就是加密和解密的过程中使用相同的密钥 。而现在将要介绍的是 DH 算法,属于非对称密码算法,根据对称密码的概念,很容易知道,非对称密码算法就是解密和加密过程中使用不同密钥的算法。

对称密码算法有什么局限呢?由于加密和解密使用相同的数据,所以我们在发送密文的同时,需要将密钥发送给对方,这个时候假如我们的数据和密钥同时被黑客截获了呢?那么我们对数据加密也就失去了意义,唯一保证安全的方法就是,保证密钥不被黑客截取到,怎么才能做到呢?写在纸上亲手交给对方,这样最安全了,但是这往往不可能做到,所以才出现了非对称加密算法。

DH 算法是怎么加密的呢? 过程比较复杂,首先我们假设发送方是 A,接受方是 B。A 首先生成公钥和密钥,将公钥发送出去,B 接收到 A发送的公钥,然后利用该公钥生成自己的公钥和密钥,再将自己的公钥 发送给 A,这个时候 A 拥有了自己的公钥,密钥和 B 的公钥,B 拥有了自己的公钥密钥和 A 的公钥。

之后, A 就可以使用 A自己的密钥 + B的公钥 获取到本地的密钥,B也是如此,这个时候 A 和 B 生成的本地密钥其实是相同的,这样的话也就变成了用相同的密钥加密,用相同的密钥解密。而且这样的话,我们数据传递过程中传递的是 A 和 B 的公钥,就算被黑客截取了也无济于事,他们不可能凭借着公钥将数据解密,从而保证了数据的安全性。

DH 算法的使用

1 . 首先就是发送方初始化密钥对(公钥 + 密钥)

public static Map<String,Object> initKey() throws Exception{// 实例化密钥对生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH");//初始化密钥对生成器  默认是1024  512-1024 & 64的倍数 keyPairGenerator.initialize(1024);//生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();DHPublicKey dhPublicKey = (DHPublicKey) keyPair.getPublic();DHPrivateKey dhPrivateKey = (DHPrivateKey) keyPair.getPrivate();Map<String,Object> map = new HashMap<>();map.put(PUBLIC_KEY, dhPublicKey);map.put(PRIVATE_KEY, dhPrivateKey);return map;}

2 . 发送方有了自己的公钥和密钥之后,将自己的公钥发送出去,然后接收方根据收到的公钥,提取其中的参数,计算得出自己的公钥和密钥

public static Map<String,Object> initKey(byte[] key) throws Exception{// 将传进来的公钥数组转化为 PublicKeyX509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(key);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance("DH");// 产生公钥DHPublicKey dhPublicKey = (DHPublicKey) keyFactory.generatePublic(encodedKeySpec);// 剖析获取到的公钥,得到其参数DHParameterSpec dhParameterSpec = dhPublicKey.getParams();// 实例化密钥对生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DH");keyPairGenerator.initialize(dhParameterSpec);KeyPair keyPair = keyPairGenerator.generateKeyPair();DHPublicKey dhPublicKey2 = (DHPublicKey) keyPair.getPublic();DHPrivateKey dhPrivateKey = (DHPrivateKey) keyPair.getPrivate();Map<String,Object> map = new HashMap<>();map.put(PUBLIC_KEY, dhPublicKey2);map.put(PRIVATE_KEY, dhPrivateKey);return map;}

3 . 第三步就是根据对方的公钥 + 自己的密钥 计算出本地密钥

public static byte[] getSecretKey(byte[] publickey,byte[] privateKey) throws Exception{KeyFactory keyFactory = KeyFactory.getInstance("DH");X509EncodedKeySpec encodedKeySpec = new X509EncodedKeySpec(publickey);DHPublicKey dhPublicKey = (DHPublicKey) keyFactory.generatePublic(encodedKeySpec);PKCS8EncodedKeySpec encodedKeySpec2 = new PKCS8EncodedKeySpec(privateKey);DHPrivateKey dhPrivateKey = (DHPrivateKey) keyFactory.generatePrivate(encodedKeySpec2);KeyAgreement keyAgreement = KeyAgreement.getInstance("DH");keyAgreement.init(dhPrivateKey);keyAgreement.doPhase(dhPublicKey, true);SecretKey secretKey = keyAgreement.generateSecret("AES");return secretKey.getEncoded();}

4 . 测试,根据如上算法,我们看看 发送方计算得出的公钥和密钥以及接收方计算出的公钥和密钥,还有双方的本地密钥

public static void main(String[] args) throws Exception {byte[] aPublicKey;byte[] aPrivateKey;byte[] aSecretKey;byte[] bPublicKey;byte[] bPrivateKey;byte[] bSecretKey;Map<String, Object> aMap = DHUtil.initKey();aPublicKey = DHUtil.getPublic(aMap);System.out.println("A Public Key : " + Helper.fromByteToHex(aPublicKey));aPrivateKey = DHUtil.getPrivate(aMap);System.out.println("A Private Key : " + Helper.fromByteToHex(aPrivateKey));Map<String, Object> bMap = DHUtil.initKey(aPublicKey);bPublicKey = DHUtil.getPublic(bMap);System.out.println("B Public Key : " + Helper.fromByteToHex(bPublicKey));bPrivateKey = DHUtil.getPrivate(bMap);System.out.println("B Private Key : " + Helper.fromByteToHex(bPrivateKey));aSecretKey = DHUtil.getSecretKey(bPublicKey, aPrivateKey);System.out.println("A SecretKey : " + Helper.fromByteToHex(aSecretKey));bSecretKey = DHUtil.getSecretKey(aPublicKey, bPrivateKey);System.out.println("B SecretKey : " + Helper.fromByteToHex(bSecretKey));}

查看结果如下

这里写图片描述

根据生成的本地密钥,发送方和接收方就可以实现数据传输了,和对称密码算法中介绍的 DES,3DES,AES 相同。

也可以看到,DH 算法中公钥和密钥的长度是非常长的,所以这种方式的加密效率就没有对称算法高,这也是一种牺牲效率去换取安全性的做法。


http://chatgpt.dhexx.cn/article/dTkwgohI.shtml

相关文章

非对称加密 DH算法

DH算法简介 迪菲-赫尔曼密钥交换&#xff08;Diffie–Hellman key exchange&#xff0c;缩写为D-H&#xff09; 是一种安全协议。 它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。 这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。 迪…

DH算法 | Diffie-Hellman 密钥交换

概述&#xff1a; DH 算法又称“Diffie–Hellman 算法”&#xff0c;像往常的算法名字一样&#xff0c;这是用俩个数学牛人的名字来命名的算法&#xff0c;实现安全的密钥交换&#xff0c;通讯双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥。 优点&am…

DH算法原理

DH算法原理 DH 是 Diffie-Hellman的首字母缩写&#xff0c;是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。 本篇分为几个部分&#xff0c;第一个部分介绍一下密钥交换的场景&#xff1b;第二部…

DH、DHE、ECDHE加密算法

DH算法 离散对数 DH 算法是非对称加密算法&#xff0c; 因此它可以用于密钥交换&#xff0c;该算法的核心数学思想是离散对数。 对数运算&#xff1a; i l o g a b i log_{a}b iloga​b 离散对数是在对数运算的基础上加了「模运算」&#xff0c;也就说取余数&#xff0c;…

DH 算法原理

一、DH算法 DH 算法其实也叫作 Diffie - Hellman 密钥交换协议&#xff0c;是一个不安全的秘钥共享网络协议&#xff0c;无法避免中间人攻击。 二、DH算法的原理 假设 Ali 和 Bob 需要互相通信并共享秘钥 Ali 先给 Bob 一个明文共享参数 、 &#xff0c;此信息可以被任何人…

DH算法图解+数学证明

前几天和同事讨论IKE密钥交换流程时&#xff0c;提到了Diffie-Hellman交换。DH算法最主要的作用便是在不安全的网络上成功公共密钥(并未传输真实密钥)。但由于对于DH算法的数学原理则不清楚&#xff0c;因此私下对DH算法进行一个简单学习。 1. DH算法的交互流程&#xff1a; Al…

卷积神经网络(Convolutional Neural Networks,CNNS/ConvNets)

本文翻译自 Convolutional Neural Networks(CNNs / ConvNets)&#xff0c;更多内容请访问&#xff1a;http://cs231n.github.io/。 原来译文&#xff1a;https://blog.csdn.net/Consu_Yasin/article/details/78052411 卷积神经网络非常类似于普通的神经网络&#xff1a;它们都…

卷积神经网络CNNs的理解与体会

孔子说过&#xff0c;温故而知新&#xff0c;时隔俩月再重看CNNs&#xff0c;当时不太了解的地方&#xff0c;又有了新的理解与体会&#xff0c;特此记录下来。文章图片及部分素材均来自网络&#xff0c;侵权请告知。 卷积神经网络&#xff08;Convolutinal Neural Networks&a…

Gated-SCNN: Gated Shape CNNs for Semantic Segmentation论文笔记

论文介绍 作者认为之前的semantic segmentation的工作将所有信息都放入到了CNN的网络之中(这其中包含了颜色、边界、纹理等信息)&#xff0c;这不太理想&#xff0c;所以作者在regular stream的基础之上增加了一个shape stream的分支&#xff0c;通过利用门控卷积来控制使得sh…

【t-SNE可视化CNNs特征向量-代码】

t-SNE可视化CNNs特征向量-代码 本博客主要是自己学习记录&#xff0c;参考网络&#xff0c;欢迎指正 整体代码 ModelPath是存放训练好的模型参数的路径 DatasetPath是存放数据集的文件夹的路径&#xff0c;其中不同类别放在不同的子文件夹里也可以参考【t-SNE可视化-代码】 …

CNNs: AlexNet补充

CNNs: AlexNet的补充 导言对AlexNet模型进行调整模型不同层的表征其他探索总结 导言 上上篇和上一篇我们详细地讲述了AlexNet的网络结构和不同超参数对同一数据集的不同实验现象。 本节&#xff0c;我们就AlexNet的一些其他相关问题进行解剖&#xff0c;如修改AlexNet参数量调…

深度学习-浅谈CNNs

偶尔看到了这篇文章&#xff0c;感觉作者写的很容易理解&#xff0c;对于初步认识CNNs有很大的帮助&#xff0c;若想查看原文&#xff0c;请点击此处。 关于神经网络的学习方法&#xff0c;总结起来的要点有以下几点&#xff1a; BP算法 激励函数正则化与交叉验证等其他防止过…

【GSCNN】GSCNN:Gated Shape CNNs for Semantic Segmentation论文记录

目录 简单不看版&#xff1a; 摘要 一、介绍 二、相关工作 三、Gated Shape CNN 代码 四、实验 五&#xff0e;总结 论文&#xff1a;https://arxiv.org/abs/1907.05740 代码&#xff1a;GitHub - nv-tlabs/GSCNN: Gated-Shape CNN for Semantic Segmentation (ICCV 2…

CNNs和视觉Transformer:分析与比较

探索视觉Transformer和卷积神经网络&#xff08;CNNs&#xff09;在图像分类任务中的有效性。 图像分类是计算机视觉中的关键任务&#xff0c;在工业、医学影像和农业等各个领域得到广泛应用。卷积神经网络&#xff08;CNNs&#xff09;是该领域的一项重大突破&#xff0c;被广…

你应该知道的9篇深度学习论文(CNNs 理解)

当时看到英文的博客&#xff0c;本想翻译给感兴趣的同学们看看&#xff0c;没想到已经有人翻译&#xff0c;于是进行了转载&#xff0c;留给自己和更多的人学习&#xff0c;本文仅供参考。 英文博客&#xff1a;https://adeshpande3.github.io/adeshpande3.github.io/The-9-Dee…

【神经网络】CNN

CNN工作原理笔记 卷积神经网络定义卷积运算池化激活函数全连接反向传播算法其他应用延伸知识 首先放个学习视频链接: 大白话讲解卷积神经网络工作原理. 卷积神经网络定义 CNN其实就相当于黑箱&#xff0c;有输入有输出 输入&#xff1a;二维像素阵列 输出&#xff1a;判决结果…

CNN+RNN

CNN,RNN(recurrent, 下同)结合到一起可以建立一个更好的model 1. CRNN&#xff08;先CNN&#xff0c;后RNN&#xff09; References: An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition 一般用于基…

CNNs: ZFNet之CNN的可视化网络介绍

CNNs: ZFNet之CNN的可视化网络介绍 导言Deconvnet1. Unpooling2. ReLU3. Transpose conv AlexNet网络修改AlexNet Deconv网络介绍特征可视化 导言 上一个内容&#xff0c;我们主要学习了AlexNet网络的实现、超参数对网络结果的影响以及网络中涉及到一些其他的知识点&#xff0…

吊炸天的CNNs,这是我见过最详尽的图解!(上)

导读&#xff1a;卷积神经网络&#xff08;CNNs&#xff09;在“自动驾驶”、“人脸识别”、“医疗影像诊断”等领域&#xff0c;都发挥着巨大的作用。这一无比强大的算法&#xff0c;唤起了很多人的好奇心。当阿尔法狗战胜了李世石和柯杰后&#xff0c;人们都在谈论“它”。但…

深度学习—CNN

CNN简介 卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。 CNN 有2大特点&#xff1a; 能够有效的将大数据量的图片降维成小数据量能够有效的保留图片特征&#xff0c;符合图片处理的原则 目前 CNN 已经得到了广泛的应用&#xff0c;比如&…