Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline myusername  
#1 Оставлено : 2 декабря 2014 г. 15:05:16(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Здравствуйте.

Пытаюсь расшифровать XML с помощью класса System.Security.Cryptography.Xml.EncryptedXml. При выполнении метода DecryptDocument() возникает исключение "The parameter is incorrect". Ситуация воспроизводится даже в тестовом примере, код которого приведен ниже:

Код:

using System;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;

namespace EncryptedXmlTest
{
	class Program
	{
		static void Main()
		{
			var document = new XmlDocument();
			document.LoadXml("<data>Some data.</data>");

			X509Certificate2 certificate; // Получение сертификата, например, из хранилища машины

			Encrypt(document, certificate);
			Console.WriteLine("Encrypted XML:");
			Console.WriteLine(document.OuterXml);

			Decrypt(document);
			Console.WriteLine("Decrypted XML:");
			Console.WriteLine(document.OuterXml);

			Console.ReadLine();
		}

		private static void Encrypt(XmlDocument document, X509Certificate2 certificate)
		{
			var encryptedXml = new EncryptedXml();
			var encryptedElement = encryptedXml.Encrypt(document.DocumentElement, certificate);
			EncryptedXml.ReplaceElement(document.DocumentElement, encryptedElement, false);
		}

		private static void Decrypt(XmlDocument document)
		{
			var encryptedXml = new EncryptedXml(document);
			encryptedXml.DecryptDocument(); // System.Security.Cryptography.CryptographicException, CryptoPro.Sharpei.Base.dll, Additional information: The parameter is incorrect.
		}
	}
}


Пример зашифрованного сообщения:
Код:

<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gost28147" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"><EncryptionMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001" /><KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><X509Data><X509Certificate>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</X509Certificate></X509Data></KeyInfo><CipherData><CipherValue>MIGkMCgEIHF9Nam4Mqp0gJpKJZl0W91cAIst8oxEUUYB9l2HIlUQBATmyxYaoHgGByqFAwICHwGgYzAcBgYqhQMCAhMwEgYHKoUDAgIkAAYHKoUDAgIeAQNDAARAm1Z7IU6Iv21qvvsExhkuJ8XqU+iXfckcopdFWWOt6SfepdXhwEMroGNvvgkX6DEn/ulf4rhQTid7EQxNPFNefAQIqCcPiv1eaZQ=</CipherValue></CipherData></EncryptedKey></KeyInfo><CipherData><CipherValue>eXrnQpz06NhNTRNNJ7x3t8OSXdn0xjdH19qzcP6oOQw=</CipherValue></CipherData></EncryptedData>


Стек исключения:
Код:

   at CryptoPro.Sharpei.COMCryptography.SetKeyParamDw(SafeKeyHandleCP hKey, Int32 param, Int32 dwValue)
   at CryptoPro.Sharpei.CPCryptoAPITransform..ctor(Int32 cArgs, Int32[] rgArgIds, Object[] rgArgValues, SafeKeyHandleCP hKey, PaddingMode padding, CipherMode cipherChainingMode, Int32 blockSize, CPCryptoAPITransformMode encDecMode)
   at CryptoPro.Sharpei.Gost28147CryptoServiceProvider._NewEncryptor(SafeKeyHandleCP hKey, CipherMode mode, Byte[] rgbIV, Int32 feedbackSize, CPCryptoAPITransformMode encryptMode)
   at CryptoPro.Sharpei.Gost28147CryptoServiceProvider.CreateDecryptor()
   at System.Security.Cryptography.Xml.EncryptedXml.DecryptData(EncryptedData encryptedData, SymmetricAlgorithm symmetricAlgorithm)
   at System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument()
   at EncryptedXmlTest.Program.Decrypt(XmlDocument document)
   at EncryptedXmlTest.Program.Main()
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()


Самое интересное. Если использовать RSA-сертификат (не ГОСТ 3410), все работает отлично.

Заранее спасибо за ответы!
Offline Максим Коллегин  
#2 Оставлено : 2 декабря 2014 г. 15:53:30(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,065
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 606 раз в 541 постах
Какие версии ОС, framework, NET, CSP?
Знания в базе знаний, поддержка в техподдержке
Offline myusername  
#3 Оставлено : 2 декабря 2014 г. 19:54:03(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: maxdm Перейти к цитате
Какие версии ОС, framework, NET, CSP?


