Pedersen 承诺是一个密码学原语,允许用户对一个值进行承诺,并在之后可以打开这个承诺
。
类似于:把一个数字放在密封信封中,之后可以打开信封验证。
基本要素:
- 两个生成元:
G
和H
- 要隐藏的值:
m
- 随机数:
r
(称为遮盖因子 blinding factor) - 承诺值:
P = m*G + r*H
- 初始化阶段
- 选择椭圆曲线群的两个生成元
G
和H
- 关键:没有人知道
G
和H
之间的离散对数关系 - 这两个生成元是公开的系统参数
- 承诺阶段
- 承诺者选择要隐藏的值
m
- 随机选择一个遮盖因子
r
- 计算承诺值:
P = m*G + r*H
- 公开发布承诺值
P
- 打开阶段
- 承诺者公开原始值
m
和随机数r
- 验证者通过计算
m*G + r*H
是否等于P
来验证承诺
- 隐藏性
- 仅从承诺值 P 无法推导出原始值 m
- 这是因为随机数 r 的存在
- 即使对手计算能力无限强大也无法破解
- 绑定性
- 承诺者无法改变已经承诺的值
- 只要 G 和 H 之间的离散对数关系未知
- 计算上不可能找到另一对 (m', r') 产生相同的承诺值
- 同态性
对两个承诺:
P1 = m1*G + r1*H
P2 = m2*G + r2*H
它们的和:
P1 + P2 = (m1+m2)*G + (r1+r2)*H
- 等于对
(m1+m2)
的承诺
- 生成元选择
- G 和 H 必须正确生成
- 没有人知道它们之间的离散对数关系
- 否则整个系统的安全性将被破坏
- 随机数管理
- 每次承诺使用新的随机数
- 随机数必须安全生成
- 私下安全传输给接收方
- 离散对数保护
如果有人知道
H = α*G
- 可以通过调整 r 值伪造承诺
- 可以将小额伪装成大额
- 整个系统的安全性将完全崩溃
优点
- 完美隐藏性
- 计算绑定性
- 支持同态运算
- 效率相对较高 缺点
- 需要安全传输随机数
- 承诺大小固定
- 依赖离散对数难题
- 需要可信初始化