椭圆曲线数字签名ECDS
参考博客:独奏の小屋
参考博客:Coder小Q

ECDSA
椭圆曲线数字签名算法(Elliptic Cureve Digital Signature Algorithm,简称ECDSA),是一种基于椭圆曲线密码学的公开密钥加密算法。1985年,Koblitz和Miller这两个人把数字签名算法移植到椭圆曲线上,椭圆曲线数字签名算法由此诞生。
其中ECDSA这个椭圆曲线数字签名算法是目前最常用的椭圆曲线数字签名算法,最近的密码题中也经常出现ECDSA这个考点(好像都是在随机数k这边做文章)。
签名过程
- 先确定一个椭圆曲线,以及求得该椭圆曲线的阶
n和基点G:
$$
y^2 \equiv x^3+ax+b ~mod(~p)\
n*G = O
$$
-
必要参数:
- 私钥:$d_A\in[1,n-1]$此为一个数。公钥:$Q_A=d_A*G$(此为一个点)。
- 需要进行数字签名的消息
m,并计算该消息的哈希值$h=Hash(m)$ - 生成一个随机数$k\in(1,n-1)$
-
签名过程:
- 计算$k*G=(x_1,y_1)$
- 计算$r=x_1~mod(~n)$
- 计算$s=k^{-1}*(h+rd_A)~mod(~n)$
- 最后得到签名对$(r,s)$
-
验证过程:
- 先判断$1<r,s<n$,如果不在此范围内说明消息被修改
- 计算$u_1\equiv hs^{-1}\equiv hk*(h+rd_A)^{-1}~mod(~n)$
- 计算$u_2\equiv rs^{-1}~mod(~n)$
- 计算$u_1G+u_2Q_A$,取最后的结果$x_1$,如果$x_1=r$就说明验证成功
- 验证的准确性:
$$
\begin{align}
u_1G+u_2Q_A&=hs^{-1}G+rs^{-1}Q_A
\&=s^{-1}(hG+rQ_A)
\&=s^{-1}(hG+rd_AG)
\&=s^{-1}(h+rd_A)G
\&=k(h+rd_A)^{-1}(h+r*d_A)G
\&=kG=(x_1,y_1)
\end{align}
$$
算法实现
ECDSA签名和认证的代码如下,使用Sagemath进行编写:
1 | import hashlib |
EdDSA
EdDSA英文全称为Edwards-curve Digital Signature Algorithm,其中文意思为,爱德华兹曲线数字签名算法,而爱德华兹曲线其实是如下形式的一个椭圆曲线:
$$
x^2+y^2=1+dx^2y^2
$$
- 所以
EdDSA本质上也是椭圆曲线数字签名算法,但是要与最常见的ECDSA椭圆曲线数字签名算法区别开。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 iyheart的博客!

