/// <summary> /// Дешифровка марканта с помошью KeyExchangeFormatter /// </summary> /// <param name="markant">Маркант для дешифровки</param> /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом получателя</param> /// <returns>Дешифрованный сессионный ключ</returns> public static Gost28147 DecryptMarkantWithKeyExchangeFormatter(Markant markant, ProviderInitData providerInitData) { //Готовим параметры контейнера CspParameters decrypt_cspParameters = new CspParameters { ProviderType = (int)providerInitData.ProviderType, Flags = CspProviderFlags.NoPrompt, KeyPassword = providerInitData.ProviderPassword, KeyContainerName = providerInitData.ProviderContainerName }; //Открываем контейнер Gost3410_2012_256CryptoServiceProvider decrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(decrypt_cspParameters); // Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя. Gost2012_256KeyExchangeDeformatter decrypt_gostKeyExchangeDeformatter = new Gost2012_256KeyExchangeDeformatter(decrypt_gost3410); // Получаем ГОСТ-овый ключ из GostKeyTransport. GostKeyTransport gostKeyTransport = new GostKeyTransport(); gostKeyTransport.Decode(markant.SessionKey); Gost28147 decrypt_gost28147 = (Gost28147)decrypt_gostKeyExchangeDeformatter.DecryptKeyExchange(gostKeyTransport); if (decrypt_gost28147 == null) { throw new Exception("Invalid decrypted session key"); } // Устанавливаем синхропосылку. decrypt_gost28147.IV = markant.IV; return(decrypt_gost28147); }
public void SetSymmetrKey(byte[] data) { Gost2012_256KeyExchangeDeformatter deformatter = new Gost2012_256KeyExchangeDeformatter(currentCertificate.PrivateKey); GostKeyTransport encKey = new GostKeyTransport(); encKey.Decode(data); symKey = deformatter.DecryptKeyExchange(encKey) as Gost28147; }
/// <summary> /// Восстановления по данным обмена симметричного ключа /// на основе <a href="http://www.ietf.org/rfc/rfc4490">ГОСТ Р 34.10 /// транспорта</a>. /// </summary> /// /// <param name="data"> Зашифрованные данные обмена /// ключами.</param> /// /// <returns>Симметричный ключ.</returns> /// /// <argnull name="data" /> public SymmetricAlgorithm DecryptKeyExchangeData(byte[] data) { if (data == null) { throw new ArgumentNullException("data"); } GostKeyTransport transport = new GostKeyTransport(); transport.Decode(data); return(DecryptKeyExchange(transport)); }