Appearance
EC基本方案
ECDH(密钥交换)
密钥生成
私钥生成
私钥
公钥生成
公钥
密钥交换
Alice 和 Bob 通过以下步骤交换密钥:
- Alice 生成私钥
和公钥 ,将 发送给 Bob。 - Bob 生成私钥
和公钥 ,将 发送给 Alice。 - Alice 接收到
后,计算共享密钥: - Bob 接收到
后,计算共享密钥: - 最终得到相同共享密钥
。
ECIES(公钥加密)
密钥生成
私钥生成
私钥
公钥生成
公钥
加密过程
给定消息
- 生成随机数
,满足 。 - 计算点
。 - 计算公钥
。 - 生成对称密钥
,其中 是哈希函数。 - 加密消息
。 - 输出密文
。 - 发送密文
给接收方。
解密过程
给定密文
- 计算共享密钥
。 - 生成对称密钥
。 - 解密消息
。 - 输出明文
。
ECDSA(签名)
域参数
:有限域的大小 :椭圆曲线参数 :基点(生成元) :基点的阶(即 )
密钥生成
私钥生成
私钥
公钥生成
公钥
其中
签名生成
给定消息的哈希值
步骤1:生成随机数
生成一个随机数
!!!:这里是简化的,具体参照这里,简单说就是
步骤2:计算点
计算椭圆曲线点:
步骤3:计算 r
!!!:取点
步骤4:计算 s
!!!:
是 在模 下的乘法逆元 将消息哈希与私钥信息结合 - 整个表达式确保了签名与私钥和消息的绑定关系
如果
步骤5:输出签名
签名为
签名验证
给定消息哈希
步骤1:参数验证
验证
步骤2:计算逆元
计算
步骤3:计算标量
步骤4:计算验证点
步骤5:验证结果
如果
数学原理
从签名生成有:
重排得到:
在验证过程中:
替换
由于
根据签名生成中(式
这证明了验证点
Add-On: v的生成与公钥恢复
由于压缩传输空间的需要以及ECDSA可以从签名恢复公钥的性质,往往只传输
在以太坊中,需要一个
1) 到底在表达什么
ECDSA 签名里有中间点:
而签名的
因此仅凭
- 同一个
往往对应两个点( 与 ),需要 1 bit 表示 的奇偶性(或“是否取较大/较小根”)。 - 由于
是在有限域 上的坐标,而 是模 的结果,可能存在 需要再用 1 bit 表示 。
所以常见的恢复标识是:
其中通常可理解为:
:选择 的奇偶性(对应两种 ) :表示是否使用 (即 )
2) 以太坊里的
历史上(黄皮书/早期实现)以太坊把
引入 EIP-155(防重放)后,交易签名里常见:
因此从交易的
- 若
: - 否则(EIP-155):
备注:不同库/链的编码细节可能略有差异,但核心都是携带“恢复所需的那几 bit”。
3) 从 恢复公钥
ECDSA 有:
两边乘以
又因为
移项得到:
从而:
这就是“公钥恢复”的核心:只要能确定
而
4) 具体步骤
给定曲线参数
- 范围检查
- 由
构造候选
令,取 若 则该候选无效(这一分支失败)。 - 在曲线上解出点
计算若无解则该候选无效;若有两解 ,用 决定取哪个(例如选与奇偶性匹配的那个),得到 - 计算公钥
得到候选公钥 。 - 校验
用恢复出来的对 做一次标准 ECDSA 验签;通过则恢复成功,否则尝试其他候选(在实现里就是不同的 分支)。