一个简单的DH密钥协商算法的实现

密钥协商(密钥交换)机制的讲解 国标文件涉及密钥协商算法的函数 生成密钥协商参数并输出 计算会话密钥 产生协商数据并且计算会话密钥 密钥协商(交换)算法及其原理 密钥交换/协商目的 “密钥协商机制”是:(在身份认证的前提下)规避【偷窥】的风险。通俗地说,即使有攻击者在偷窥客户端与服务器的网络传输,客户端(client)依然可以利用“密钥协商机制”与服务器端(server)协商出一个只有二者可知的用来对于应用层数据进行加密的密钥(也称“会话密钥”)。 密钥交换/协商机制的几种类型 1,依靠非对称加密算法 原理: 拿到公钥的一 阅读详情

原文出处:http://thecodeway.com/blog/?p=964

密码的管理可以说是加密体系中最为性命攸关的问题,在计算机发明之前,加密方法只能使用简单的移位、查表等简单的方法,这种级别的加密算法,基本上都无法逃脱被破解的命运,比如二战中德国发明的“英格玛”可以说是前计算机时代人类所发明的最为复杂的加密方法了,但以图灵为首的盟军科学家们,仍然可以用粗暴的暴力破解法硬生生从密文中破解出原文出来。
        进入计算机时代后,加密算法的复杂度有了质的飞跃,相对应的破解难度也不断加大,到了如今,像AES这样变态的加密算法,已经比英格玛不知复杂了多少个数量级,在没有密码的情况下,想直接从密文中破解出明文,即使图灵重生也全无可能了。于是,密钥本身的管理变成了加密环节中最脆弱的环节,“如何安全的把密码告诉别人”成了一个难题,比如,如果你需要发给同事一封包含加密附件的邮件,一般都会把密码放在另外一封邮件中发送,或者用其他方式告诉他,尽管这样做也并不安全,但总比那种傻乎乎的把密码和加密附件直接放在一起强多了。
        1976年,美国的两位数学家Whitfield Diffie和Martin Hellman率先发表了一种解决该密钥传输的方法,因此这种方法被大家称为Diffie–Hellman key exchange算法,这种算法提出这么一个做法:“在加密通讯之前双方各自生成密码的一部分,然后互换后合成起来,作为最终的密码”。这就是密钥协商,维基百科上使用了一个很有趣的比喻,就是颜料的混合:
        设想这样一个场景,Alice(A)和Bob(B),他们想在不见面的情况下秘密约定出一种颜色,但他们互相沟通的信息都会被公开,应该怎么办呢?

  Alice   Bob
私密信息 公开信息 公开信息 私密信息
A和B首先约定好公开的一种颜色,比如黄色      
A,B各自挑选出一种私密的颜色,比如橙色和兰色      
A,B各自将两种颜色混合起来  
         
双方交换混合后的颜色      
A,B各自将自己的私密颜色再次混入得到的颜色中      
现在A,B得到了一种相同的颜色,这种颜色是由一份黄色、一份橙色、一份兰色混合而来,但外界无法得知      

        秘密在于,颜色混合是一种“不可逆”的操作,当双方交换颜色时,尽管我们知道他们交换的颜色都是由一份黄色和另一份其他颜色混合得到的,但我们还是无法或者很难得到他们的私密颜色。而DH秘钥交换的原理非常相似,也是利用了数学上的一个“不可逆”的运算,就是离散对数(Discrete logarithm)

        乘方得逆运算称为对数运算,比如已知

7x=49

        那么可知
x=log749=2

        对数运算非常容易,即使在数字很大的时候是,但如果是下面的情况
7xmod13=8

        求X的过程称为“离散对数”,就不那么容易了,在数字很大时几乎是一个不可能的运算,而DH秘钥交换就是利用了这种离散对数计算非常困难的特性来设计的。公式里的mod是取模运算,取模运算有几条基本的定律如下
(a+b)modP(a∗b)modP(ab)modP=(amodP+bmodP)modP=(amodP∗bmodP)modP=((amodP)b)modP

        根据上面的公式,可以推导出一个非常重要的公式
(Ga∗b)modP=(GamodP)bmodP=(GbmodP)amodP(1)

        根据这个公式,我们可以向上面交换颜色那样设计出一个秘密交换数字的流程出来

  Alice   Bob
私密信息 公开信息 公开信息 私密信息
A和B首先约定两个公开的质数p和g  
p,g
 
p,g
 
A和B各自随机产生两个数a,b,作为自己的私钥
a
     
b
各自计算出自己的公钥A,B  
A=gamodp
 
B=gbmodp
 
交换公钥A,B  
B=gbmodp
 
A=gamodp
 
计算出加密用的密钥S
Sa=Bamodp=(gbmodp)amodp=gabmodp
     
