不涉及数学公式,仅简单介绍,以及举个栗子,让其不太过于抽象。
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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!