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

使用ecdsa crate生成ECDSA P256 Sha256签名结果异常求助

问题:用Rust复现RFC7515 A.3.1节签名结果不符

尝试用Rust复现RFC7515第A.3.1节的签名步骤,即便直接使用RFC中的原始字符串作为输入,也无法生成正确的R和S值。以下是我的代码:

use ecdsa::SigningKey;
use elliptic_curve::SecretKey;
use eyre::Result;

fn main() -> Result<()> {
    minimal_jws_signature()
}
fn minimal_jws_signature() -> Result<()> {
    let jws_signing_input = b"eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ";
    let key: SigningKey<p256::NistP256> = SigningKey::from(SecretKey::from_jwk_str("{\"kty\":\"EC\",\"crv\":\"P-256\",\"x\":\"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU\",\"y\":\"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0\",\"d\":\"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI\"}").unwrap());
    let (signature, _) = key.sign_recoverable(jws_signing_input).unwrap();
    println!("computed R: ");
    println!("{:#?}", signature.r().to_bytes());
    println!("computed S: ");
    println!("{:#?}", signature.s().to_bytes());
    Ok(())
}

运行后输出:

computed R: [123,134,107,133,151,91,21,14,250,223,68,234,231,81,58,69,8,137,105,167,189,108,83,70,38,204,200,134,219,172,19,12]
computed S: [239,59,109,107,204,126,250,89,234,250,201,25,246,101,189,248,86,50,38,221,197,81,151,72,144,114,214,223,226,224,88,223]

该结果与RFC中给出的R、S值不符。根据ecdsa crate文档,SigningKey<p256::NistP256>的sign_recoverable()方法应使用Sha256预哈希,符合RFC7515的要求,但实际结果不正确。我也尝试过先计算SHA256哈希再调用sign_prehash_recoverable(),但仍得到错误的字节序列,且不清楚ecdsa期望的哈希格式是什么。


内容的提问来源于stack exchange,提问作者Tomathor13

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:25:05