Sb=Abmodp=(gamodp)bmodp=gabmodp

        最终两个人得到的秘密数字都是g^(ab) mod p,而窃听者仅从p,g,A,B四个公开信息,是无法得到这个秘密数字的!
        举个例子,假如p=23,g=5,Alice选取的秘密数字a=6,那么A=5^6 mod 23 =8,Bob选取的秘密数字是15,那么B=5^15 mod 23 = 19, 交换A和B后,Alice计算出的密钥S=19^6 mod 23=2,Bob计算出的密钥S=8^15 mod 23=2
        当然,实际运算中不可能取这么小的数值,比如如果需要128bit长度的密钥,那么p值需要是128bit长度的质数,由于有模运算,所获得的密钥不会大于p,所以p值可以是128bit数字中最大的一个质数,g可以随便设置一个小的质数即可。
        我在github上写了一个DH密钥交换算法,支持128bit长度密钥运算,纯C完成,没有引用其他库,只有两个接口,用法如下

//Alice获得随机私钥a并计算出对应的公钥A
DH_KEY   alice_private ,  alice_public ;
DH_generate_key_pair ( alice_public ,  alice_private ) ;
//Bob获得随机私钥b并计算出对应的公钥B
DH_KEY   bob_private ,  bob_public ;
DH_generate_key_pair ( bob_public ,  bob_private ) ;
//交换公钥后Alice计算出加密用密钥s
DH_KEY   alice_secret ;
DH_generate_key_secret ( alice_secret ,  alice_private ,  bob_public ) ;
//Bob计算出加密用密钥s
DH_KEY   bob_secret ;
DH_generate_key_secret ( bob_secret ,  bob_private ,  alice_public ) ;

总结DH密钥协商(会话密钥) 密钥安全性 在对称加密中,无论加密解密,通信双方都是使用相同的密钥,如果其中一方密钥泄露了,信息便会遭到破解。使用公开密钥双向加密可以极大提高安全性,通信双方手握对方的公钥进行信息加密,保留自己的私钥进行解密,从客户端发去的加密信息即使被中途截获,没有私钥的话也无法解密,而私钥保存在服务器端,相反一样。这样将密钥对分成公钥和私钥的方式,比起对称加密共同使用相同的密钥,明显更安全。无论是对称加密还... 阅读详情

相关推荐

openssl DH密钥协商

本文将介绍在通信时经常需要使用到的动态密钥协商,之所以需要使用动态密钥,主要增加数据的安全性,即使个别密码会被破译,但是不会影响到其他通信数据的安全。 本节中还是跟前面一样,使用openssl/crypt库来进行DH密钥交换的模拟,如果在你的项目中需要用到DH密钥交换,你可以对下面的流程进行整理,然后运用到项目中,需要说明的是openssl跟JAVA/.NET平台进行密钥交换时,可能会出

天剑 5625

19.openssl编程——DH

19.1 DH算法介绍 DH算法实质是一个通信双方进行密钥协商的协议:两个实体中的任何一个使用自己的私钥和另一个实体的公钥,得到一个对称密钥,这一对称密钥其他实体都计算不出来。 首先,发送方和接收方设置相同的大数数n和g,这两个不是保密的,他们可以通过非安全通道来协商这两个素数。 协商密钥: a.发送方选择一个大随机整数x,计算X=g^x mod n,发送X给接收者 b.接收方选择一个大...

艾小小雨的博客 981

密钥协商机制

https://www.cnblogs.com/-9-8/p/7985989.html 转自cnblogs, 作者: _9_8 密钥协商机制 https://www.cnblogs.com/-9-8/p/7985989.html 密钥协商机制,主要来得到通信双方的临时会话密钥。主要的方式有: 一、依靠非对称加密(公钥)算法; RSA,ECC等。   ...

阿群的笔记(同步备份自简书) 3378

dh算法c语言,openssl开源程序dh算法解析之dh_key.c

/*实现openssl 提供的默认的DH_METHOD,实现了根据密钥参数生成DH公私钥,以及根据DH 公钥(一方)以及DH 私钥(另一方)来生成一个共享密钥,用于密钥交换*/#include #include "cryptlib.h"#include #include //实现了伪随机数生成,支持用户自定义随机数生成#include static int generate_key(DH *d...

weixin_35435986的博客 1205

dh密钥协商算法c语言实现,Diffie-Hellman密钥协商算法-python实现

