椭圆曲线原理 椭圆曲线签名 椭圆曲线命令 椭圆曲线常用函数

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显示一致;

发表评论
评论通过审核之后才会显示。