【发布时间】:2017-04-25 14:50:22
【问题描述】:
我正在尝试实现 SHA256-RSA 数字签名,但我对 C# 中的术语和实现感到困惑。
AFAIK,“签署文件”是生成文件的哈希,然后加密该哈希。我也听说过“签署哈希”这个短语。这是同一件事吗?或者这是散列一个散列然后加密散列'?
这是有问题的代码:
public void SignatureTest(byte[] data, X509Certificate2 cert)
{
var sha256 = new SHA256CryptoServiceProvider();
var rsa = (RSACryptoServiceProvider)cert.PrivateKey;
var hashOfData = sha256.ComputeHash(data);
var encryptedHash = rsa.Encrypt(hashOfData, false);
var encryptedHashOAEP = rsa.Encrypt(hashOfData, true);
var signedHash = rsa.SignHash(hashOfData, "SHA256");
//Shouldn't one of these be true?
var false1 = CompareAsBase64Str(encryptedHash, signedHash);
var false2 = CompareAsBase64Str(encryptedHashOAEP, signedHash);
//This is the one that actually matches
var true1 = CompareAsBase64Str(signedHash, rsa.SignData(data, sha256));
}
public bool CompareAsBase64Str(byte[] b1, byte[] b2)
{
return (Convert.ToBase64String(b1) == Convert.ToBase64String(b2));
}
这是 MSDN 在 RSACryptoServiceProvider 上所说的:
SignHash() 计算指定哈希值的签名通过使用私钥加密。
Encrypt() 使用 RSA 算法加密数据。
SignHash(hash) 和 Encrypt(hash) 应该一样吗?
【问题讨论】:
标签: c# encryption cryptography certificate