如何将crypto::sha2::Sha256哈希转为&[u8]并生成ED25519密钥对?
解决rust-crypto中SHA256哈希转ED25519种子的问题
嘿,我来帮你搞定这个问题!你现在的核心困惑在于:手里的Sha256实例是正在计算哈希的工具,而不是最终生成的哈希字节数组——ed25519::keypair需要的是一个32字节的切片(刚好是SHA256哈希的固定长度),所以我们得先把哈希值从计算器里取出来,再传给密钥生成方法。
修改后的完整代码
extern crate crypto; // rust-crypto = "0.2.36" use crypto::ed25519; use crypto::sha2::Sha256; use crypto::digest::Digest; fn main() { let phrase = "purchase hobby popular celery evil fantasy someone party position gossip host gather"; let mut hasher = Sha256::new(); hasher.input_str(&phrase); // 准备一个32字节的缓冲区,刚好匹配SHA256的输出长度 let mut seed = [0u8; 32]; // 把计算好的哈希值写入缓冲区 hasher.result(&mut seed); // 现在seed就是符合要求的&[u8]切片了 let (_priv, _publ) = ed25519::keypair(&seed); }
关键细节说明
- 我把原来的
seed变量改名为hasher,这样语义更准确——它是哈希计算的载体,不是最终的种子。 - 创建
[0u8; 32]固定大小数组是因为SHA256的输出长度是固定32字节,这样能避免缓冲区大小不匹配导致的panic。 hasher.result(&mut seed)方法会把计算完成的哈希值填充到我们准备的数组里,之后数组可以自动转为&[u8]切片,完美匹配keypair的参数要求。
如果想更严谨一点,也可以用hasher.output_bytes()获取哈希输出的预期长度,再动态创建缓冲区,但SHA256的长度是固定的,直接写死32字节完全没问题。
内容的提问来源于stack exchange,提问作者l5y
相关产品推荐
相关产品推荐

