Подпись DSA С#

СертификатУ меня есть сертификат

Это текст, который я должен проверить:

B5080F731EE89EC82FD2E8B22E9_I_CANNOT_SHOW_THE_REAL_TEXT

Это подписанное:

MIIBUwYJKoZIhvcNAQcCoIIBRDCCAUACAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGCAR8wggEbAgEBMG8wZDELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1NBUCBUcnVzdCBDb21tdW5pdHkxEzARBgNVBAsTClNBUCBXZWIgQVMxFDASBgNVBAsTC0kwMDIwMjEyMzYwMQwwCgYDVQQDEwNFMTUCByASBQYIEQgwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE4MDYyNzE5MzcyNVowIwYJKoZIhvcNAQkEMRYEFDgpp0877pKaChyIGVw5sPeD0W03MAkGByqGSM44BAMEMDAuAhUA4PH8bdBPHHtuPHvhJxjei%2BFrJYUCFQCnZ6IABDiRlctS9E9N3IQK60JLIg%3D%3D

Не могу найти способ проверить подпись с помощью С#. Когда я использую «обычный» DSACryptoServiceProvider, я всегда получаю сообщение об ошибке, говорящее, что размер подписи должен быть 40 байт.

Мне просто нужно знать, куда идти. Что использовать, я знаю, это DSA. Я знаю, что подпись составляет около 500 байт.

это код, который я пытаюсь:

DSACryptoServiceProvider csp = (DSACryptoServiceProvider)CurrentCer.csp.PublicKey.Key;

SHA1Managed sha1 = new SHA1Managed();
byte[] data = Encoding.UTF8.GetBytes(ToSign);
byte[] hash = sha1.ComputeHash(data);

var base64EncodedBytes = System.Convert.FromBase64String(signature);
result = csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), base64EncodedBytes);

DSASignatureDeformatter verifier = new DSASignatureDeformatter(csp);
verifier.SetHashAlgorithm("SHA1");
bool valid = verifier.VerifySignature(hash, base64EncodedBytes);

person Henrique    schedule 28.06.2018    source источник
comment
Я несколько раз перечитал ваш пост и не понял, о чем вы спрашиваете. У вас есть сертификат. Хорошо. Вы не можете найти способ сделать это. Что это это?   -  person    schedule 28.06.2018
comment
Почему в одном предложении вы говорите, что подпись должна быть только 40 байт, а в другом месте вы говорите, что знаете, что подпись имеет размер 500 байт?   -  person    schedule 28.06.2018
comment
Привет, Эми. это проверка подписи. У меня есть открытый ключ в сертификате, подпись для проверки и текст для проверки.   -  person Henrique    schedule 28.06.2018
comment
Когда я использую обычный DSACryptoServiceProvider, я всегда получаю сообщение об ошибке, говорящее о том, что размер подписи должен быть 40 байт. Я получаю подпись размером 500 байт   -  person Henrique    schedule 28.06.2018


Ответы (1)


Ваши данные сами по себе не являются подписью. Это представление подписанных данных CMS в кодировке строки запроса в кодировке base64 с отсоединенным содержимым, и оно было подписано с помощью DSA.

str = Uri.UnescapeDataString(str);
byte[] signatureMessage = Convert.FromBase64String(str);
ContentInfo content = new ContentInfo(yourDataHere);
SignedCms signedCms = new SignedCms(content, detached: true);
signedCms.Decode(signatureMessage);

SignerInfoCollection signers = signedCms.SignerInfos;

if (signers.Count != 1 || signers[0].Certificate != null)
{
    // Reject it, this isn't what you're looking for.
    // At least, based on the sample you gave.
    //
    // You could, for Count == 1, accept Certificate == null or
    // Certificate.RawData.SequenceEqual(CurrentCer.RawData),
    // if you're so inclined.
}

// This throws if the signature doesn't check out.
signedCms.CheckSignature(new X509Certificate2Collection(CurrentCer), verifySignatureOnly: true);
person bartonjs    schedule 28.06.2018
comment
Привет, bartonjs, я получаю исключение «Неверное хеш-значение». Означает ли это, что подпись не была проверена? - person Henrique; 29.06.2018
comment
@ Энрике правильно. Комбинация входных байтов, входного (или сохраненного) сертификата и существующей подписи не сочетаются друг с другом. Если ваш ввод был текстом, убедитесь, что это не интерпретация beeline для Unix и Windows. - person bartonjs; 29.06.2018