ecc椭圆加密算法c语言,ECC 椭圆曲线加密算法学习————ECDH与ECDSA

0x00 前言

之前学习了实数域上的椭圆曲线与有限域$\mathbb {F}_{p}$上的椭圆曲线。详细可以参考ECC椭圆加密算法学习————从实数域到有限域的椭圆曲线。

不难发现,在实数域的标量乘法看上去是一个“简单”的问题,但是在有限域$\mathbb {F}_{p}$就显得非常困难。本文主要讨论如何将之前所学的运用于加密问题中。

相关代码

一些重要的域参数素数 $p$

椭圆曲线系数 $a$ 与 $b$

基点(生成元) $G$

子群的阶$n$

辅因子$h$

之后,将这六个域参数组合成一个一个六元组$(p,a,b,G,n,h)$

在后文中会经常用到

本文代码

0x01 椭圆曲线加密算法

尽管之前花了很长时间的铺垫,但是椭圆曲线的密码学策略,简单而纯粹

在选取完毕一个六元组后,定义如下内容私钥: 一个随机的整数$d$,选取自${1,...,n-1}$

公钥:$H = dG$  ($G$是循环子群的生成元)

至此,来考虑一个问题

如果我们知道 $d$与六元组,那么很简单就可以算出$H$了。但是,如果我们只知道$H$和$G$,去寻找一个$d$是非常困难的,因为这需要解决离散对数问题。

通过这一组密钥,可以衍生出两种经典的椭圆曲线加密算法,分别是 ECDH,可以用来加密。以及 ECDSA ,可以用来数字签名

0x02 ECDH 加密算法

ECDH是Diffie—Hellman算法的衍生。关于DH算法这里不展开,如果能学到这里想必对DSA与DH都有一定程度的了解。

2.1 ECDH 的工作过程

ECDH的工作原理如下所示,实际上和纯粹的DH算法有着非常相似的地方Alice 和 Bob 首先约定一个六元组,生成自己的私钥和公钥。定义数据结构如下

Alice Private Key : $d_A$

Alice Public Key : $H_A = d_AG$

Bob Private Key : $d_B$

Bob Public Key : $H_B = d_BG$

Alice 和 Bob 公开得交换公钥。第三方可以窃听到 公钥$H_A$和$H_B$,但是他无法解出$d_A$和$d_B$

Alice 用自己的私钥计算 $S_A = d_A H_B$;Bob 用自己的私钥计算 $S_B = d_B H_A$

很显然 $S_A = S_B$ 因为以下算式

$$S = d_AH_B =

你可能感兴趣的:(ecc椭圆加密算法c语言)