ECDSA非对称加密算法
ECDSA 介绍
椭圆曲线密码学简介
椭圆曲线密码学的简单介绍
ECDSA 签名验证原理及C语言实现
比特币背后的数学
基于有限域Fp的椭圆曲线域E(Fp)
椭圆曲线:
1 | y^2 ≡ x^3 + ax + b (mod p) |
椭圆曲线域E(Fp)的描述参数
1 | E : y^2 ≡ x^3 + ax + b (mod p) |
为描述特定的椭圆曲线域,需明确六个参数:T = (p, a, b, G, n, h)
- p: 代表有限域Fp的那个质数
- a,b:椭圆方程的参数
- G: 椭圆曲线上的一个基点G = (xG, yG)
- n:G在Fp中规定的序号,一个质数。
- h:余因数(cofactor),控制选取点的密度。h = #E(Fp) / n。
secp256k1中的参数:
1 | p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F |
公钥和私钥
随机从[1,n-1]中选取一个数d, 计算Q = dG。 其中,d就是私钥,而Q即为公钥。
有限域中的加法和乘法是有特殊规定的,dG是一个标量乘法,可以转化为加法运算。
基于Fp的椭圆曲线点的集合域中,加法运算是:
1 | 不同的点相加: (x1, y1) ∈ E(Fp) , (x2, y2) ∈ E(Fp), x1 ≠x2 (x1, y1) + (x2, y2) = (x3, y3),其中, x3 ≡ λ^2 − x1 − x2 (mod p), y3 ≡ λ(x1 − x3) − y1 (mod p), 而λ≡ (y2 − y1)/(x2 − x1)(mod p). |
ECDSA签名过程
用户的密钥对:(d, Q);(d为私钥,Q为公钥)
待签名的信息:M;
签名:Signature(M) = ( r, s)
签名过程:
- 1、根据ECC算法随机生成一个密钥对(k, R), R=(xR, yR)
- 2、令 r = xR mod n,如果r = 0,则返回步骤1
- 3、计算 H = Hash(M)
- 4、按照数据类型转换规则,将H转化为一个big endian的整数e
- 5、s = k^-1 (e + rd) mod n,若s = 0, 则返回步骤1
- 6、输出的S =(r,s)即为签名。
验证过程:
- 1、 计算 H = Hash(M)
- 2、按照数据类型转换规则,将H转化为一个big endian的整数e
- 3、计算 u1 = es^-1 mod n, u2 = rs^-1 mod n
- 4、计算 R = (xR, yR) = u1G + u2Q, 如果R = 零点,则验证该签名无效
- 5、令 v = xR mod n
- 6、若 v == r,则签名有效,若 v ≠ r, 则签名无效。
linux openssl tool
生成密钥
查看支持的curves
1 | openssl ecparam -list_curves |
选择一种curve生成private key:
1 | openssl ecparam -name secp384r1 -genkey -out ecdsa_p384_sign.key |
生成密钥文件的pem内容:
1 | -----BEGIN EC PARAMETERS----- |
查看私钥内容:
1 | openssl ec -in ecdsa_p384_sign.key -text -noout |
根据私钥生成公钥:
1 | openssl ec -in ecdsa_p384_sign.key -pubout -out ecdsa_p384_verify.key |
生成证书请求
1 | openssl req -new -key ecdsa_p384_sign.key -out ecdsa_p384_sign.csr |
生成自签名证书
1 | openssl req -new -key ecdsa_p384_sign.key -x509 -nodes -days 365 -out ecdsa_p384_cert.pem |
Python ECDSA
依赖
1 | ecdsa |
简单使用
1 | from ecdsa import SigningKey, NIST384p |
支持的curve
ecdsa支持NIST Curve P-192、NIST Curve P-224、NIST Curve P-256、NIST Curve P-384、NIST Curve P-521和Certicom secp256-k1
默认的hash为sha1,也可以自定义其他hashlib有的hashfunc,但是需要注意的是hashfunc输出的hash长度不要超过curve生成的签名长度。
1 | hashfunc= should behave like hashlib.sha1 . The output length of the |
curve定义的参数在python-ecdsa/src/ecdsa/ecdsa.py文件里
1 | # NIST Curve P-192: |
私钥操作
1 | # -*- coding: UTF-8 -*- |
公钥操作
1 | # -*- coding: UTF-8 -*- |
ECDSA test
1 | # -*- coding: UTF-8 -*- |
运行结果显示:
1 | ECDSA Public Key Info: |
Python OpenSSL
依赖
1 | OpenSSL |
私钥操作
1 | # -*- coding: UTF-8 -*- |
公钥操作
1 | # -*- coding: UTF-8 -*- |
key_len_file
1 | # -*- coding: UTF-8 -*- |
test
1 | # -*- coding: UTF-8 -*- |
运行输出:
1 | message_sign: |
文章部分内容整理自:
比特币系统采用的公钥密码学方案和ECDSA签名算法介绍——第一部分:原理
本文标题:ECDSA非对称加密算法
文章作者:Mr Bluyee
发布时间:2018-12-04
最后更新:2019-07-15
版权声明:The author owns the copyright, please indicate the source reproduced.