基于ECC算法的秘钥协商

基于ECC算法的衍生算法

  • ECDH(ECC+DH)
  • RSA
  • ECDHE(ECC+DHE)

ECDH密钥协商(ECC+DH)

  • 椭圆曲线密码学是属于非对称密码学的,其私钥的计算公式如下:
  1. 私钥是一个随机数d,取值范围在1……n-1,其中n是子群的阶
  2. 公钥是点H=dG,G是子群的基点
  • 如果知道私钥d 和椭圆曲线参数G,求公钥H是很容易的,但是只知道公钥H和椭圆曲线参数G,求解私钥d是非常困难的,需要解决离散对数难题,椭圆曲线的安全性保证有赖于此。
  • ECDH密钥协商算法基于椭圆曲线密码系统(ECC),使用较短的密钥长度可提供与RSA或DH算法同等的安全等级,密钥长度有160 ~ 256位比特的椭圆曲线算法与密钥长度1024 ~ 3072位比特的非ECC算法安全强度相同。

常用有限域上的椭圆曲线

椭圆曲线由以下参数组成

T=(p,a,b,G,n,h)

  • p 有限域中的大素数,长度一般224比特、256比特、384比特
  • a 整数,椭圆方程系数
  • b整数,椭圆方程系数
  • G,椭圆曲线上某点,生成元
  • n,为一个素数,表示椭圆曲线的阶
  • h,余因数
  • 其中G包含Gx和Gy一共2个参数,非压缩模式以04开始,压缩模式以03开始,实际使用中一般采用非压缩模式
  • 通过模数p和系数a,b构成椭圆曲线方程y^2=x^3+ax+b mod p
  • TLS支持很多椭圆曲线,常用的有2个secp256r1和secp284r1 : secp256r1大素数p长度256比特(32字节)和secp384r1大素数p长度384比特(48字节)

ECDH密钥协商步骤

  • ECDH其实和DH思想是一样的,只不过这是基于椭圆曲线离散对数实现的。

ECDH共享参数

  • Alice和Bob进行ECDH密钥协商之前双方要有共同的ECDH共享参数,即必须选择相同的椭圆曲线方程、大素数p、生成源G,实际中这些椭圆曲线已经被相关组织批准,比如上边的secp256r1和secp384r1,通过这个双方就确定了这些共享参数

ECHD密钥协商

  1. Alice选择一个比椭圆曲线阶小的随机数HA作为私密参数,计算公钥HA=dAG发送给Bob
  2. Bob选择一个比椭圆曲线阶小的随机数HB作为私密参数,计算公钥HB=dBG发送给Alice
  3. Bob收到HA并计算得到共享密钥参数S=dBHA
  4. Alice收到HB并计算得到共享密钥参数S=dAHB
  • 根据椭圆曲线结合律S=dAHB=dAdBG=dBdAG=dBHA。目前Alice和Bob就得到了相同的S,但是第三方即使知道椭圆曲线和HAHB的前提下,是无法获取S的,因为在推导S的时候是需要知道其中一个私钥,这必须破解椭圆曲线离散对数难题,这个是很难破解的。 应用上,一般先利用ECDH协商共享密钥,再利用共享密钥计算出对称密钥等其他需要的密钥,通信双发对数据进行对称加密安全通信。

问题

  • 如果采用静态的 DH 算法和 ECC 结合就是 ECDH 算法。这种方式每次都使用的相同的 G 基点,它的优点在于可以避免每次在初始化连接时服务器频繁生成 G。这个过程比较消耗 CPU。但是它带来的缺点是,一旦随机数 a、b 被泄露了,那么在这之前的所有会话都将会被解密。
  • 为了解决这个问题,于是出现了 DHE 算法(Diffie-Hellman Ephemeral ,短暂临时的 DH 算法),结合 ECC 后形成了 ECDHE 算法。它可以保证每次通信使用的共享密钥都是不同的,DH 密钥对仅仅保存在内存中,不像 RSA 的私钥保存在磁盘上,攻击者即使从内存中破解了私钥,也仅仅影响本次通信,所以无需担心在此之前的通信内容会被解密,这样的特征成为前向安全性(Forward Secrecy,FS)或者完全前向安全性(Perfect Forward Secrecy,PFS)。更安全的是,协商出会话密钥后,a 和 b 两个私钥可以丢弃,进一步提升了安全性,在有限的时间、有效的空间生成了密钥对。在 TLS 握手中使用的 ECDHE_ECDSA 和 ECDHE_RSA 密钥交换算法。

如下图

 

参考链接

  • ECDH密钥协商  https://blog.csdn.net/weixin_41572450/article/details/103207724
  • ECDH密钥交换 https://blog.csdn.net/s_lisheng/article/details/90712333

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++11 多线程相关知识的学习

C多线程类Thread(C11) C11中std命名空间将Boost库中的Thread加入,Boost的多线程从准标准变为标准,这里将其用法整理复习,以demo的形式复习,还是喜欢看我自己写的东西,符合我的个人逻辑头文件为…

vscode vim 插件自定义配置