Boblee人工智能硕士毕业,擅长及爱好python,基于python研究人工智能、群体智能、区块链等技术,并使用python开发前后端、爬虫等。1.Diffie-Hellman密钥协商算法Diffie-Hellman密钥协商算法在1976年在Whitfield Diffie和Martin Hellman两人合著的论文New Directions in Cryptography(Section Ⅲ...

weixin_34757565的博客 3050

openssl中dh算法Demo

/*下面程序利用openssl库,实现了dh算法,产生密钥以及计算sessionkey*/ #include <openssl/dh.h> #include <memory.h> int main() { DH *d1,*d2; BIO *b; int ret,size,i,len1,len2; char sharekey1[128],sharekey2[128];

sjtu_chenchen的专栏 6567

任务3学习

DH算法原理学习 来自博主mrpre DH算法原理文章 DH算法原理 DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。我个人倾向于称DH算法为 密钥协商协议而RSA算法是密钥交换算法。 简单场景&简单的密钥协商 先从一个应用场景说起: Alice 和Bob想要在一个不安全的信道共享一个密钥,该密钥可被用来进行后续的其他的操作,并且仅被Alice和Bob所知,第三方无法得知。 一个简单的方法就是,现在全世界都

weixin_44222346的博客 233

DH密钥交换,C++代码

DH密钥交换的代码,别人写的,拿来给大家分享。

DH密钥交换协议c语言,eclipse实现可认证的DH密钥交换协议

可认证的DH密钥交换协议,供大家参考,具体内容如下一、实验目的通过使用密码学库实现可认证的DH密钥交换协议(简化STS协议),能够编写简单的实验代码进行正确的协议实现和验证。二、实验要求1、熟悉DH密钥交换算法基本原理;2、理解原始DH密钥交换算法存在的中间人攻击;3、理解简化STS协议抗中间人攻击的原理。4、掌握使用java编写实验代码进行正确的简化STS协议实现和验证。三、 开发环境JDK 1...

weixin_33653182的博客 1850

c语言实现DH算法加密

c语言编写的DH算法,借鉴学习 A系统构建密钥:构建一对公私密钥Private Key1和Public Key1; A系统向B系统公布自己的公钥(Public Key1); B系统使用A公布的公钥(Public Key1)建立一对密钥:Private Key2和Public Key2; B系统向A系统公布自己的公钥Public Key2; A系统使用自己的私钥Private Key1和B系统的公钥Public Key2构建本地密钥; B系统使用自己的私钥Private Key2和A系统的公钥Public Key1构建本地密钥;

ESP32 STA AP模式下,设备连接 ESP的AP 后无法上网,无法访问域名上网(或者Failed to enable NAPT)

ESP32 STA AP模式下,设备连接 ESP的AP 后无法上网,无法访问域名上网(或者Failed to enable NAPT)1.可能是ESP STA模式未成功连接到路由器,确保 STA 成功连接到外部网络。2.检查 STA 和 AP 的网络配置是否正确,避免子网冲突。3.ESP32的NAPT功能未正确启用,确保 menuconfig 中已启用 IP_NAPT。4.DNS服务器未正确配置。

qq_34885669的博客 1540

密钥协商算法的演变 —— RSA算法 - DH算法 - DHE算法 - ECDHE算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1. RSA算法RSA握手过程RSA秘钥协商算法最大的缺陷2. DH算法3. DHE算法4. ECDHE算法ECDHE秘钥协商算法的TSL握手: 1. RSA算法 传统的 TLS 握⼿基本都是使⽤ RSA 算法来实现密钥交换的。在 RSA 密钥协商算法中,客户端会⽣成随机密钥,并使⽤服务端的公钥加密后再传给服务端。根据⾮对称加密算法,公钥加密的消息仅能通过私钥解密,这样服务端解密后,双⽅就得到了相同的密钥,再⽤它加密应⽤消息。 R

weixin_60297362的博客 8878

什么是 WhatsApp云控 WhatsApp群发,WhatsApp协议,他们有什么区别?

下面我们sensws讲解下什么是WhatsApp云控 WhatsApp群发,WhatsApp协议

sendws的博客 3875

现代密码学(二)——DH密钥协商协议

DH密钥协商协议即Diffie-Hellman密钥协商算法,DH密钥协商算法在1976年在Whitfield Diffie和Martin Hellman两人合著的论文New Directions in Cryptography(Section Ⅲ PUBLIC KEY CRYPTOGRAPHY)中被作为一种公开秘钥分发系统(public key distribution system)被提出来...

Quincy678的博客 1万+

如何使用Qt的PIMPL习惯用法(PIMPL Idiom

PIMPL是指“Pointer to IMPLementation”(指向实现的指针),意味着将实现细节隐藏起来,用户类无需关注这些实现细节。在Qt中常用PIMPL习惯用法来清晰地区分接口与实现,尽管Qt官方文档并未详细说明该机制。本文将演示如何在Qt中使用PIMPL习惯用法,并以一个简单的坐标输入对话框作为实例。

电脑管家 1035

频偏估计技术:从原理到5G应用的实战解析

本文深入解析了5G通信中的频偏问题及其核心技术。频偏如同调不准的旋钮,会导致信号失真与载波间干扰。文章详细拆解了整数倍与小数倍频偏估计两大核心方法,重点剖析了基于循环前缀和基于同步信号块的算法原理与优劣,并结合eMBB、mMTC、URLLC三大5G应用场景,提供了实战算法选择策略与参数调优避坑指南。

weixin_29218963的博客 263

Https之(二)TLS的DH密钥协商算法

本文详细介绍了HTTPS中常用的两种密钥交换算法:RSA和ECDHE。重点分析了ECDHE算法的原理和优势,包括其前向安全性、临时密钥特性以及基于椭圆曲线的实现方式。文章通过分解ECDHE的命名组成,阐述DH密钥交换协议的核心思想,并对比了FFDH和ECDH两种实现。详细说明了基于ECDHE的TLS握手流程,包括Client Hello、Server Hello、Server Key Exchange等关键步骤,展示了双方如何通过公开信息协商出共享密钥。最后指出本文仅涉及单向认证,双向认证将在后续文章中讨论

一只特立独行的猪 1551

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 332

mbedtls学习(7)DH密钥协商

DH密钥协商算法 RSA算法再一定程度熵解决了密钥配送问题,但也可以用DH密钥协商算法来解决密钥配送问题。 DH密钥协商原理 DH共享参数 Alice和Bob进行DH密钥协商之前双方要有共同的DH共享参数即大素数p和生成源a DH密钥协商 1.Alice选择一个随机数x(1<=x<=p-1),算法得到公开参数 ...

jiang_2018的博客 3583

三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式)

三维旋转引言三维旋转1)欧拉角2)轴角式旋转分解1)V||的旋转2)V⊥的旋转3)V的整体旋转 引言 前面我们了解了 复数在二维旋转中的作用与联系 而四元数与三维旋转之间的关系与复数对二维旋转有很多类似的地方,下面我们就先来详细了解一下三维旋转的过程。 三维旋转 首先讨论一下三维旋转,我们了解到常用的三维旋转有两种方式: 1)欧拉角 即按照一定的顺序,分别对X, Y, Z三个轴进行旋转 θ 角。绕各旋转轴的旋转矩阵为: 然后任意的三维旋转可以分解成上述三种旋转方式的组合。(注意:三个旋转的顺序是非常重要的

晓晨的博客 1万+

机器翻译的评价标准:BLEU、ROUGE等指标说明及代码实现

机器翻译领域常用的自动评价指标主要包括BLEU、ROUGE、METEOR和COMET四大类。BLEU基于n-gram精确率和短句惩罚,ROUGE关注召回率,METEOR结合精确率和召回率并考虑同义词,COMET则利用预训练模型计算语义相似度。这些指标各有特点:BLEU适用于机器翻译,ROUGE对长句友好,METEOR更接近人工评分,COMET无需参考译文。代码实现上,sacrebleu、rouge-score等库提供了便捷的计算方式。新兴趋势包括基于BERT等模型的语义评估和大语言模型评估器,但传统指标仍占

数据知道的博客 9419

RSA加密算法和DH密钥协商的比较

最近在知乎上看到一篇关于RSA和DH的比较,简单明了,以此记录一下。问题1: RSA做密钥协商(密钥交换)时,是否可以防范中间人攻击? 答:单就RSA本身而言,是无法防范中间人攻击的。 和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递...

小丑鱼的专栏 5363

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1021

密钥协商算法Diffie-Hellman的Java实现

本文的思路是这样的:先了解Diffie-Hellman的流程原理,然后将其流程和Java的实现对应起来;理解了原理和Java实现的流程,再写应用代码进一步辅助验证,最后走一走源码流程中的相关细节,做最终验证;最后,再了解一下性能更好、安全性更高的ECDH(基于椭圆曲线来实现的Diffie-Hellman)

厚积薄发者,轻舟万重山 4913

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DH密钥交换

一 什么是DH密钥交换 DH密钥交换是1976年由Diffie和Hellman共同发明的一种算法。使用这种算法,通信双方仅通过交换一些可以公开的信息就能够生成出共享的密码数字,而这一密码数字就可以被用作对称密码的密钥。IPsec中就使用了经过改良的DH密钥交换。 虽然这种方法的名字叫“密钥交换”,但实际上双方并没有真正交换密钥,而是通过计算生成出一个相同的共享密钥。因此,这种方法也称DH密钥协...

实践求真知 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: gcc制作静态库和动态库总结
下一篇: jdk 环境变量配置
ly0303521
博客等级 码龄17年 135粉丝 90原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值