搬一下别人的解释:

下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理。

1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g。

2,Diffie-Hellman密钥交换是一个两部分的过程,Alice和Bob都需要一个私有的数字a,b。

下面是DH交换的过程图:

本图片来自wiki

下面我们进行一个实例

1.爱丽丝与鲍伯协定使用p=23以及g=5.

2.爱丽丝选择一个秘密整数a=6, 计算A = g^a mod p并发送给鲍伯。

A = 5^6 mod 23 = 8.

3.鲍伯选择一个秘密整数b=15, 计算B = g^b mod p并发送给爱丽丝。

B = 5^15 mod 23 = 19.

4.爱丽丝计算s = B a mod p

19^6 mod 23 = 2.

5.鲍伯计算s = A b mod p

8^15 mod 23 = 2.

ECDH密钥交换:

ECDH:

ECC算法和DH结合使用,用于密钥磋商,这个密钥交换算法称为ECDH。交换双方可以在不共享任何秘密的情况下协商出一个密钥。ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。ECDH即建立在此数学难题之上。密钥磋商过程:

假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。

1) Alice生成随机整数a,计算A=a*G。 #生成Alice公钥

2) Bob生成随机整数b,计算B=b*G。 #生产Bob公钥

3) Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。

由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。

4) Bob将B传递给Alice。同理,B的传递可以公开。

5) Bob收到Alice传递的A,计算Q =b*A#Bob通过自己的私钥和Alice的公钥得到对称密钥Q

