Git Product home page Git Product logo

Comments (10)

AlexMAS avatar AlexMAS commented on June 11, 2024

У меня есть несколько предложений:

  • версия CSP провайдера (маловероятно)
  • различия в работе Crypto API (маловероятно)
  • версия .net (возможно)

В коде есть низкоуровневые и крайне некрасивые завязки на особенности внутренней реализации определенных .net классов по работе с криптографией. Это связано с тем, что в .net до сих пор нет механизмов расширения для криптографии, которые бы позволили зарегистрировать свой криптопровайдер и его алгоритмы. Возможно, проблема с этим.

Я постараюсь воспроизвести ситуацию.

from gostcryptography.

busyscout avatar busyscout commented on June 11, 2024

После более детального разбирательства в проблеме выяснилось, что она проявляется при установке алгоритма экспорта сессионного ключа в CALG_PRO_EXPORT и использовании VipNet CSP 4.2.10 в Windows 10, Windows Server 2016. Похоже, что у этого CSP есть какие-то проблемы именно с этим алгоритмом. С этим алгоритмом не работает ни один из примеров шифрования напрямую через CryptoApi, которые указаны в их примерах. Всюду происходит одна и та же ошибка функции CryptImportKey при расшифровке сессионного ключа.

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Я правильно понял, что с CryptoPro CSP такой проблемы нет?

from gostcryptography.

busyscout avatar busyscout commented on June 11, 2024

Да. С CryptoPro такой проблемы нет. Таким образом, проблема, вероятнее всего, именно в криптопровайдере VipNet последних версий.

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Судя по всему, у VipNet проблемы с Windows 10 тянутся довольно давно. Какие-то вопросы, в том числе с CALG_PRO_EXPORT, остаются открытыми до сих пор. Возможно, я ошибаюсь, поскольку давно заметил, что представители VipNet (Infotecs) неохотно отвечают на вопросы, но определенно что-то делают. :) А вы не пробовали пререключать их загадочную настройку "Включить поддержку работы VipNet CSP через MS Crypto API"? Может что-то получится, хотя слабо верится. Честно говоря, я ещё не успел воспроизвести вашу ситуацию локально, срок бесплатной версии VipNet вышел. Постараюсь почистить машину и переустановить криптопровайдер.

from gostcryptography.

busyscout avatar busyscout commented on June 11, 2024

Для установки алгоритма экспорта ключа (например, CALG_PRO_EXPORT) КриптоПро и Инфотекс используют разные константы для функции CryptSetKeyParam. КриптоПро использует KP_ALGID = 7, а Инфотекс - KP_EXPORTID = 108.
До определенной версии Инфотекс также поддерживал константу КриптоПро, а затем перестал. В данной библиотеке жестко зашита константа KP_ALGID = 7, отсюда и все проблемы.

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Я добавил быстро-фикс и опубликовал версию 1.1.1-alpha1. Проверьте, пожалуйста, и дайте обратную связь.

from gostcryptography.

busyscout avatar busyscout commented on June 11, 2024

Теперь вообще шифрование не работает. Ошибка происходит в конструкторе Gost3410AsymmetricAlgorithm.
Скорее всего, это вызвано тем, что константа KP_ALGID используется в разных местах и до этого она некорректно использовалась только при экспорте/импорте сессионного ключа. В других местах она использовалась верно.
Мне кажется, что лучше было бы добавить тип криптопровайдера к классу SafeProvHandleImpl и при экспорте/импорте ключа анализировать его - для КриптоПро использовать одну константу, а для Инфотекс - другую. Кроме того, на данный момент типов криптопровайдеров для Инфотекс три - 2 (ГОСТ 2001), 77 и 78 (ГОСТ 2012).

from gostcryptography.

LeonxPRO avatar LeonxPRO commented on June 11, 2024

Пытался выпольнить тест "EncryptedXmlCertificateTest.cs". Указанная ошибка все еще наблюдается при попытке расшифровки. Так же зашифрованное сообщение не поддается расшифровке у уклиента (ФСС)
После отката на версию VipNetCSP 4.2(2.36190) тесты выполняются корректно. Клиент также начинает дешифровать сообщение.

