如何使用 RustCrypto (ECDSA) 签署文件?

Posted

技术标签:

【中文标题】如何使用 RustCrypto (ECDSA) 签署文件?【英文标题】:How can I sign a document using RustCrypto (ECDSA)? 【发布时间】:2021-04-08 14:27:47 【问题描述】:

我对 Rust 还很陌生,但我正在尝试构建一个类似于 OpenSSL 的命令行工具,用 Rust 编写。

我正在尝试使用 Rust Crypto 和 ecdsa crate 实现数字签名。我已经有一个散列文件,接下来的步骤如下:

生成私钥和公钥 用私钥加密哈希值(这将是我的签名)

现在我不知道如何使用 ecdsa crate。如何生成私钥?

【问题讨论】:

【参考方案1】:

可以在文档中找到here 生成私钥的示例。它有点隐藏,因为密钥 pair 生成特定于所使用的曲线:

use p256::
    ecdsa::SigningKey, Signature, signature::Signer,
;
use rand_core::OsRng; // requires 'getrandom' feature

// Signing
let signing_key = SigningKey::random(&mut OsRng); // Serialize with `::to_bytes()`

请注意,ECDSA 的工作方式与 RSA 稍有不同,因此您不要使用私钥“加密”散列(实际上,这对 RSA 也是一个不好的描述)。您将改用签名者,并且消息的散列通常被认为是其中的一部分。该示例还显示了如何执行此操作。

文档非常糟糕,似乎 SHA-256 被用作下面的哈希,但不在此页面上。在我找到的源代码中:

impl ecdsa_core::hazmat::DigestPrimitive for NistP256 
    type Digest = sha2::Sha256;

所以我希望 Rust 用户确实了解如何设置/取消设置哈希。

【讨论】:

感谢您的帮助!我同意文档非常糟糕。我正在尝试像示例中那样实现它,但它不会让我导入 SigningKey unresolved import p256::ecdsa::SigningKey 。文档说此示例需要启用 ecdsa Cargo 功能,所以可能缺少此功能?我试图把它放在我的 Cargo.toml 功能部分下:ecdsa = [] 但这不起作用。有什么建议吗? @Lachr cargo.toml 中的 p256 依赖项应如下所示:p256 = version = "0.7.2", features = ["ecdsa"] 。您尝试的 [features] 部分是针对 current 板条箱的功能,而不是它的依赖项。

以上是关于如何使用 RustCrypto (ECDSA) 签署文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 golang 加密写出 ecdsa 密钥?

如何使用公钥验证 ECDSA?

如何使用椭圆曲线私钥和 ECDSA 算法签署证书?

如何使用证书中的公钥检查 ECDSA(在 p-256 上)签名

如何在 C# 中从 ECDsa 获取公钥

如何从 Crypto++ ECDSA 中的签名体中获取签名长度