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# 签名与公钥匹配的主要内容,如果未能解决你的问题,请参考以下文章

C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)

C# 中签名程序集的公钥的结构是啥?

如何使用使用 sha1ecdsa 的公钥验证数据是不是符合签名?

Ebay 公钥验证在 C# 中失败,但在节点中工作

针对 RSA 公钥对字符串进行签名

c#如何验证签名JWT?