Comments (10)
У меня есть несколько предложений:
- версия CSP провайдера (маловероятно)
- различия в работе Crypto API (маловероятно)
- версия .net (возможно)
В коде есть низкоуровневые и крайне некрасивые завязки на особенности внутренней реализации определенных .net классов по работе с криптографией. Это связано с тем, что в .net до сих пор нет механизмов расширения для криптографии, которые бы позволили зарегистрировать свой криптопровайдер и его алгоритмы. Возможно, проблема с этим.
Я постараюсь воспроизвести ситуацию.
from gostcryptography.
После более детального разбирательства в проблеме выяснилось, что она проявляется при установке алгоритма экспорта сессионного ключа в CALG_PRO_EXPORT и использовании VipNet CSP 4.2.10 в Windows 10, Windows Server 2016. Похоже, что у этого CSP есть какие-то проблемы именно с этим алгоритмом. С этим алгоритмом не работает ни один из примеров шифрования напрямую через CryptoApi, которые указаны в их примерах. Всюду происходит одна и та же ошибка функции CryptImportKey
при расшифровке сессионного ключа.
from gostcryptography.
Я правильно понял, что с CryptoPro CSP такой проблемы нет?
from gostcryptography.
Да. С CryptoPro такой проблемы нет. Таким образом, проблема, вероятнее всего, именно в криптопровайдере VipNet последних версий.
from gostcryptography.
Судя по всему, у VipNet проблемы с Windows 10 тянутся довольно давно. Какие-то вопросы, в том числе с CALG_PRO_EXPORT, остаются открытыми до сих пор. Возможно, я ошибаюсь, поскольку давно заметил, что представители VipNet (Infotecs) неохотно отвечают на вопросы, но определенно что-то делают. :) А вы не пробовали пререключать их загадочную настройку "Включить поддержку работы VipNet CSP через MS Crypto API"? Может что-то получится, хотя слабо верится. Честно говоря, я ещё не успел воспроизвести вашу ситуацию локально, срок бесплатной версии VipNet вышел. Постараюсь почистить машину и переустановить криптопровайдер.
from gostcryptography.
Для установки алгоритма экспорта ключа (например, CALG_PRO_EXPORT) КриптоПро и Инфотекс используют разные константы для функции CryptSetKeyParam
. КриптоПро использует KP_ALGID = 7
, а Инфотекс - KP_EXPORTID = 108
.
До определенной версии Инфотекс также поддерживал константу КриптоПро, а затем перестал. В данной библиотеке жестко зашита константа KP_ALGID = 7
, отсюда и все проблемы.
from gostcryptography.
Я добавил быстро-фикс и опубликовал версию 1.1.1-alpha1. Проверьте, пожалуйста, и дайте обратную связь.
from gostcryptography.
Теперь вообще шифрование не работает. Ошибка происходит в конструкторе Gost3410AsymmetricAlgorithm
.
Скорее всего, это вызвано тем, что константа KP_ALGID
используется в разных местах и до этого она некорректно использовалась только при экспорте/импорте сессионного ключа. В других местах она использовалась верно.
Мне кажется, что лучше было бы добавить тип криптопровайдера к классу SafeProvHandleImpl
и при экспорте/импорте ключа анализировать его - для КриптоПро использовать одну константу, а для Инфотекс - другую. Кроме того, на данный момент типов криптопровайдеров для Инфотекс три - 2 (ГОСТ 2001), 77 и 78 (ГОСТ 2012).
from gostcryptography.
Пытался выпольнить тест "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.
Выпустил 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)
- Верефикация нескольких сигнатур в файле
- Расшифровка с помощью сертификата HOT 2
- Подпись сообщений в веб-приложении (IIS) HOT 5
- Утечки памяти в GostCryptography HOT 4
- .netcore HOT 7
- Ошибка подписания при работе с КриптоПРО
- ЭЛН 2.0 HOT 90
- Реализация под Net 5 HOT 7
- VipNet 4.4.2 создает провайдеры с типом 75, 80 и 81 HOT 1
- Поддержка префиксов в xmldsig
- Верификация подписи ГОСТ Р 34.10-2012, 256 бит. HOT 3
- Принудительное шифрование XML по ГОСТ 2001 HOT 3
- Отправка запроса на получение "Уведомление об изменении ЭЛН".
- ComputeSignature Exception HOT 8
- Создание симметричных ключей для тестов HOT 5
- Алгоритм ключа сертификата не поддерживается HOT 1
- Взаимодействие с федеральными сервисами. Формирование jwt токена с использованием GOST3410. HOT 7
- Как расшифровать текст при помощи алгоритма ассиметричного ключа HOT 10
- Поддержка ГОСТ 34.12-2018 HOT 7
- Unknown algorithm '1.2.643.7.1.1.1.1' HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gostcryptography.