You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:12:03