为什么Golang的nacl库中box与sign包使用不同的密钥长度?
nacl/box与nacl/sign包密钥长度差异的原因
这两个包的密钥长度设计差异来自于底层使用的密码学原语不同,以及对应的场景优化策略:
nacl/box是公钥加密用途的包,底层基于Curve25519椭圆曲线密钥交换算法实现,其原生私钥长度就是32字节,该长度设计完全可以满足加密场景下的密钥协商、加解密全流程需求。nacl/sign是数字签名用途的包,底层基于Ed25519签名算法实现,你看到的64字节私钥本质是 32字节原始私钥种子 + 32字节对应公钥 的拼接结构。官方设计成拼接格式是为了优化签名性能:Ed25519签名过程需要频繁调用公钥,直接把公钥附在私钥后可以避免每次签名都要从私钥重新推导公钥的计算开销,提升运行效率。如果你希望减少存储成本,也可以仅存储32字节的原始私钥种子,使用时再动态推导生成完整的64字节私钥即可。
如果你不想维护两套独立密钥,也可以采用基于同一份高熵种子派生两类密钥的方案,派生时注意增加不同的域标识参数避免密钥重用风险即可。
内容的提问来源于stack exchange,提问作者a11hard
相关产品推荐
相关产品推荐