Windows 7 Ultimate x64
.NET Framework 4.5
CryptoPro.Sharpei.Base, Version=1.4.0.10
CryptoPro CSP, Core version: 3.9.8000 KC1
CryptoPro CSP, Product version: 3.9.8171
После установки CryptoPro CSP ничего специально не настраивал (то есть все параметры по умолчанию).
Вложение(я):
osinfo.xml (71kb) загружен 4 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline myusername  
#4 Оставлено : 3 декабря 2014 г. 10:52:10(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Есть ли иные способы расшифровать EncryptedData? Без использования EncryptedXml?

Например, вручную разобрать этот XML и, используя классы CryptoPro, получить данные.

Меня бы вполне устроил и такой вариант, но я не могу найти в Gost3410CryptoServiceProvider методы типа Decrypt(). Я имею ввиду что-то вроде RSACryptoServiceProvider.Decrypt().
Offline Максим Коллегин  
#5 Оставлено : 3 декабря 2014 г. 11:36:37(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,065
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 606 раз в 541 постах
Сегодня разберемся с ошибкой.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
myusername оставлено 03.12.2014(UTC)
Offline Максим Коллегин  
#6 Оставлено : 3 декабря 2014 г. 12:27:56(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,065
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 606 раз в 541 постах
А что это за тестовый пример? Пример из КриптоПро .NET SDK: EncryptCertificate рабочий.
А шифровать российскими открытыми ключами нельзя, нужно создавать промежуточный ключ обмена.
Знания в базе знаний, поддержка в техподдержке
Offline myusername  
#7 Оставлено : 4 декабря 2014 г. 9:07:00(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: maxdm Перейти к цитате
А что это за тестовый пример? Пример из КриптоПро .NET SDK: EncryptCertificate рабочий.
А шифровать российскими открытыми ключами нельзя, нужно создавать промежуточный ключ обмена.


Этот пример с небольшими упрощениями я взял изначально из статьи к EncryptedXml на MSDN.
Про шифрование и ключ обмена - понял, спасибо за наводку, в соответствии с этим подобрал подходящий пример из SDK.

Мой случай отлично описывает пример "EncryptCerts", но он точно с таким же исключением вываливается на строчке расшифровки данных:
Код:

// И на нем расшифровываем данные.
byte[] decryptedData = exml.DecryptData(encryptedData, decryptionKey);


То есть, ключ для расшифровки сообщения найден и благополучно создан (во всяком случае экземпляр класса), но расшифровку произвести не удалось.
Уже не знаю на что думать...

Из дополнительных сведений:

  • Сообщение, которое пытаюсь расшифровать (см. прикрепленный файл).
  • Сертификат был выдан через ViPNet (то есть на моей машине установлен ViPNet CSP 4.1).


Я мог бы подумать на сертификат, но подпись и проверка подписи с использованием этого сертификата проходит успешно...

P.s. Могу предоставить сертификат с закрытым ключем, если это поможет делу.
Вложение(я):
n_encrypted.xml (12kb) загружен 5 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Максим Коллегин  
#8 Оставлено : 4 декабря 2014 г. 9:48:37(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,065
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 606 раз в 541 постах
С этого нужнл было начинать, контейнеры випнет не поддерживаются, Криптопровайдеры не совместимы по низкоуровневым интерфейсам.
Знания в базе знаний, поддержка в техподдержке
Offline myusername  
#9 Оставлено : 4 декабря 2014 г. 10:23:19(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: maxdm Перейти к цитате
С этого нужнл было начинать, контейнеры випнет не поддерживаются, Криптопровайдеры не совместимы по низкоуровневым интерфейсам.


Ясно, спасибо!

Еще небольшое уточнение (чтобы я окончательно все понял)...

Правильно я понимаю, что в связке "CryptoPro .NET - Сертификат VipNet" я могу осуществлять подпись данных по ГОСТ-3410 (на практике у меня это получилось сделать), но не могу сделать дешифрацию данных по ГОСТ-28147? И в том и вдругом случае я использую приватный ключ, только в первом случае у меня получается это использовать, а во втором нет. И все из-за того, что на низком уровне, при реализации ГОСТ-3410 получение приватного ключа происходит не так, как при реализации ГОСТ-28147. Все верно?

