C# 签名与公钥匹配

Posted

技术标签:

【中文标题】C# 签名与公钥匹配【英文标题】:C# Signature Matching with Public Key 【发布时间】:2019-05-27 19:17:14 【问题描述】:

我正在与试图建立双向数字签名匹配的第三方合作。在我这边,我们使用 C#,而第三方使用 Java。到目前为止,我能够在 OpenSSL 中生成密钥配对并使用私钥生成他们能够在其 Java 环境中匹配的签名(下面的 C# 代码)。反方向,如何使用生成的公钥创建匹配签名?

我尝试使用下面相同的代码,只是在导入公钥时更改 CngKeyBlobFormat,但所有其他类型都会产生错误。

在双方都使用以下 OpenSSL 命令来生成公钥和私钥:

openssl genrsa -des3 -out my_rsa_key_pair 2048

openssl pkcs8 -topk8 -inform PEM -in my_rsa_key_pair -outform PEM -out private_key.pem -nocrypt

openssl rsa -in my_rsa_key_pair -outform PEM -pubout -out public_key.pem

这是用于从私钥生成签名的 C# 代码:

byte[] keyBytes = Convert.FromBase64String(privateKey);
byte[] valueBytes = Encoding.UTF8.GetBytes(stringToSign);
byte[] signedBytes;

using (CngKey key = CngKey.Import(keyBytes, CngKeyBlobFormat.Pkcs8PrivateBlob))
using (RSA rsa = new RSACng(key))

    signedBytes = rsa.SignData(valueBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    return Convert.ToBase64String(signedBytes);

使用公钥,我需要在 C# 中生成与使用私钥生成的签名相匹配的签名。这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

有很多关于签名生成/验证的帖子,在找到正确的关键词后,我在下面的帖子中找到了答案。鉴于上述生成公钥/私钥对的代码和方法,本文中的答案将成功验证仅使用公钥的私钥生成的签名。让任何搜索解决方案双方的人都可以打开它: Verify signature generated with RSA 2048-bit key, SHA256 algorithm and PKCSv1.5 padding

【讨论】:

以上是关于C# 签名与公钥匹配的主要内容,如果未能解决你的问题,请参考以下文章