Rust secp256k1库中等效NodeJS computeSecret()的实现方法
使用Rust secp256k1库实现ECDH共享对称密钥计算
你要实现的功能本质是ECDH密钥交换,Rust的secp256k1库中对应的方法是SecretKey::ecdh(新版本库),或者通过secp256k1::ecdh函数(旧版本),两者都能计算出满足symmetric_key(publicA, secretB) == symmetric_key(publicB, secretA)的共享对称密钥。
实现代码(新版本secp256k1,如0.28.x)
首先在Cargo.toml中添加依赖:
secp256k1 = "0.28"
然后编写对应函数:
use secp256k1::{PublicKey, SecretKey, Error}; /// 用对方公钥和己方私钥计算共享对称密钥 /// 满足 symmetric_key(publicA, secretB) == symmetric_key(publicB, secretA) fn symmetric_key(pkey_bytes: &[u8], skey_bytes: &[u8]) -> Result<[u8; 32], Error> { // 解析二进制公钥(支持压缩/非压缩格式) let public_key = PublicKey::from_slice(pkey_bytes)?; // 解析二进制私钥 let secret_key = SecretKey::from_slice(skey_bytes)?; // 计算ECDH共享密钥,返回共享点的X坐标(32字节,与NodeJS computeSecret结果一致) let shared_secret = secret_key.ecdh(&public_key); Ok(shared_secret) }
旧版本库兼容写法(如0.27.x及更早)
如果使用旧版secp256k1,需要调用顶层的ecdh函数:
use secp256k1::{PublicKey, SecretKey, ecdh, Error}; fn symmetric_key(pkey_bytes: &[u8], skey_bytes: &[u8]) -> Result<[u8; 32], Error> { let public_key = PublicKey::from_slice(pkey_bytes)?; let secret_key = SecretKey::from_slice(skey_bytes)?; let mut shared_secret = [0u8; 32]; // 填充共享密钥到指定数组 ecdh(&mut shared_secret, &public_key, &secret_key)?; Ok(shared_secret) }
说明
- NodeJS中
computeSecret返回的是ECDH共享点的X坐标二进制数据,Rust代码中ecdh方法/函数的返回值与之一致,因此两者计算结果完全等价。 - ECDH的数学特性保证了
secretB * publicA和secretA * publicB得到的共享点完全相同,因此满足你要求的对称等式。
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

