不涉及数学公式,仅简单介绍,以及举个栗子,让其不太过于抽象。

ECC是椭圆曲线,不同的椭圆曲线有不同的秘钥长度,不同的加密效果。这里介绍的是  secp256r1  曲线。

此曲线由六个参数确定,可以在规范中找到:

P = 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF'
A = 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC'
B = '5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B'
Gx = '6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296'
Gy = '4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5'
N= 'FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551'

这六个参数,可以确定一个曲线,(Gx,Gy)是曲线上的一个点。

ECC算法,是非对称加密算法。拥有一个公钥、一个私钥。

其中私钥是一个大数(整数),例如可以是 1A015FED3038F25B0215889E0EFECA7C550A144DD91F81979A5751AF9CB68835 这个数字可以是随机生成的,自己保留。

而公钥是一个坐标点(x,y),这个公钥位于ECC曲线上。使用ECC算法,输入私钥,会得到公钥(使用secp256r1曲线),计算方式为  公钥 = 私钥 * G 。得到的公钥为:04368E08660E8CB483BEFE80015BB8E3E0B86ED97927C131643CFC8FB262CD658FE204A2270170F9B1CA364120916B8BC3DD3DE90D5D9E8D26E42402A2FDE3B425

 

转换为坐标为(

368E08660E8CB483BEFE80015BB8E3E0B86ED97927C131643CFC8FB262CD658F ,E204A2270170F9B1CA364120916B8BC3DD3DE90D5D9E8D26E42402A2FDE3B425

),其中04代表的是公钥处于未压缩状态。

 

一般会使用ECC算法生成临时公私钥对,将临时公钥给对方,并接收到对方的公钥。这样双方可以使用ECDH算法,协商出一个  sharedSecret key。计算方式如下:

对象A拥有: 公钥Pa, 私钥Sa,临时公钥ePa, 临时私钥eSa,对方公钥Pb

对象B拥有:公钥Pb,私钥Sb,对方临时公钥ePa

sharedSecret key = ECDH(eSa, Pb) = ECDH(Sb, ePa), 就是我的私钥和你的公钥 但是有一方使用的是临时公钥。

这样在双方都各自产生了 sharedSecret key  ,如果这个时候,双方使用sharedSecret key 进行加解密,就变成了对称算法。因为只有一把秘钥,双方都拥有。

但是一般sharedSecret key 不直接参与加解密,会使用HKDF算法根据共同的参数 salt、info等得到一把派生Key,然后对派生Key进行切片,前多少字节用于加密数据,后多少字节用于计算MAC.

 

 

 

 

 

 

 

 

posted on 2024-01-26 10:31  西楼谢俞  阅读(96)  评论(0编辑  收藏  举报