Я пытаюсь реализовать цифровые подписи 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() Вычисляет подпись для указанного значения хэш с помощью шифрования с закрытым ключом.
Шифрование() Шифрует данные с алгоритмом RSA.
Должен ли сигнал SignHash (hash) и encrypt (hash) быть таким же?
Спасибо! В дополнение к вашей информации об идентификаторе, я нашел ответ [Pavel Ognev] (http://stackoverflow.com/a/12140124/6258530) в связанной вами теме. Надеюсь, я смогу создать правильное заполнение для своих данных, чтобы зашифрованные данные (через 'rsa.Encrypt()') соответствовали сигнатуре (через 'rsa.SignData()') –