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算法实现数字签名与认证(私钥签名,公钥认证)