Libsodium中签名私钥为何为64字节?与Ed25519标准的差异疑问
为什么Libsodium中Ed25519私钥长度是64字节而不是标准的32字节?
Libsodium里的crypto_sign_SECRETKEYBYTES(对应Ed25519的crypto_sign_ed25519_SECRETKEYBYTES)定义为64字节,这个差异源于Libsodium对Ed25519密钥对的实用化存储设计:
- 标准Ed25519的私钥核心是32字节的随机种子,公钥是通过对这个种子做SHA-512哈希后,取前32字节作为秘密值,再推导生成的。
- Libsodium选择将32字节种子 + 对应的32字节公钥合并存储在同一个64字节的私钥变量中,这样在执行签名操作时,不需要重复计算公钥,直接读取存储的公钥部分,提升了调用效率。
- 如果你需要获取标准定义的32字节私钥(种子),可以用Libsodium提供的
crypto_sign_ed25519_sk_to_seed函数从64字节的私钥中提取:unsigned char seed[crypto_sign_ed25519_SEEDBYTES]; crypto_sign_ed25519_sk_to_seed(seed, sk); - 反过来,如果你已经有32字节的种子,也可以用
crypto_sign_ed25519_seed_keypair函数生成包含公钥的64字节私钥:unsigned char pk[crypto_sign_PUBLICKEYBYTES]; unsigned char sk[crypto_sign_SECRETKEYBYTES]; crypto_sign_ed25519_seed_keypair(pk, sk, seed);
这种设计完全符合Ed25519的安全标准,只是Libsodium为了简化开发、提升性能做的封装,本质上和标准Ed25519的密钥体系是一致的。
内容的提问来源于stack exchange,提问作者bohr
相关产品推荐
相关产品推荐