{"workbench.colorTheme": "Material Theme","files.defaultLanguage": "markdown", //新建文档格式为markdown格式"vim.easymotion": true,"vim.leader": " ", // leader键"vim.useSystemClipbo…

C++11 explicit关键字的作用

explicit 在C中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。因为无参构造函数和多参构造函数本身就是显示调用的。再加上explicit关键字也没有什么意义…

c++ 指针的强制类型转换

#include <iostream> using namespace std; class A { public:int i;int j;A(int n):i(n),j(n) { } }; int F2 (int,char *){return 1; }; int F1 (int){return 2; }; int main() {A a(100);int &r reinterpret_cast<int&>(a); //强行让 r 引用 ar 200; …

C++11学习 virtual(虚函数)的用法

Virtual虚函数 在面向对象的C语言中&#xff0c;虚函数&#xff08;virtual function&#xff09;是一个非常重要的概念。因为它充分体现了面向对象思想中的继承和多态性这两大特性&#xff0c;在C语言里应用极广。多态性&#xff1a;其含义就是多种形式&#xff1b;将具有继承…

c++ const

函数名称不单单是函数名 const 补充内容 还有 const 参数类型 函数后头const 只能在成员函数如果const对象 但是我没通过const成员函数 就会报错

C++11学习 新特性之 “=default” 、“=delete”

文章目录 1、 default 和delete 概述2、 类与默认函数3、 使用“delete”来限制函数生成4、 “default”使用范围 1、 default 和delete 概述 default、delete 是C11的新特性&#xff0c;分别为&#xff1a;显式缺省(告知编译器生成函数默认的缺省版本)和显式删除(告知编译器…

C++学习 优雅的实现对象到文件的序列化/反序列化 关键字serialize

需要使用到序列化场景的需求 在写代码的过程中&#xff0c;经常会需要把代码层面的对象数据保存到文件&#xff0c;而这些数据会以各种格式存储&#xff0e;例如&#xff1a;json&#xff0c;xml&#xff0c;二进制等等&#xff0e;二进制&#xff0c;相比json&#xff0c;xml…

C++代码注释详解

常用注释语法 注释写在对应的函数或变量前面。JavaDoc类型的多行注释风格如下&#xff1a; /** * 这里为注释. */ 一般注释中有简要注释和详细注释&#xff0c;简要注释有多种标识方式&#xff0c;这里推荐使用brief命令强制说明&#xff0c;例如&#xff1a;/** * brief 这里…

段错误:SIGSEGV

SIGSEGV是在访问内存时发生的错误&#xff0c;它属于内存管理的范畴 SIGSEGV是一个用户态的概念&#xff0c;是操作系统在用户态程序错误访问内存时所做出的处理。 当用户态程序访问&#xff08;访问表示读、写或执行&#xff09;不允许访问的内存时&#xff0c;产生SIGSEGV。 …

web3 0.2.x 和 1.x.x版本之间的差异

版本差异 单位转换 0.2.x web3.fromWei(13144321,ether) 1.x.x web3.utils.fromWei(13144321,ether)1.0以后的版本使用了大量的Promise&#xff0c;可以结合async/await使用&#xff0c;而0.20版本只支持回调函数

如何提高阅读源码的能力并且手撕源码

怎么有效的手撕代码呢&#xff1f; 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

并发和并行的区别简单介绍

并发和并行 并发是关于正确有效地控制对共享资源的访问 同时完成多个任务。在开始处理其他任务之前&#xff0c;当前任务不需要完成。并发解决了阻塞发生的问题。当任务无法进一步执行&#xff0c;直到外部环境发生变化时才会继续执行。最常见的例子是I/O&#xff0c;其中任务…

手撕源码 alloc

怎么有效的手撕代码呢&#xff1f; gnu gcc 2.9 的 内存池 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo 第三步&#xff1a; 第五步: // 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、…

Algorand的共识协议及其核心的优势

Algorand 设计的初衷 Algorand 想解决的核心问题是&#xff1a;去中心化网络中低延时&#xff08;Latency&#xff09;和高置信度&#xff08;Confidence&#xff09;之间的矛盾。其中&#xff0c;延时指从发起交易到确认交易所需要的时间&#xff1b;置信度指的是发出的交易不…

手撕源码 SQL解析器 sqlparser

怎么有效的手撕代码呢&#xff1f; 源代码&#xff1a;https://github.com/hyrise/sql-parser 把代码跑起来把代码一个片段拿出来使用画出代码运行的流程图一行一行的搬运在看源码的情况下写出类似的demo

针对Algorand所使用的密码相关技术细节进行介绍

关键概念 VRF: 可验证随机函数。简单来说是&#xff1a;vrf,Proof VRF(sk,seed)&#xff0c;sk为私钥&#xff0c;seed为随机种子&#xff1b;通过Verify(proof,pk,seed)验证vrf的合法性。cryptographic sorition: 根据用户本轮的VRF值&#xff0c;自身的权重以及公开的区块链…

内存池的实现1 :重载

#ifndef KSTD_ALLOCATOR_H_ #define KSTD_ALLOCATOR_H_// 这个头文件包含一个模板类 allocator&#xff0c;用于管理内存的分配、释放&#xff0c;对象的构造、析构 // 暂不支持标准库容器 todo::支持萃取#include <new> // placement new #include <cstddef>…

对于Algorand的介绍

介绍 Algorand具有能耗低、效率高、民主化、分叉概率极低、可拓展性好等优点&#xff0c;旨在解决现有区块链项目存在的“不可能三角”&#xff08;高度可扩展的、安全的、去中心化&#xff09;问题。Algorand由MIT教授、图灵奖得主Silvio Micali发起&#xff0c;拥有MIT区块链…