Golang 中的 crypto/ecdh 包详解

什么是 ECDH 算法?

ECDH(Elliptic Curve Diffie-Hellman)算法是一种基于椭圆曲线的密钥交换协议,用于安全地协商共享密钥(Secret Key),步骤如下:

1. 选择椭圆曲线:ECDH 算法的第一步是选择一个适当的椭圆曲线。通常情况下使用一个已知且被广泛接受的椭圆曲线,例如 NIST 曲线(如 P-256、P-384 等)。

2. 密钥生成:每个参与方(通常是通信的两个实体)都会生成一对密钥,其中包括一个私钥(Private Key)和一个公钥(Public Key)。私钥是一个随机生成的秘密值,而公钥是通过使用算法规定的椭圆曲线上的点乘法来计算得出的。

3. 密钥交换:参与方交换各自的公钥。一般情况下,这些公钥可以被公开分享而不会泄露私钥。

4. 密钥协商:参与方利用对方的公钥和自己的私钥进行计算,生成一个共享的密钥。计算方式是通过将对方的公钥与自己的私钥进行点乘法运算,得到一个共享的曲线上的点。这个点的横坐标或纵坐标值可以作为共享密钥的,具体取决于使用的椭圆曲线参数。

5. 密钥派生:在 ECDH 中,生成的共享点并不直接用作密钥,而是通过一个密钥派生函数(Key Derivation Function,KDF)进行处理,生成一段具有足够随机性和长度的共享密钥。

ECDH 算法的关键优势在于安全性和效率。相较于传统的 Diffie-Hellman(DH)算法,ECDH 使用较短的密钥长度提供相当高的安全性,从而减少了计算和传输开销。同时,椭圆曲线加密算法天生具有防抵御量子计算攻击的性质,这使得 ECDH 对于未来的加密需求更具备可持续性。

Golang 从1.20版本开始提供的 crypto/ecdh 包支持 NIST 曲线和 Curve25519 上的椭圆曲线 Diffie-Hellman 密钥交换(P-256、P-384、P-521 和 X25519),使用起来非常方便。

crypto/ecdh 包的使用方法

首先创建两个密钥。一个给 Alice,一个给 Bob。Alice 和 Bob 需要就他们可以加密的共享密钥达成一致。

package mainimport ("crypto/ecdh""crypto/rand"
)func main() {aliceKey, err := ecdh.P256().GenerateKey(rand.Reader)if err != nil {panic(err)}bobKey, err := ecdh.P256().GenerateKey(rand.Reader)if err != nil {panic(err)}
}

Alice 把自己的公钥给 Bob,Bob 可以使用这个公钥和自己的私钥生成共享密钥,因为生成的密钥中存在不可见字符,所以通过计算出密钥的哈希值来观察 Alice 和 Bob 生成的密钥是否相同。

Bob 把自己的公钥给 Alice,Alice 可以使用这个公钥和自己的私钥生成密钥,并且 Alice 和 Bob 生成的秘钥是相同的。如下:

package mainimport ("crypto/ecdh""crypto/rand""crypto/sha256""fmt"
)func main() {aliceKey, err := ecdh.P256().GenerateKey(rand.Reader)if err != nil {panic(err)}bobKey, err := ecdh.P256().GenerateKey(rand.Reader)if err != nil {panic(err)}alicePubkey := aliceKey.PublicKey()shared, _ := bobKey.ECDH(alicePubkey)bobShared := sha256.Sum256(shared)fmt.Printf("秘钥哈希(Bob)  %x\n", bobShared) // 秘钥哈希(Bob)  a74e7949e71ead5f3bd4de031e2ad45c3f5b80b48ccf50e50eb86f4bdb025c3abobPubkey := bobKey.PublicKey()shared, _ = aliceKey.ECDH(bobPubkey)aliceShared := sha256.Sum256(shared)fmt.Printf("秘钥哈希(Alice)  %x\n", aliceShared)// 秘钥哈希(Alice)  a74e7949e71ead5f3bd4de031e2ad45c3f5b80b48ccf50e50eb86f4bdb025c3a
}

可以看出 Alice 和 Bob 生成的密钥是相同的。

小结

需要注意的是,ECDH 只提供密钥交换功能,并不涉及加密或身份验证。因此,在实际应用中,通常将 ECDH 与对称加密算法(如 AES)结合使用,以实现安全的通信。

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

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

相关文章

linux字符串处理

目录 1. C 截取字符串,截取两个子串中间的字符串linux串口AT指令 2. 获取该字符串后面的字符串用 strstr() 函数查找需要提取的特定字符串,然后通过指针运算获取该字符串后面的字符串用 strtok() 函数分割字符串,找到需要提取的特定字符串后,…

HTML/CSS盒子模型

