AlexMAS / GostCryptography

.NET driver for ViPNet CSP and CryptoPro CSP
MIT License
132 stars 42 forks source link

Проверка подписи и оригинала файла #19

Closed andreiOzzz closed 5 years ago

andreiOzzz commented 5 years ago

Здравствуйте, в общем пытаюсь пользоваться библиотекой для проверки оригинала файла и подписи. Делаю как то так:

public void CheckSignature() {

        string sgnPath = "D:/test/5d3ef84a-8328-44de-b97a-e5d6ce82e1b9.docx.sgn";
        string docxPath = "D:/test/5d3ef84a-8328-44de-b97a-e5d6ce82e1b9.docx";
        byte[] sgnBuffer = new byte[0];>             
        using (var sgnStream = new FileStream(sgnPath, FileMode.Open))
        {
            sgnBuffer = new byte[(int)sgnStream.Length];
            sgnStream.Read(sgnBuffer, 0, (int)sgnStream.Length);
            GostSignedCms cms = new GostSignedCms();
            cms.Decode(sgnBuffer); 
            var certificate = cms.Certificates[0];
            var publicKey = (GostAsymmetricAlgorithm)certificate.GetPublicKeyAlgorithm();

            using (var docxStream = new FileStream(docxPath, FileMode.Open))
            {
                var res = VerifySignature(publicKey, docxStream, sgnBuffer);
                Console.WriteLine(res);
                Console.Read();
            }
        }
    }
    private static bool VerifySignature(AsymmetricAlgorithm publicKey, Stream dataStream, byte[] signature)
    {
        var signatureDescription = (SignatureDescription)GostCryptoConfig.CreateFromName(publicKey.SignatureAlgorithm);

        byte[] hash;

        using (var hashAlg = signatureDescription.CreateDigest())
        {
            hash = hashAlg.ComputeHash(dataStream);
        }

        var deformatter = signatureDescription.CreateDeformatter(publicKey);
        deformatter.SetHashAlgorithm(signatureDescription.DigestAlgorithm);

        return deformatter.VerifySignature(hash, signature);
    }

По моим доводам вроде как все верно, но deformatter.VerifySignature(hash, signature) дает отрицательный результат. Вот тут https://crypto.kontur.ru/verify проверял файл и подпись все нормально. Подскажите пожалуйста что я делаю не так?

AlexMAS commented 5 years ago

Здравствуйте. Попробуйте воспользоваться этим примером.

bool VerifySignature(GostAsymmetricAlgorithm publicKey, Stream dataStream, byte[] signature)
{
    byte[] hash;

    using (var hashAlg = publicKey.CreateHashAlgorithm())
    {
        hash = hashAlg.ComputeHash(dataStream);
    }

    var deformatter = new GostSignatureDeformatter(publicKey);

    return deformatter.VerifySignature(hash, signature);
}
AlexMAS commented 5 years ago

@andreiOzzz Получилось решить проблему?