An exception of type 'System.Security.Cryptography.CryptographicException' occurred in GostCryptography.dll but was not handled in user code
Additional information: Bad Key.
at GostCryptography.Native.CryptoApiHelper.ImportCspBlob(Byte[] importedKeyBytes, SafeProvHandleImpl providerHandle, SafeKeyHandleImpl publicKeyHandle, SafeKeyHandleImpl& keyExchangeHandle) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Native\CryptoApiHelper.cs:line 905
at GostCryptography.Native.CryptoApiHelper.ImportKeyExchange(SafeProvHandleImpl providerHandle, GostKeyExchangeInfo keyExchangeInfo, SafeKeyHandleImpl keyExchangeHandle) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Native\CryptoApiHelper.cs:line 958
at GostCryptography.Cryptography.GostKeyExchangeAlgorithm.DecodeKeyExchangeInternal(Byte[] encodedKeyExchangeData, Int32 keyExchangeExportAlgId) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Cryptography\GostKeyExchangeAlgorithm.cs:line 150
at GostCryptography.Cryptography.GostKeyExchangeAlgorithm.DecodeKeyExchange(Byte[] encodedKeyExchangeData, GostKeyExchangeExportMethod keyExchangeExportMethod) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Cryptography\GostKeyExchangeAlgorithm.cs:line 130
at GostCryptography.Cryptography.GostKeyExchangeDeformatter.DecryptKeyExchangeAlgorithm(GostKeyExchange encryptedKeyExchangeInfo) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Cryptography\GostKeyExchangeDeformatter.cs:line 116
at GostCryptography.Cryptography.GostKeyExchangeDeformatter.DecryptKeyExchangeAlgorithm(Byte[] encryptedKeyExchangeData) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Cryptography\GostKeyExchangeDeformatter.cs:line 98
at GostCryptography.Xml.GostEncryptedXmlImpl.DecryptKeyClass(Byte[] keyData, Gost3410AsymmetricAlgorithmBase privateKey) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Xml\GostEncryptedXmlImpl.cs:line 439
at GostCryptography.Xml.GostEncryptedXmlImpl.DecryptEncryptedKeyClass(EncryptedKey encryptedKey, String symmetricAlgorithmUri) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Xml\GostEncryptedXmlImpl.cs:line 306
at GostCryptography.Xml.GostEncryptedXmlImpl.GetDecryptionKey(EncryptedData encryptedData, String symmetricAlgorithmUri) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Xml\GostEncryptedXmlImpl.cs:line 243
at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument()
at GostCryptography.Xml.GostEncryptedXml.DecryptDocument() in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography\Xml\GostEncryptedXml.cs:line 273
at GostCryptography.Tests.Xml.Encrypt.EncryptedXmlCertificateTest.DecryptXmlDocument(XmlDocument encryptedXmlDocument) in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography.Tests\Xml\Encrypt\EncryptedXmlCertificateTest.cs:line 74
at GostCryptography.Tests.Xml.Encrypt.EncryptedXmlCertificateTest.ShouldEncryptXml() in c:\Users\LeonPRO.KKB1\Downloads\GostCryptography-master\Source\GostCryptography.Tests\Xml\Encrypt\EncryptedXmlCertificateTest.cs:line 31

from gostcryptography.

AlexMAS avatar AlexMAS commented on June 11, 2024

Выпустил v2.0.0, которая включает поддержку алгоритмов 2012 года, а также исправление данной ошибки. Версия была протестирована на конфигурациях:

  • Windows 10 x64, CryptoPro CSP 4.0.9963
  • Windows 10 x64, ViPNet CSP 4.2.8.51670

В случае с CryptoPro CSP важно установить версию не ниже 4.0.9963 (на момент тестирования последний private-релиз), поскольку она содержит исправление критической ошибки при работе с сертификатами ГОСТ Р 34.10-2012/1024.

Также нужно отметить, что ViPNet CSP до последней на данный момент версии 4.2.8.51670 (включительно) не поддерживает создание производных симметричных ключей на основе хэш-функций ГОСТ Р 34.11-2012. Ничего критичного в этом нет, это оказывает влияние только на возможность генереции случайных симметричных ключей с использованием методов Gost_R3411_2012_256_PRF.DeriveKey() и Gost_R3411_2012_512_PRF.DeriveKey().

Наконец, в ходе добавления поддержки алгоритмов 2012 года были произведены крупные изменения, включающие перенос/переименование существующих классов. Для перехода с v1.0 на v2.0 нужно воспользоваться следующей иструкцией.

from gostcryptography.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.