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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline kurilovda  
#1 Оставлено : 6 октября 2015 г. 18:06:50(UTC)
kurilovda

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

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

Здравствуйте.
Мы пытаемся совместно использовать Крипто-Про ЭЦП Browser Plug-in версии 2.5 на клиентской стороне и CryptoPro.Sharpei.Base.dll версии 1.4.0.10 на серверной стороне для шифрования по алгоритму ГОСТ 28147-89.

На клиентской стороне в коде на JavaScript выполняем функцию
Код:

function init()
{
var result={ iv:null, key: null };
var oSymAlg = Crypto.createObject("CAdESCOM.SymmetricAlgorithm");
oSymAlg.GenerateKey();
result.iv=oSymAlg.IV;
// Используем открытый ключ получателя.
result.key= oSymAlg.ExportKey(x509Certificate);
return result;
}


Полученный симметричный ключ в шифрованном виде и вектор инициализации передаем на сервер и пытаемся выполнить дешифрацию в коде на C# с использованием CryptoPro.Sharpei:
Код:

private static void TryToDecrypt(string keyStr, string ivStr)
{
byte[] iv = StringToByteArray(ivStr);

// извлекаем ключевой блоб из симметричного ключа в шифрованном виде 
string[] subs = keyStr.Split(':');

byte[] blob = StringToByteArray(subs[2]);
GostWrappedKey gwk = new GostWrappedKey();
gwk.SetByCryptoServiceProviderBlob(blob);
byte[] wk = gwk.GetXmlWrappedKey();

// Открытый ключ получателя, использовавшийся в коде на клиентской стороне.
 Gost3410 alg = initParams.SenderCertificate.RetrieveCertificate().PublicKey.Key;

// Закрытый ключ получателя.
Gost3410CryptoServiceProvider receiverKeyProvider = ReceiverCertificate.PrivateKey;

// Создаем agree ключ
Gost3410Parameters agree = receiverKeyProvider.CreateAgree(alg.ExportParameters(false));

// Распаковываем симметричный ключ.
 Gost28147CryptoServiceProvider gost = agree.Unwrap(initParams.WrappedKey, GostKeyWrapMethod.CryptoProKeyWrap);
}


При выполнении последней строки кода получаем ошибку CryptographicException(-2146893819) «Плохие данные».

StackTrace:
Код:

в CryptoPro.Sharpei.COMCryptography.ImportCspBlob(Byte[] keyBlob, SafeProvHandleCP hProv, CspProviderFlags flags, SafeKeyHandleCP hImportKey, SafeKeyHandleCP& hKey) 
в CryptoPro.Sharpei.COMCryptography.ImportSessionWrappedKey(SafeProvHandleCP hCSP, CspProviderFlags flags, GostWrappedKeyObject cspObject, SafeKeyHandleCP hImportKey, SafeKeyHandleCP& hKey) 
в CryptoPro.Sharpei.GostSharedSecretCryptoServiceProvider.CryptoProUnwrap(Byte[] wrapped) 
в CryptoPro.Sharpei.GostSharedSecretCryptoServiceProvider.Unwrap(Byte[] wrapped, GostKeyWrapMethod method)

Помогите, пожалуйста, разобраться с возникающей ошибкой.

Хочу дать несколько пояснений к своему вопросу:

Передача данных производится в рамках веб-приложения на ASP .Net.
Данные шифруются по алгоритму ГОСТ 28147-89 в коде JavaScript на стороне клиентской части приложения с использованием Крипто-Про ЭЦП Browser Plug-in версии 2.5.
Дешифрация данных производится на серверной стороне в коде C# с использованием CryptoPro.Sharpei.
И на стороне клиента и на стороне сервера используется один и тот же сертификат – сертификат сервера.
На стороне клиента этот сертификат используется как сертификат получателя в методе экспорта сессионного ключа.
На стороне сервера этот сертификат используется и как сертификат отправителя и как сертификат получателя при создании agree ключа и последующей распаковке симметричного ключа в ходе импорта сессионного ключа.

