Ключевой транспорт, KeyWrap
Symmetric KeyWrap
var keyWrapMethod = GostKeyWrapMethod.CryptoPro12KeyWrap;
using (Gost28147 gost = new Gost28147CryptoServiceProvider())
{
using (Gost28147 keyToWrap = new Gost28147CryptoServiceProvider())
{
var wrappedKey = gost.Wrap(keyToWrap, keyWrapMethod);
var unwrappedKey = gost.Unwrap(wrappedKey, keyWrapMethod) as Gost28147;
var iv = keyToWrap.IV;
}
}
Asymmetric agree (DH)
var gost = (Gost3410_2012_512CryptoServiceProvider)cert.PrivateKey;
var gostRes = (Gost3410_2012_512CryptoServiceProvider)cert.PrivateKey;
var gostPk = (Gost3410_2012_512CryptoServiceProvider)cert.PublicKey.Key;
var gostResPk = (Gost3410_2012_512CryptoServiceProvider)cert.PublicKey.Key;
var symmetric = new Gost28147CryptoServiceProvider();
// set params, if needed
gostPk.CipherOid = "1.2.643.7.1.2.5.1.1";
gostResPk.CipherOid = "1.2.643.7.1.2.5.1.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);
Asymmetric KeyExchange (key encryption)
Отправитель:
// Создаем случайный секретный ключ, который необходимо передать.
Gost28147 key = new Gost28147CryptoServiceProvider();
// Синхропосылка не входит в GostKeyTransport и должна
// передаваться отдельно.
IV = key.IV;
// Создаем форматтер, шифрующий на асимметричном ключе получателя.
GostKeyExchangeFormatter Formatter = new GostKeyExchangeFormatter(cert.PublicKey.Key as Gost3410_2012_512);
// GostKeyTransport - формат зашифрованной для безопасной передачи
// ключевой информации.
GostKeyTransport encKey = Formatter.CreateKeyExchange(key);
Получатель:
// Деформаттер для ключей, зашифрованных на асимметричном ключе получателя.
GostKeyExchangeDeformatter Deformatter = new GostKeyExchangeDeformatter(cert.PrivateKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
GostKeyTransport transport = new GostKeyTransport();
transport.Decode(encKey);
Gost28147 decryptedKey = (Gost28147)Deformatter.DecryptKeyExchange(transport);
// Устанавливаем синхропосылку.
decryptedKey.IV = IV;
Примечание
см доп примеры в https://github.com/CryptoPro/corefx/issues/43