盒子:页面中的所有的元素(标签),都可以看做一个盒子,由盒子将页面中的元素包含在一个矩形区域内,通过盒子的视角更加方便的进行页面布局 盒子模型的组成: 内容区域(content&#xff…

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下,代码很简单,有几点要注意, 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时,如果需要插入空格,要使用双引号 cmd_ay(1) 0x33; …

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS

硬件性能评估指标-DMIPS、MFLOPS、MAC、TOPS DMIPS(Dhrystone Million Instructions Per Second): DMIPS用于衡量计算机系统的整体指令执行性能,通常关注整数操作。它基于Dhrystone基准测试来计算,该测试主要包含整数运…

Android 进阶——图形显示系统之VSync和 Choreographer的创建详解(一)

引言 前一篇文章Android 进阶——图形显示系统之底层图像显示原理小结(一)介绍了关于Android 图形显示系统的基础理论,相信你对于Android的图形显示系统中图形界面渲染刷新机制有了更深的了解,接下来进一步讲解VSync和Choreography的联系和作用。 一、VSync 信号的产生概…

需求管理系统大盘点,谁能问鼎行业王者宝座?

“需求管理系统有哪些?这些品牌引领行业新风潮:Zoho Projects、SAP SuccessFactors、Oracle NetSuite、Microsoft Dynamics 365、Infor CloudSuite、JDA Software。” 需求管理系统是一种专门用于收集、分析和跟踪客户需求的工具,可以帮助企业…

总线:特性、分类、性能指标、系统总线的结构、总线仲裁、总线定时、总线标准

总线(Bus),是一组为各功能部件之间进行信息传送的公共线路。 总线的特性: 机械特性(物理特性):尺寸、形状、引脚数、排列顺序。电气特性:每根信号线上的信号传输方向、表示信号有效…

交换机 路由器的常见指令

常用的指令 交换机和路由器是网络中最常见的设备之一,它们都有一些常用的指令。下面是它们的常用指令和解释: 交换机常用指令 show interfaces:显示交换机上的所有接口信息,包括状态、速率、错误信息等。show mac-address-tabl…

deepspeed学习资料

记录一些deepspeed学习过程中的好文章 【进行中】1、DeepSpeed使用指南(简略版)_Reza.的博客-CSDN博客 - 含deepspeed的安装方法 - 含 zero config的不同配置,stage1、stage2、stage3的配置和解释

Go实现LogAgent:海量日志收集系统【上篇——LogAgent实现】

Go实现LogAgent 项目架构图: 0 项目背景与方案选择 背景 当公司发展的越来越大,业务越来越复杂时,每个业务系统都有自己的日志。此时我们就应该将不同业务线的日志进行实时收集,存储到一个日志收集中心,最后再通过…

H5 + C3基础(六)(2D转换transform 位移 旋转 缩放)

2D转换transform & 2D转换transform平移利用平移百分比优化盒子水平垂直居中 旋转指定2d变换的中心点 transform-origin 缩放2d转换简写 2D转换transform 所谓2D转换,就是在二维坐标系内进行各种操作,包括平移,转动,缩放等等…

Spring Security 中多个身份验证

如果你希望只要一个身份验证通过,就不再继续运行下一个身份验证配置,你可以使用 Spring Security 中的 AuthenticationManager 和 ProviderManager 来实现这一点。 ProviderManager 是 Spring Security 的核心组件之一,负责管理一系列的身份…

RecyclerView的局部刷新居然这么简单

RecyclerView的局部刷新 面试时经常被问到Android列表控件RecyclerView,无非就是深入源码与ListView进行对比,四层缓存和局部刷新。而今天的重点就是局部刷新 使用场景 我们在使用RecyclerView的局部刷新时,往往使用notify相关方法&#xff…

Android studio 软件git使用

在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…

MySQL—MySQL主从如何保证强一致性

一、前言 涉及到的东西:两阶段提交,binlog三种格式 1、两阶段提交 在持久化 redo log 和 binlog 这两份日志的时候,如果出现半成功的状态,就会造成主从环境的数据不一致性。这是因为 redo log 影响主库的数据,binlog…

Java设计模式:一、六大设计原则-02:开闭原则

文章目录 一、定义:开闭原则二、模拟场景:开闭原则2.0 工程结构2.1 定义面积计算接口2.2 面积计算实现类 三、违背方案:开闭原则四、改善代码:开闭原则4.1 扩展继承4.2 单元测试 一、定义:开闭原则 开闭原则&#xff…

python爬虫—requests

一、安装 pip install requests 二、基本使用 1、基本使用 类型 : models.Response r.text : 获取网站源码 r.encoding :访问或定制编码方式 r.url :获取请求的 url r.content :响应的字节类型 r.status_code :响应…

Python入门学习——Day2-变量和数据类型

一、Python 变量 在Python中,变量用于保存数据,方便程序对数据的处理和操作。下面是关于Python变量的一些重要概念: 变量命名规则: 变量名由字母、数字和下划线组成。变量名可以以字母或下划线开头,但不能以数字开头…

界面控件DevExpress WinForms(v23.2)下半年发展路线图

本文主要概述了官方在下半年(v23.2)中一些与DevExpress WinForms相关的开发计划,重点关注的领域将是可访问性支持和支持.NET 8。 DevExpress WinForms有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能…

数据库访问性能优化

目录 IO性能分析数据库性能优化漏斗法则1、减少数据访问(减少磁盘访问)(1) 正确的创建并使用索引索引生效场景索引失效场景判断索引是否生效--执行计划 2、返回更少数据(减少网络传输或磁盘访问)(1) 数据分页处理(减少行数)客户端…