6) Alice收到Bob传递的B,计算Q`=a*B#Alice通过自己的私钥和Bob的公钥得到对称密钥Q'

Alice、Bob双方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q' (交换律和结合律),即双方得到一致的密钥Q。

目前Openssl里面的ECC算法的套件支持是ECDSA/ECDH。在国密的SSL套件中,可以使用ECDSA/ECC(密钥加密传输),ECDSA/ECDH(密钥磋商)两种套件

作者:介和
链接:https://www.jianshu.com/p/b26cd2bfdc28
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

测试代码:

#include "stdafx.h"#include <string.h>
#include <stdio.h>
#include <openssl/ec.h>
#include <openssl/ecdh.h>
#include <openssl/ecdsa.h>
#include <openssl/objects.h>
#include <openssl/err.h>#define ECDH_SIZE 256void handleErrors()
{printf("Error occurred.\n");
}void disp(const char *str, const void *pbuf, const int size)
{int i=0;if (str !=NULL){printf("%s:\n", str);}if (pbuf !=NULL && size > 0){for (i = 0; i < size; i++) {printf("%02x ", *((unsigned char *)pbuf + i));}putchar('\n');}putchar('\n');
}EC_KEY *genECDHpubkey(unsigned char *pubkey, size_t& lenn)
{size_t len;int ret;    //Generate PublicEC_KEY *ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); // NID_secp521r1   //或者//EC_KEY *ecdh = EC_KEY_new();//EC_GROUP *group_ = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1); // NID_secp256k1//EC_KEY_set_group(ecdh, group_);//ret = EC_KEY_generate_key(ecdh);//const EC_POINT *point = EC_KEY_get0_public_key(ecdh);//传输给对方的公钥const EC_GROUP *group = EC_KEY_get0_group(ecdh);//BIGNUM *x = BN_new();BIGNUM *y = BN_new();if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y, NULL)){BN_print_fp(stdout, x);putc('\n', stdout);BN_print_fp(stdout, y);putc('\n', stdout);}BN_free(x);BN_free(y);//将公钥由POINT格式转成OCT字符串if (0 == (len = EC_POINT_point2oct(group, point, POINT_CONVERSION_COMPRESSED, pubkey, ECDH_SIZE, NULL))){handleErrors();}printf("len=%d\n",len);disp("pubkey", pubkey, len);lenn = len;return ecdh;
}unsigned char *genECDHsharedsecret(EC_KEY *ecdh, unsigned char *peerkey, size_t secret_len)
{int len, ret;unsigned char *shared = (unsigned char *)malloc(ECDH_SIZE);const EC_GROUP *group = EC_KEY_get0_group(ecdh);//ComputeKeyEC_POINT *point_peer = EC_POINT_new(group);if (0 == (ret = EC_POINT_oct2point(group, point_peer, peerkey, secret_len, NULL))) // ECDH_SIZE{handleErrors();}//if (0 == (len = ECDH_compute_key(shared, ECDH_SIZE-1, point_peer, ecdh, NULL))){handleErrors();}printf("len=%d\n",len);disp("shared", shared, len);return shared;
}int testECDH()
{unsigned char *keydata = (unsigned char *)malloc(ECDH_SIZE);unsigned char *keydata2 = (unsigned char *)malloc(ECDH_SIZE);size_t len1 = 0, len2 = 0;EC_KEY *ecdh = genECDHpubkey(keydata, len1);EC_KEY *ecdh2 = genECDHpubkey(keydata2, len2);unsigned char *ECDH_keydata  = genECDHsharedsecret(ecdh2, keydata, len1);//ECDH_SIZE-1unsigned char *ECDH_keydata2 = genECDHsharedsecret(ecdh, keydata2, len2);//ECDH_SIZE-1if (0== memcmp(ECDH_keydata, ECDH_keydata2, ECDH_SIZE - 1)) //算出来的共享密钥必须相同{printf("------sharedsecret ok------\n");}printf("To the end\n");free(keydata);free(keydata2);EC_KEY_free(ecdh);EC_KEY_free(ecdh2);free(ECDH_keydata);free(ECDH_keydata2);return 0;
}int main8(int argc, char *argv[])
{return testECDH();
}

运行结果:

shared密钥就是我们后续采用AES等对称算法的Key。

参考:

https://www.cnblogs.com/Kalafinaian/p/7392505.html

https://bbs.csdn.net/topics/360001596

https://www.freebuf.com/articles/database/155912.html

https://my.oschina.net/safedead/blog/515386

https://www.cnblogs.com/10zhang/p/9381897.html

https://blog.csdn.net/bravegogo/article/details/63684286

了解一下密钥交换算法ECDH相关推荐

  1. java ecdh秘钥交换_了解一下密钥交换算法ECDH

    https://www.jianshu.com/p/b26cd2bfdc28 搬一下别人的解释: 下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理. 1,Diffie-H ...

  2. Nodejs进阶:使用DiffieHellman密钥交换算法

    简介 Diffie-Hellman(简称DH)是密钥交换算法之一,它的作用是保证通信双方在非安全的信道中安全地交换密钥.目前DH最重要的应用场景之一,就是在HTTPS的握手阶段,客户端.服务端利用DH ...

  3. java ecdh秘钥交换_DH密钥交换和ECDH原理(转)

    下面我们以Alice和Bob为例叙述Diffie-Hellman密钥交换的原理. 1,Diffie-Hellman交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数p,底数g. 2,Di ...

  4. DH密钥交换和ECDH原理

    DH密钥交换和ECDH原理 上述的就是DH密钥交互的图表: 可以这么理解,A与B想要生成只有彼此知道的密钥,而使得自己本地产生的私钥,不被对方知道,包括第三方的Eve. 此时的Alice 和Bob 彼 ...

  5. 数据加密 三种密钥交换算法详解(RSA DHE ECDHE)

    一.RSA密钥交换算法 RSA算法流程文字描述如下: (1)任意客户端对服务器发起请求,服务器首先发回复自己的公钥到客户端(公钥明文传输). (2)客户端使用随机数算法,生成一个密钥S,使用收到的公钥 ...

  6. 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用

    9. PKI - 三种密钥交换算法详解(RSA& DHE& ECDHE)及他们在SSL/TLS协议中的应用 RSA密钥交换算法 DHE密钥交换算法 ECDHE密钥交换算法 参考 密钥交 ...

  7. java dh算法_dh密钥交换算法java

    dh密钥交换算法java 迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的 ...

  8. 密钥交换算法 - Java加密与安全

    密钥交换算法我们在使用对称加密算法的时候,我们用的是同一个密钥key 我们以AES加密为例,当我们需要加密明文,我们需要一个随机生成的key,作为密钥进行加解密,最后我们的问题是如何传递密钥 因为不给 ...

  9. 密码学 专题 DH密钥交换算法

    注意事项: SSL中密钥交换算法有6种:无效(没有密钥交换).RSA.匿名Diffie-Hellman.暂时Diffie-Hellman.固定Diffie-Hellman.Fortezza 生成对话密 ...

最新文章

  1. Linux命令:less
  2. SQL结构化查询语言中的LIKE语句
  3. 最优的素数判断代码(Python)是这样写出来的
  4. xml 操作组件(NewLife.XCode)
  5. Word新建自己的样式
  6. Vmware中win7联网
  7. java则么实现md5解密_java的md5解密
  8. Spire.Doc 教程:如何将Word转换为PDF
  9. 无人车系统(七):Udacity ‘s无人驾驶仿真环境(社区介绍)
  10. 安装chrome第三方插件教程:(超详细)
  11. Android系统编译aosp
  12. 【算法】求解幂集问题
  13. 二十四节气-白露 | 白露至,秋实美
  14. 新程序猿如何度过试用期
  15. [附源码]java毕业设计汽车票售票系统lunwen
  16. postgresql 索引之 bloom
  17. 守护永恒服务器维护,3月27日0点-9点停服维护公告客户端更新
  18. android通过代码设置铃声_使用VS Code调试Android C_C++代码(无需Android源码)
  19. 5G芯片大战下的“新变量”
  20. Hadoop2.6.0在MAC下伪分布安装

热门文章

  1. Java 高并发项目笔记
  2. 信号与系统->系统的时域分析
  3. 韩国MBC、KBS、SBS
  4. 【统计学】基本Stata使用手册(1):基本操作
  5. CATTI 三级笔译考试准备
  6. P1462 通往奥格瑞玛的道路(二分+dijkstra)
  7. Nexus arm Linux,[原创] Nexus 6p 刷入Kali Linux NetHunter 2019.3方法
  8. Linux从头学05-系统启动过程中的几个神秘地址,你知道是什么意思吗?
  9. [MODIS数据处理#2]常用的Arcmap内置工具(一)
  10. 微软新品发布会汇总:更新Surface硬件产品 首发智能耳机