ECDSA算法

ECDSA

椭圆曲线数字签名算法

简单来说,与DSA本质上区别不大,在原DSA生成 r r r的地方引入了椭圆曲线以及一些其他参数的变化

不熟悉DSA的可以看这:(14条消息) DSA算法_M3ng@L的博客-CSDN博客

公私钥的生成

  • 私钥

随机取一个在 ( 1 , n − 1 ) (1,n-1) (1n1)​区间上的整数 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=dAG​,其中 Q Q Q​​是公钥,也就是说这里公钥是通过私钥生成的

G G G是椭圆曲线上的基点,注意这个等式的乘法不是普通的乘法,是椭圆曲线加密中的乘法(不熟悉的可以看看这个vedio【ECC加密算法】| ECC加密原理详解| 椭圆曲线加密| 密码学| 信息安全_哔哩哔哩_bilibili

数字签名

  • 生成一个临时密钥 k k k

  • 计算 P = k ∗ G P=k*G P=kG,其中 P P P是椭圆曲线上的一个点

  • P P P​点的 x x x​坐标, r ≡ x   ( m o d   n ) r\equiv x~(mod~n) rx (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) sk1(H(m)+dAr) (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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

M3ng@L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值