ECDSA
椭圆曲线数字签名算法
简单来说,与DSA本质上区别不大,在原DSA生成 r r r的地方引入了椭圆曲线以及一些其他参数的变化
不熟悉DSA的可以看这:(14条消息) DSA算法_M3ng@L的博客-CSDN博客
公私钥的生成
- 私钥
随机取一个在 ( 1 , n − 1 ) (1,n-1) (1,n−1)区间上的整数 d A d_A dA作为私钥
这里的 n n n是选取椭圆曲线上的 o r d e r order order,也就是椭圆曲线加密方程的模数,之后提到的 n n n都是这个
- 公钥
Q = d A ∗ G Q=d_A*G Q=dA∗G,其中 Q Q Q是公钥,也就是说这里公钥是通过私钥生成的
而 G G G是椭圆曲线上的基点,注意这个等式的乘法不是普通的乘法,是椭圆曲线加密中的乘法(不熟悉的可以看看这个vedio【ECC加密算法】| ECC加密原理详解| 椭圆曲线加密| 密码学| 信息安全_哔哩哔哩_bilibili)
数字签名
-
生成一个临时密钥 k k k
-
计算 P = k ∗ G P=k*G P=k∗G,其中 P P P是椭圆曲线上的一个点
-
取 P P P点的 x x x坐标, r ≡ x ( m o d n ) r\equiv x~(mod~n) r≡x (mod n)
-
使用sha1函数计算 m e s s a g e message message的哈希值,使用 H ( m ) H(m) H(m)表示,注意这个哈希值需要转换为数值型
-
s ≡ k − 1 ∗ ( H ( m ) + d A ∗ r ) ( m o d n ) s\equiv k^{-1}*(H(m)+d_A*r)~(mod~n) s≡k−1∗(H(m)+dA∗r) (mod n)
而 ( r , s ) (r,s) (r,s)即为数字签名
Python实现
需要引入模块ecdsa
import ecdsa
选取一个椭圆曲线,这里以NIST256p为例
gen = ecdsa.NIST256p.generator
order = gen.order()
ecdsa模块中有封装好了的函数可以赋值直接生成ecdsa公钥,私钥的对象
# 生成私钥d_A
d_A = random.randrange(1,order-1)
# 生成公私钥对象
public_key = ecdsa.ecdsa.Public_key(gen,gen * d_A)
private_key = ecdsa.ecdsa.Private_key(public_key,d_A)
数字签名
message = "message"
m = int(hashlib.sha1(message.encode("utf8")).hexdigest(),16)
# 临时密钥
k = random.randrange(1,order-1)
# 签名
signature = private_key.sign(m,k)
r = signature.r
s = signature.s
P e f e r e n c e Peference Peference
一文读懂ECDSA算法如何保护数据 - 知乎 (zhihu.com)
Elliptic Curve Cryptography: ECDH and ECDSA - Andrea Corbellini