【发布时间】: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# 中生成与使用私钥生成的签名相匹配的签名。这样做的正确方法是什么?
【问题讨论】:
标签: c#