使用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
相关产品推荐
相关产品推荐

