C#签名与公钥的匹配

时间:2019-05-27 19:17:15

标签: c#

我正在与第三方合作,试图在两个方向上建立数字签名匹配。在我这边,我们正在使用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 个答案:

答案 0 :(得分:0)

关于签名生成/验证的帖子很多,点击了正确的关键词后,我在以下帖子中找到了答案。给定以上代码和生成公钥/私钥配对的方法,本文中的答案将仅使用公钥成功验证由私钥生成的签名。允许任何人在解决方案的两侧进行搜索: Verify signature generated with RSA 2048-bit key, SHA256 algorithm and PKCSv1.5 padding