Таким образом, если все верно, единственный выход - это использовать сертификат, выданный через CryptoPro, либо напрямую обращаться к VipNet API?
Offline Максим Коллегин  
#10 Оставлено : 4 декабря 2014 г. 11:49:33(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,065
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 17 раз
Поблагодарили: 606 раз в 541 постах
Примерно так, операции подписи реализованы похожим образом, импорта зашифрованного ключа нет.
Так же можно попросить Инфотекс поддержать КриптоПро .NET, но вряд ли им это будет интересно.
Знания в базе знаний, поддержка в техподдержке
thanks 1 пользователь поблагодарил Максим Коллегин за этот пост.
myusername оставлено 04.12.2014(UTC)
Offline myusername  
#11 Оставлено : 19 декабря 2014 г. 12:32:00(UTC)
myusername

Статус: Новичок

Группы: Участники
Зарегистрирован: 02.12.2014(UTC)
Сообщений: 8
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Для логического завершения темы немного расскажу, как решил проблему в итоге.

Поменять сертификат VipNet на сертификат CryptoPro так и не получилось, поскольку для нас, как для исполнителей, это данность, с которой нужно как-то уживаться. В итоге пришлось долго и упорно разбираться с проблемой. (Причем одному, потому что все ветки на форуме Infotecs больше напоминают монолог: сам задал вопрос и, в лучшем случае, сам же на него ответил. В связи с этим команде КриптоПро отдельная благодарность!) Мои изыскания привели меня к тому, что я стал изучать исходный код КриптоПро .NET (через .NET Reflector, да простят меня разработчики). В итоге я попытался сделать все то же самое, что делает КриптоПро .NET, заменив лишь идентификатор криптопровайдера: с 75 (CryptoPro CSP) на 2 (VipNet CSP). После этого, я выполнил свой тест (который отлично работает с сертификатор CryptoPro и КриптоПро .NET). И он, конечно, не заработал. :) Однако не заработал по вполне конкретным причинам, которые удалось установить.

Первая ошибка, которая у меня произошла, была при обращении к VipNet CSP, при попытке установки KP_PADDING. Я, конечно, попытался выяснить, почему это происходит, но Infotecs мне так и не дал ответа. В итоге, я перебрал все возможные значения KP_PADDING и пришел к выводу, что VipNet CSP не поддерживает его программную установку. Это, конечно, мои субъективные выводы, касающиеся исключительно VipNet CSP 3.2 и 4.x и только моего операционного окружения. В итоге я просто закомментировал установку KP_PADDING. (В КриптоПро .NET установка KP_PADDING делается в приватном конструкторе класса CPCryptoAPITransform.) Исправление этой проблемы привело меня к следующей и, как выяснилось, последней.

Вторая ошибка произошла на этапе дешифрации, а именно, при дешифрации последнего блока зашифрованного сообщения. При вызове функции CryptDecrypt() с параметром Final=true она вернула false, соответственно было вызвано исключение. (В КриптоПро .NET вызов CryptDecrypt() осуществляется в методе COMCryptography.EndCrypt()). В итоге я проигнорировал результат последнего вызова функции CryptDecrypt() и проанализировал результат дешифрации. И пришел к выводу, что сообщение было полностью дешифровано и никакой ошибки на самом деле не произошло.

Таким образом, я пришел к собственным субъективным выводам. Во-первых, VipNet CSP не поддерживает установку KP_PADDING. Во-вторых, при вызове функции CryptDecrypt() с параметром Final=true при корректных данных она возвращает некорректный результат. Первую проблему я решил, проигнорировав результат установки KP_PADDING, вторую - проигнорировав результат дешифрации последнего блока сообщения. Решение, конечно, не из лучших, но в силу имеющейся данности (VipNet), с которой я вынужден уживаться, оно мне подошло.

Возможно, мои изыскания кому-нибудь помогут. :)

Отредактировано пользователем 19 декабря 2014 г. 12:35:43(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил myusername за этот пост.
Андрей * оставлено 31.12.2017(UTC)
Offline mtv06  
#12 Оставлено : 3 апреля 2018 г. 11:49:44(UTC)
mtv06

Статус: Активный участник

Группы: Участники
Зарегистрирован: 06.12.2017(UTC)
Сообщений: 43
Российская Федерация
Откуда: Карелия

as.mezhov Спасибо тебе большое!!! Твой способ помог и мне)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.