为什么同一条消息我的 ECDSA P-384 签名没有不同?

问题描述 投票:0回答:1

ECDSA P-384 应该具有不同的签名,即使签名的消息完全相同。

为什么 ECDSA 会为相同的数据生成不同的签名,而 RSA 不会?

这似乎可以在 JavaScript 中使用 Crypto Subtle 库,即使对于相同的消息也会给出不同的签名。

但在 Rust 中,这不起作用。我不断收到同一条消息的相同签名。请看下文。 (密钥和消息是虚拟数据,仅供测试)

use p384::{elliptic_curve::SecretKey, ecdsa::{SigningKey, Signature, signature::Signer}};

fn main() {
    let jwk_string = format!(r#"{{"kty": "EC","crv": "P-384","x": "w6CbiBS2SKN4Y4hov7BqJbq3ZVZeEks_3PEUFEb281nYHWZYpCd8BrC1M7CfJYi4","y": "yYugPHaZMaOo_BKWaIMDDXDauZD9tKGGg444dY-tJ-0lmsZI3jJ99fw5LlXkCJMp","d": "zO5NR7o0T5jJc3aqr2mwHVjQeDAfzMovpc3-9uYeKxBAfZ4_07G0_jQDaiuyKNPM"}}"#);

    let key = match SecretKey::from_jwk_str(&jwk_string) {
        Ok(p) => SigningKey::from(p),
        Err(e) => {
            println!("Not valid secret key: {}",e);
            return;
        },
    };

    let to_sign = "public.xvRyWGu5CjC-ufl18xIQFUHN9XlLQoXFkU8RCLfRMooi63ftX-nAHXt5tuNP_ZYC.wjRSUmKCVY_yL8ZjpoHWCOaB7NOc2yEt-VtrsqQJHGrYr1uCT_m6Qbrg84BCkHMF";
    let to_sign_bytes = to_sign.as_bytes();
    println!("to_sign_bytes: {:?}",to_sign_bytes);
    let signature : Signature = key.sign(to_sign_bytes);
    println!("Signature: {:x?}",hex::encode(signature.to_bytes()));

}

输出:

to_sign_bytes: [112, 117, 98, 108, 105, 99, 46, 120, 118, 82, 121, 87, 71, 117, 53, 67, 106, 67, 45, 117, 102, 108, 49, 56, 120, 73, 81, 70, 85, 72, 78, 57, 88, 108, 76, 81, 111, 88, 70, 107, 85, 56, 82, 67, 76, 102, 82, 77, 111, 111, 105, 54, 51, 102, 116, 88, 45, 110, 65, 72, 88, 116, 53, 116, 117, 78, 80, 95, 90, 89, 67, 46, 119, 106, 82, 83, 85, 109, 75, 67, 86, 89, 95, 121, 76, 56, 90, 106, 112, 111, 72, 87, 67, 79, 97, 66, 55, 78, 79, 99, 50, 121, 69, 116, 45, 86, 116, 114, 115, 113, 81, 74, 72, 71, 114, 89, 114, 49, 117, 67, 84, 95, 109, 54, 81, 98, 114, 103, 56, 52, 66, 67, 107, 72, 77, 70]

Signature: "f4ff418ceece0b6d276e75938ea825ada59885249da48d492ed671af0f77f53b8e9ddf2c9401f848239279acf717b4f7ca158721d2c9a80078312ae02e76e239fafb3bd117099aee37d41a239ac6b305cfed009ab8b75641e44a227752077bd7"

这是我正在使用的

p384
板条箱中的错误吗?

编辑: 这可能与有关“sm2 签名方法在使用相同的 Secret_key 时似乎得到相同结果”的 Github 问题有关吗?:

https://github.com/RustCrypto/elliptic-curves/issues/883

rust cryptography digital-signature ecdsa ecdsasignature
1个回答
0
投票

RFC 6979 指定了一种确定性 DSA 和 ECDSA 的方法,该方法获取私钥和消息的哈希值,将它们输入 HMAC-DRBG,并以这种方式生成值 k

p384
板条箱默认使用它。

确定性 ECDSA 的优点是,一旦生成密钥,即使没有 CSPRNG,它也是安全的。这在某些环境中可能是有利的,并且可以防止使用中的 CSPRNG 被破坏或种子不足的风险(这在嵌入式设备和没有 TRNG 的某些类型的硬件上很常见)。有些人还喜欢相同的消息和密钥产生相同的签名,这在某些情况下是实用的。

当然,您可以使用使用 RNG 的板条箱中的变体。但是,您必须小心,因为您必须始终使用安全的 CSPRNG。例如,一些 Rust CSPRNG 不会在分叉后立即重新播种,这将允许重复的随机性,从而导致泄露整个密钥的安全漏洞。

© www.soinside.com 2019 - 2024. All rights reserved.