Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言中验证数字签名#_C#_.net_.net Core - Fatal编程技术网

C# 如何在C语言中验证数字签名#

C# 如何在C语言中验证数字签名#,c#,.net,.net-core,C#,.net,.net Core,我是新来的 我正在学习C#中的数字签名。将生成证书,然后是。我读到的其他文件:, 我正在Windows 10 Pro 1809、.Net Core 2.1、VSCode上工作 类程序 { 静态void Main(字符串[]参数) { var passwd=“password”; //获取客户端证书。 var clientCertPath=@“/Certificates/test.pfx”; var clientCert=new X509Certificate2(clientCertPath,p

我是新来的

我正在学习C#中的数字签名。将生成证书,然后是。我读到的其他文件:,

我正在Windows 10 Pro 1809、.Net Core 2.1、VSCode上工作

类程序
{
静态void Main(字符串[]参数)
{
var passwd=“password”;
//获取客户端证书。
var clientCertPath=@“/Certificates/test.pfx”;
var clientCert=new X509Certificate2(clientCertPath,passwd);
//获取服务器证书。
var serverCertPath=@“/Certificates/test.cer”;
var serverCert=new X509Certificate2(serverCertPath);
//生成数据。
var translateResultData=BuildData();
var content=String.Join('&',translateResultData.Select(p=>String.Join('=',p.Key,p.Value));
//标志
var sign=SignatureUtil.sign(数据:content,clientCert:clientCert);
//translateResultData.TryAdd(键:“符号”,值:符号);
//复制内容仅用于测试。
var checkSign=符号;
var checkContent=内容;
//核实
var valid=SignatureUtil.Verify(数据:checkContent,签名:checkSign,服务器证书:服务器证书);
System.Console.WriteLine(有效);
}
}
public类SignatureUtil
{
公共静态字符串符号(字符串数据,X509Certificate2客户端证书)
{
使用(var privateKey=clientCert.GetRSAPrivateKey())
{
var-dataByteArray=Encoding.UTF8.GetBytes(数据);
var signatureByteArray=privateKey.SignData(
数据:dataByteArray,
HashAlgorithmName.SHA256,
填充:rsasignatureadding.Pkcs1);
返回Convert.tobase64字符串(signatureByteArray);
}
}
公共静态bool验证(字符串数据、字符串签名、X509Certificate2服务器证书)
{
尝试
{
使用(var publicKey=serverCert.GetRSAPublicKey())
{
var-dataByteArray=Encoding.UTF8.GetBytes(数据);
var signatureByteArray=Convert.FromBase64String(签名);
返回publicKey.VerifyData(
数据:dataByteArray,
签名:signatureByteArray,
HashAlgorithmName.SHA256,
填充:rsasignatureadding.Pkcs1);
}
}
捕获(系统异常)
{
返回false;
}
}
}
预期结果:
valid
应为
true
,因为我正在检查原始数据。
事实:即使传递原始数据,
Verify
方法也始终返回
false


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

我不能告诉你你的代码出了什么问题,因为我无法重现它。这是一个非常详细的答案,说明如何使用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)
        }
    }
}

您是否阅读了异常文本?您看到了哪些错误?大家好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是指定的部分。您可能还想了解一下。@Patrickhoffman也不例外。
false
结果由公钥返回。VerifyData()@Yue您能删除try/catch以100%确定吗?@John感谢您的建议。我删除了try/catch并得到了相同的结果,总是
false
。签名和检查签名都需要私钥吗?@Noman_1否。签名时只需要te私钥。验证签名是用公钥完成的。@那么为什么要用私钥验证签名呢?我不是用私钥来验证的。这是一个复制粘贴错误,我没有意识到。很抱歉造成混淆,我编辑了我的答案以更正它。