Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Последовательность предназначена для последующего импорта ключа шифрования данных у получателя. Данные которые выдает ExportKey содержат три компонента. 1) Параметры шифрования ключа обмена. (Результат выполнения CryptGetKeyParam(KP_CIPHEROID) 2) PUBLICKEYBLOBEX структура от эфемерного ключа которые использовался для выработки ключа согласования. 2) SIMPLEBLOB ключа шифрования на ключе обмена. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 04.09.2013(UTC) Сообщений: 3 Откуда: Москва
|
Анатолий, благодарю Вас за ответ на вопрос о структуре данных ExportKey. Вы не могли бы также ответить на вопрос о причине ошибки в приведенном выше коде дешифрации с использованием CryptoPro.Sharpei? Может быть, ошибка вызвана тем, что в коде на C# никак не используются компоненты №1 и №2 данных ExportKey?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 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)
| Причина: Не указана |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 04.09.2013(UTC) Сообщений: 3 Откуда: Москва
|
Анатолий, мы разрабатываем приложение: клиент на JavaScript, сервер на .NET Framework с использованием CryptoPro.NET. Мы экспортируем сессионный ключ методом ExportKey(x509Certificate) объекта CAdESCOM.SymmetricAlgorithm в JavaScript. Возможно ли восстановить этот сессионный ключ в коде стандартными средствами .NET или средствами CryptoPro.NET? Если да, то можете ли Вы описать свой пример с использованием классов .NET или дать ссылку на такой пример?
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
На "чистом" .NET это будет нетривиальной задачей. Для упрощения можете воспользоваться тем же классом CAdESCOM.SymmetricAlgorithm в виде компонента COM (из cadescom.dll). P.S. А вам не подойдут возможности класса CAdESCOM.EnvelopedData? С ним всё гораздо проще. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close