К сожалению, мы не смогли найти описание структуры строки, возвращаемой методом ISymmetricAlgorithm.ExportKey(x509Certificate).
Она содержит 3 последовательности строковых представлений байт, разделенных символом ':'.

Вы не могли бы дать описание этой структуры?
Для чего предназначена каждая последовательность?

Отредактировано пользователем 7 октября 2015 г. 11:24:48(UTC)  | Причина: Не указана

Offline cross  
#2 Оставлено : 20 октября 2015 г. 13:20:45(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Последовательность предназначена для последующего импорта ключа шифрования данных у получателя. Данные которые выдает ExportKey содержат три компонента.
1) Параметры шифрования ключа обмена. (Результат выполнения CryptGetKeyParam(KP_CIPHEROID)
2) PUBLICKEYBLOBEX структура от эфемерного ключа которые использовался для выработки ключа согласования.
2) SIMPLEBLOB ключа шифрования на ключе обмена.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline kurilovda  
#3 Оставлено : 27 октября 2015 г. 15:30:46(UTC)
kurilovda

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

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

Анатолий, благодарю Вас за ответ на вопрос о структуре данных ExportKey.
Вы не могли бы также ответить на вопрос о причине ошибки в приведенном выше коде дешифрации с использованием CryptoPro.Sharpei?
Может быть, ошибка вызвана тем, что в коде на C# никак не используются компоненты №1 и №2 данных ExportKey?
Offline cross  
#4 Оставлено : 30 октября 2015 г. 14:58:27(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Без параметров шифрования будет работать. А вот выработать правильный сессионный ключ без второго параметра невозможно.
На CryptoApi выработка выглядит примерно так.
Код:
//импортируем открытый ключ (пареметр №2) на ключ получателя 
CryptImportKey(hProv, sRecPubKeyBlob.pbData(),
                            sRecPubKeyBlob.cbData(), hPrivKey, 0,
                            &hExchangeKey)) 
//Устанавливаем алгоритм шифрования ключа обмена и параметры шифрования

cExchangeKey.SetParam(KP_ALGID, (BYTE *)&alg_id);

cExchangeKey.SetParam(KP_CIPHEROID, sEncParamSet.pbData());

//получаем сессионный ключ импортом шифрованного ключа на ключе обмена
CryptImportKey(m_hProv.GetHandle(), sBlob.pbData(), sBlob.cbData(),
                            hExchangeKey, 0, &hKey))
//Ставим режим шифрования
       DWORD mode = CRYPT_MODE_CNT;
       CryptSetParam(KP_MODE, (BYTE *)&mode, 0));

Отредактировано модератором 3 ноября 2015 г. 11:13:24(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline kurilovda  
#5 Оставлено : 30 октября 2015 г. 20:56:09(UTC)
kurilovda

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

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

Анатолий, мы разрабатываем приложение: клиент на JavaScript, сервер на .NET Framework с использованием CryptoPro.NET.
Мы экспортируем сессионный ключ методом ExportKey(x509Certificate) объекта CAdESCOM.SymmetricAlgorithm в JavaScript.
Возможно ли восстановить этот сессионный ключ в коде стандартными средствами .NET или средствами CryptoPro.NET?
Если да, то можете ли Вы описать свой пример с использованием классов .NET или дать ссылку на такой пример?
Offline Павел Смирнов  
#6 Оставлено : 3 ноября 2015 г. 11:40:30(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
На "чистом" .NET это будет нетривиальной задачей. Для упрощения можете воспользоваться тем же классом CAdESCOM.SymmetricAlgorithm в виде компонента COM (из cadescom.dll).

P.S. А вам не подойдут возможности класса CAdESCOM.EnvelopedData? С ним всё гораздо проще.
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.