Я потратил 100 часов на изучение этой темы, а другой старший программист, который закодировал исходный проект, также не смог заставить его работать. У меня есть xml с параметром SignatureValue, Certificate (X509Certificate2) и Digest Value. Созданное и заданное значение Подписи, указанное в том же xml, было сделано путем преобразования согласованных полей (равных значениям дайджеста) в хеш (SHA1), а затем зашифрованных через закрытый ключ. Частный ключ извлекается из сертификата для обеспечения конфиденциальности, и у меня есть только открытый ключ. Теперь, независимо от того, как я код вокруг него, я всегда получаю ложное значение обратно (как в VerifyHash/verifyHashResult является ложным). Вот код, который я использую:Не удается проверить значение подписи с помощью открытого ключа сертификата, предоставленного в xml (X509Certificate2)
// Вам нужна ваша помощь.
static void VerifyHash(string sigVal , string digestVal, System.Security.Cryptography.X509Certificates.X509Certificate2 cert)
{
sigValInBytes = Convert.FromBase64String(sigVal);
try
{
using (RSACryptoServiceProvider rsaProviderDecrypt = (RSACryptoServiceProvider)cert.PublicKey.Key)
{
// Line below always return value of FALSE no matter how I code it. Here I want to verify the hashed freshly calculated digest value that is now hashed with the signature value
rsaProviderDecrypt.Decrypt(sigValInBytes, false);
rsaProviderDecrypt.Dispose();
}
}
}
// At the main program I get the certificate from the xml given and call the method above:
main
{
// Code below gets the certificate details from a given xml, details of each variable confirmed to be accurate.
char[] Base64_x509ByteArray;
Base64_x509ByteArray = t.DigitalSignatures.First().X509Data.ToCharArray();
byte[] x509ByteArray;
x509ByteArray = Convert.FromBase64CharArray(Base64_x509ByteArray, 0, Base64_x509ByteArray.Length);
// Here am creating the certificate from the gathered data/certificate:
System.Security.Cryptography.X509Certificates.X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(x509ByteArray);
VerifyHash(t.DigitalSignatures.FirstOrDefault().SignatureValue.Trim(), concatenatedFieldValues, cert);
}
Что это за класс 'ByteConverter'? Почему подпись и дайджест строки? –
Любая причина, по которой вы хотите использовать 'X509Certificate2'? Могли бы дать вам другое предложение? – CularBytes
На вопрос №1 я пошел дальше и внес некоторые изменения и удалил преобразование байтов, потому что мне не нужен новый код, опубликованный только сейчас. Я думаю, что я на шаг ближе и делаю правильную вещь при использовании rsaProviderDecrypt.Decrypt (sigValInBytes, false), особенно после преобразования массива sigVal в байты с использованием FromBase64String, потому что это сделало массив байтов не более 256. Но получить новую ошибку «Ключ не существует» – user2771273