使用 pre-existing 私钥签署文件以创建证书 (C#)

Using a pre-existing private key to sign file to create a certificate (C#)

我已经阅读了 Whosebug 上的所有文章,虽然其中很多都接近我想要的解决方案,但 none 似乎可行。

我只是想用一个现有的私钥来创建一段数据的签名。然后这成为数据文件的一部分,其中包括描述所用参数的 header。接下来是数据文件的签名版本,最后是数据文件本身(十六进制文件)。文件的串联不是问题,使用我拥有的私有和 public 密钥对生成证书才是问题。密钥的格式为 ("-----BEGIN PRIVATE KEY-----") 我可以很容易地从头开始生成签名文件,但是读取最终文件的软件需要 256 字节的签名,而我的(使用 RSA-256)只产生 32 字节的签名。它只能访问 public 密钥来解密和验证文件签名。

我遇到过很多错误,例如键集无效、不存在、ComputeHash 函数不工作并导致崩溃。我怀疑我需要通过 CSPParameters 向我的 RSACryptographicService 提供更多信息,但不确定这样做的必要性和充分性。 我想避免深入研究算法背后的数学原理,例如手动 setting/reading 模数/P/Q 值等。任何人都可以提出一种简单的方法来做到这一点或告诉我哪里出错了吗?代码可应要求提供。

您收到的关于 256 字节签名太长的评论是荒谬的。忽略那些。

256 位(32 字节)将是一个非常小的签名,不可能是正确的。我相信您真正要寻找的是 2048 位(256 字节)RSA 签名。以今天的标准来看,这些更明智(尽管大一步也无妨)。

关于导入密钥而不是手动设置密钥组件,您应该查看 "PEM" 格式的 RSA 密钥。有几个 nuget 包可以处理它们。否则,您可以剥离 header/footer 并自行解码 base64,并使用一些内置的 X509 类.

导入关键组件

.NET 本身不支持 PEM 格式密钥,因此,我建议使用信誉良好的加密库,例如 BouncyCastle,因为它们在其 RSA 算法中支持 PEM 密钥解析。

这个现有的 Whosebug link 描述了如何在 BouncyCastle 中导入密钥: Reading PEM RSA Public Key Only using Bouncy Castle