Работа с контейнерами и провайдерами
Открытие контейнера ключа
using (var provider =
new Gost3410_2012_256CryptoServiceProvider(
new CpCspParameters(
80,
"",
"\\\\.\\HDIMAGE\\G2012256")))
{
}
Создание ключевого контейнера (требует гамму)
using (var provider =
new Gost3410_2012_256CryptoServiceProvider(
new CpCspParameters()
{
Flags = CspProviderFlags.NoPrompt,
KeyContainerName = $"\\\\.\\HDImage\\0000_test_{Guid.NewGuid()}",
ProviderName = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
ProviderType = 80,
KeyPassword = new SecureString(),
KeyNumber = keyNumber
}))
{
}
Выставление OID
https://github.com/CryptoPro/corefx/issues/45
Провайдер для 2817 теперь можно задавать через новый конструктор
public Gost28147CryptoServiceProvider(CpCspParameters parameters)
Выбор CipherOid для Gost28147CryptoServiceProvider
, Gost3410_XXXXCryptoServiceProvider
производится через одноименное свойство.
Список CipherOid - https://cpdn.cryptopro.ru/content/csp40/html/group___pro_c_s_p_ex_CP_PARAM_OIDS.html
Ниже оригинальные комментарии. Логика должна быть аналогичной КриптоПро.NET.
Для установки желаемого OID транспортного ключа необходимо выставить его через свойство CipherOid в объекте открытого ключа
Пример установки OID для транспортного ключа:
var gost = (Gost3410_2012_256CryptoServiceProvider)cert.PrivateKey;
var gostRes = (Gost3410_2012_256CryptoServiceProvider)certRes.PrivateKey;
var gostPk = (Gost3410_2012_256CryptoServiceProvider)cert.PublicKey.Key;
var gostResPk = (Gost3410_2012_256CryptoServiceProvider)certRes.PublicKey.Key;
gostPk.CipherOid = "1.2.643.2.2.31.1";
gostResPk.CipherOid = "1.2.643.2.2.31.1";
var agree = (GostSharedSecretCryptoServiceProvider)gost.CreateAgree(gostResPk.ExportParameters(false));
byte[] wrappedKeyBytesArray = agree.Wrap(symmetric, GostKeyWrapMethod.CryptoProKeyWrap);
var agreeRes = (GostSharedSecretCryptoServiceProvider)gostRes.CreateAgree(gostPk.ExportParameters(false));
var key = agreeRes.Unwrap(wrappedKeyBytesArray, GostKeyWrapMethod.CryptoProKeyWrap);
ps. При использовании метода ExportParameters(false) для закрытого ключа может не заполнится поле EncryptionParamSet возвращаемого объекта Gost3410Parameters и тогда будет использоваться Oid по умолчанию, вне зависимости от проставленного OID в закрытом ключе. Можно исправить руками, выставив в Gost3410Parameters.EncryptionParamSet нужное значение:
var paramsPk = gostRes.ExportParameters(false);
paramsPk.EncryptionParamSet = gostResPk.CipherOid;
var agree = (GostSharedSecretCryptoServiceProvider)gost.CreateAgree(paramsPk);