【发布时间】:2019-11-01 18:03:22
【问题描述】:
我是新来的。
我正在学习 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,即使原始数据被传递。
你能告诉我我做错了什么吗?
【问题讨论】:
-
您阅读异常文本了吗?
-
您看到了什么错误?您好,欢迎来到 StackOverflow。请花一些时间阅读帮助页面,尤其是名为How to Ask 的部分。您可能还想了解minimal reproducible example。
-
@PatrickHofman 也不例外。
false结果由publicKey.VerifyData()返回。 -
@Yue 你能删除 try/catch 以确保 100% 确定吗?
-
@John 感谢您的建议。我删除了 try/catch 并得到相同的结果,总是
false。