gpt4 book ai didi

c# - 如何在C#中验证数字签名

转载 作者:行者123 更新时间:2023-11-30 17:26:25 26 4
gpt4 key购买 nike

我是新来的。

我正在学习 C# 中的数字签名。生成证书后跟 this document .我阅读的其他文件:RSACng , X509Certificate2 .

我正在使用 Windows 10 Pro 1809、.Net Core 2.1、VSCode。

    class Program
{
static void Main(string[] args)
{
var passwd = "password";

// Get client certificate.
var clientCertPath = @"./Certificates/test.pfx";
var clientCert = new X509Certificate2(clientCertPath, passwd);

// Get server certificate.
var serverCertPath = @"./Certificates/test.cer";
var serverCert = new X509Certificate2(serverCertPath);

// Generate data.
var translateResultData = BuildData();
var content = String.Join('&', translateResultData.Select(p => String.Join('=', p.Key, p.Value)));

// Sign
var sign = SignatureUtil.Sign(data: content, clientCert: clientCert);
// translateResultData.TryAdd(key: "sign", value : sign);

// Copy content ONLY for test.
var checkSign = sign;
var checkContent = content;

// Verify
var valid = SignatureUtil.Verify(data: checkContent, signature: checkSign, serverCert: serverCert);
System.Console.WriteLine(valid);
}
}
    public class SignatureUtil
{
public static string Sign(string data, X509Certificate2 clientCert)
{
using(var privateKey = clientCert.GetRSAPrivateKey())
{
var dataByteArray = Encoding.UTF8.GetBytes(data);
var signatureByteArray = privateKey.SignData(
data: dataByteArray,
hashAlgorithm: HashAlgorithmName.SHA256,
padding: RSASignaturePadding.Pkcs1);
return Convert.ToBase64String(signatureByteArray);
}
}

public static bool Verify(string data, string signature, X509Certificate2 serverCert)
{
try
{
using(var publicKey = serverCert.GetRSAPublicKey())
{
var dataByteArray = Encoding.UTF8.GetBytes(data);
var signatureByteArray = Convert.FromBase64String(signature);
return publicKey.VerifyData(
data: dataByteArray,
signature: signatureByteArray,
hashAlgorithm: HashAlgorithmName.SHA256,
padding: RSASignaturePadding.Pkcs1);
}
}
catch (System.Exception)
{
return false;
}
}
}

预期结果:valid应该是true,因为我是在检查原始数据。
事实:即使传递了原始数据,Verify 方法总是返回 false

你能告诉我我做错了什么吗?

最佳答案

我无法告诉您代码中出了什么问题,因为我无法重现它。 Here是如何使用 RSA 和 SHA256 签名的非常详细的答案。您的方法与此答案中描述的方法在概念上是相同的,但与此答案相比,您的代码可能有所不同。

下面是一个示例,在我的公司中,与智能卡关联的证书如何用于签名和验证签名。一个很大的区别是我们不将签名存储为字符串,而是将其存储为字节数组。

public byte[] SignData(byte[] data)
{
using (var sha256 = SHA256.Create())
{
using (var rsa = Certificate.GetRSAPrivateKey())
{
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)
}
}
}


public bool VerifySignature(byte[] data, byte[] signature)
{
using (var sha256 = SHA256.Create())
{
using (var rsa = Certificate.GetRSAPublicKey())
{
return rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)
}
}
}

关于c# - 如何在C#中验证数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com