椭圆曲线原理 椭圆曲线签名 椭圆曲线命令 椭圆曲线常用函数
- 2019-09-22 23:30:00
- admin
- 原创 4532
一、椭圆曲线原理
1、算法帮助:https://cryptobook.nakov.com/asymmetric-key-ciphers
2、椭圆曲线函数y^2 = x^3 + ax + b,椭圆曲线参数(p, a, b, n, x, y);
3、(p, a, b)定义了椭圆曲线,p是素数域,数学计算都在这个范围;
4、(x, y)定义了椭圆曲线基点G,n是基点的阶,是曲线上点的个数;
5、椭圆曲线上的任何一点都可以表示为kG,k范围是[1, n-1];
6、椭圆曲线是否安全由p和n共同决定,p和n都必须足够大;
7、假定Q=dG,那么d为私钥是一个数,Q为公钥是一个点;
8、椭圆曲线操作:double、add、multiply,不是算数运算;
9、椭圆曲线操作:multiply可以分解为double和add;
DH密钥交换算法:
1、Alice与Bob确定两个大素数n和g,这两个数不用保密
2、Alice选择另一个大随机数x,并计算A如下:A=gx mod n
3、Alice将A发给Bob
4、Bob选择另一个大随机数y,并计算B如下:B=gy mod n
5、Bob将B发给Alice
6、计算秘密密钥K1如下:K1=Bx mod n
7、计算秘密密钥K2如下:K2=Ay mod n
K1=K2,因此Alice和Bob可以用其进行加解密
SM2加密算法:
1、生成随机数k,C1=kG,C1为加密结果的第一部分;
2、Q是公钥,S=kQ=kdG=(x2,y2),dk=kdf(x2,y2,data.len)
3、C3=sm3(x2+data+y2),C3校验值为加密结果的第二部分;
4、C2=encrypt(dk,data),明文数据和加密数据长度一样;
5、加密结果为C1C3C2,C1长度64字节,C2长度32字节;
6、d是私钥,S=dC1=kdG=(x2,y2),dk=kdf(x2,y2,data.len)
二、椭圆曲线签名
ECDSA签名算法:
1、生成随机数k,R=kG,R的x坐标即为签名结果r;
2、d是私钥,z是数据哈希,invert(k,n)*(z+dr)即为签名结果s;
3、Q是公钥,invert(s,n)*z*G + invert(s,n)*r*Q=R即为验签过程;
4、如果随机数k泄露了,可以通过签名值推导出私钥d;
5、如果两次签名使用同一个随机数k,可以通过签名值推导出k;
Schnorr签名算法:
1、公钥dG=(x1,x2),公钥(n-d)G=(x2,y2),x1=x2,y1+y2=p,y1y2一个是奇数一个是偶数;
2、schnorr签名算法使用的私钥对应公钥的y坐标是偶数,所以私钥要么是d,私钥要么是n-d;
3、标签哈希算法:sha256(sha256(tag) || sha256(tag) || data),标签示例BIP0340/aux/nonce;
4、签名r:R=kG,k是随机数,R的x坐标是签名结果r;
5、签名s:s=k+ed,k是随机数,e是挑战码,d是私钥;
6、验签:sG=R+eP,R=kG,e是挑战码,P=dG是公钥;
7、辅助随机数:每次签名使用不同的辅助随机数,可以简单递增辅助随机数;
8、k生成因子:辅助随机数aux_rand、私钥d、公钥横坐标P[x]、消息m;
9、e生成因子:随机私钥横坐标R[x]、公钥横坐标P[x]、消息m;
10、批量验证:(s1 + a2s2 + .. ausu)G = (R1 + a2R2 + .. auRu) + (e1P1 + a2e2P2 + .. aueuPu)
11、批量验证:随机数ai=sha256(seed || i),seed=sha256(public keys || messages || signatures);
12、批量验证:支持同时验证多组签名,每组签名使用一个随机数,第一组签名通常不使用随机数;
Schnorr签名优势:
1、schnorr签名算法是线性的,因此支持批量验证,支持多重签名;
2、schnorr多重签名:多个签名结果直接相加,多个公钥直接相加之后验证签名;
3、schnorr多重签名:合并签名结果节约了存储空间,公钥相加之后验证提升了验证效率;
4、签名延展性:修改签名结果,签名一定失效,就具备签名延展性;
5、ecdsa不具备签名延展性,schnorr具备签名延展性;
三、椭圆曲线命令
openssl ecparam -list_curves,显示支持的曲线类型
openssl ecparam -genkey -name secp192k1 -out ec.pem,生成pkcs1格式私钥
openssl ec -param_out -in ec.pem | openssl asn1parse,查看曲线类型
openssl ec -in ec.pem -pubout -out ecpub.pem,导出公钥
openssl ec -noout -text -in ec.pem,查看私钥
openssl ecparam -out curve.param -name secp256k1,生成曲线参数
openssl genpkey -paramfile curve.param -out ec.pem,生成pkcs8格式私钥
openssl pkey -in ec.pem -pubout -out ecpub.pem,导出公钥
openssl pkey -noout -text -in ec.pem,查看私钥
openssl dgst -ecdsa-with-SHA1 -sign ec.pem -out sign datafile
openssl dgst -ecdsa-with-SHA1 -verify ecpub.pem -signature sign datafile
四、椭圆曲线常用函数
1、EC_KEY_new_by_curve_name(nid),生成EC_KEY,包含椭圆曲线参数EC_GROUP;
2、EC_KEY_generate_key(key),生成椭圆曲线私钥和公钥;
3、EC_KEY_get0_group(key),获取椭圆曲线参数;
4、EC_GROUP_get_degree(group),获取私钥比特位数,比如曲线secp192k1返回192;
5、EC_KEY_get0_private_key(key),获取私钥,打印值与openssl显示一致;
6、EC_KEY_get0_public_key(key),获取公钥,打印值与openssl显示一致;