/// <summary> /// Дешифровка марканта с помошью ключа согласования /// </summary> /// <param name="markant">Маркант для дешифровки</param> /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом получателя</param> /// <returns>Дешифрованный сессионный ключ</returns> public static Gost28147 DecryptMarkantWithKeyAgree(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); // Читаем открытый ключ Gost3410Parameters decrypt_gost3410PublicKeyParameters = (Gost3410Parameters)Helper.ByteArrayToObject(markant.PublicKey); // Создаем agree ключ GostSharedSecretAlgorithm agree = decrypt_gost3410.CreateAgree(decrypt_gost3410PublicKeyParameters); // Расшифровываем симметричный ключ на agree Gost28147 decrypt_gost28147 = (Gost28147)agree.Unwrap(markant.SessionKey, GostKeyWrapMethod.CryptoProKeyWrap); decrypt_gost28147.IV = markant.IV; if (decrypt_gost28147 == null) { throw new Exception("Invalid decrypted session key"); } // Устанавливаем синхропосылку. decrypt_gost28147.IV = markant.IV; return(decrypt_gost28147); }
// Шифрование тестового файла. static void EncryptTestFile( Gost3410_2012_256 publicKey, Gost3410_2012_256CryptoServiceProvider privateKey, string fileId = "2012_256") { // Создаем симметричный ключ. Gost28147 symmetric = Gost28147.Create(); // Открываем ключ отправителя. Gost3410Parameters srcPublicKeyParameters = privateKey.ExportParameters(false); // Создаем agree ключ GostSharedSecretAlgorithm agree = privateKey.CreateAgree( publicKey.ExportParameters(false)); // Зашифровываем симметричный ключ на agree ключе. byte[] WrappedKey = agree.Wrap(symmetric, GostKeyWrapMethod.CryptoPro12KeyWrap); // Создаем поток шифратора. ICryptoTransform transform = symmetric.CreateEncryptor(); // Создаем зашифрованный файл. using (FileStream ofs = new FileStream(string.Format(EncryptedFileName, fileId), FileMode.Create)) { BinaryWriter bw = new BinaryWriter(ofs); // Записываем зашифрованный симметричный ключ. bw.Write(WrappedKey.Length); bw.Write(WrappedKey); // Записываем синхропосылку bw.Write(symmetric.IV.Length); bw.Write(symmetric.IV); // Передаем открытый ключ. BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ofs, srcPublicKeyParameters); // Создаем поток шифрования для записи в файл. using (CryptoStream cs = new CryptoStream(ofs, transform, CryptoStreamMode.Write)) { byte[] data = new byte[4096]; // Открываем входной файл. using (FileStream ifs = new FileStream(string.Format(SourceFileName, fileId), FileMode.Open, FileAccess.Read)) { // и переписываем содержимое в выходной поток. int length = ifs.Read(data, 0, data.Length); while (length > 0) { cs.Write(data, 0, length); length = ifs.Read(data, 0, data.Length); } } } } }
// Расшифрование тестового файла. static void DecryptTestFile(Gost3410_2012_256CryptoServiceProvider privateKey, string fileId = "2012_256") { // Открываем зашифрованный файл. using (FileStream ifs = new FileStream(string.Format(EncryptedFileName, fileId), FileMode.Open, FileAccess.Read)) { // Читаем зашифрованный симметричный ключ. BinaryReader br = new BinaryReader(ifs); byte[] cek; int cekLength = br.ReadInt32(); cek = br.ReadBytes(cekLength); // Читаем синхропосылку byte[] iv; int ivLength = br.ReadInt32(); iv = br.ReadBytes(ivLength); // Читаем открытый ключ. BinaryFormatter formatter = new BinaryFormatter(); Gost3410Parameters srcPublicKeyParameters = (Gost3410Parameters)formatter.Deserialize(ifs); // Создаем agree ключ GostSharedSecretAlgorithm agree = privateKey.CreateAgree( srcPublicKeyParameters); // Расшифровываем симметричный ключ на agree SymmetricAlgorithm symmetric = agree.Unwrap(cek, GostKeyWrapMethod.CryptoPro12KeyWrap); symmetric.IV = iv; // Создаем поток разшифрования. ICryptoTransform transform = symmetric.CreateDecryptor(); // Создаем поток разшифрования из файла. using (CryptoStream cs = new CryptoStream(ifs, transform, CryptoStreamMode.Read)) { // Открываем расшифрованный файл using (FileStream ofs = new FileStream(string.Format(DecryptedFileName, fileId), FileMode.Create)) { byte[] data = new byte[4096]; // и переписываем содержимое в выходной поток. int length = cs.Read(data, 0, data.Length); while (length > 0) { ofs.Write(data, 0, length); length = cs.Read(data, 0, data.Length); } } } } }
/// <summary> /// Создает маркант с помошью ключа согласования /// </summary> /// <param name="gost28147">Сессионный ключ</param> /// <param name="certFileName">Путь к файлу сертификата получателя</param> /// <param name="providerInitData">Информация для инициализации контейнера криптопровайдера c закрытым ключом отправителя</param> /// <returns>Сгенерированный маркант</returns> public static Markant CreateMarkantWithKeyAgree(Gost28147 gost28147, string certFileName, ProviderInitData providerInitData) { // Разбираем сертификат получателя X509Certificate2 cert = new X509Certificate2(certFileName); if (!(cert.PublicKey.Key is Gost3410_2012_256 gost3410)) { throw new CryptographicException("Not a GOST certificate"); } //Готовим параметры контейнера CspParameters cspParameters = new CspParameters { ProviderType = (int)providerInitData.ProviderType, Flags = CspProviderFlags.NoPrompt, KeyPassword = providerInitData.ProviderPassword, KeyContainerName = providerInitData.ProviderContainerName }; //Открываем контейнер Gost3410_2012_256CryptoServiceProvider encrypt_gost3410 = new Gost3410_2012_256CryptoServiceProvider(cspParameters); Gost3410Parameters encrypt_gost3410PublicKeyParameters = encrypt_gost3410.ExportParameters(false); // Создаем agree ключ GostSharedSecretAlgorithm agree = encrypt_gost3410.CreateAgree(gost3410.ExportParameters(false)); // Зашифровываем симметричный ключ на agree ключе. byte[] wrappedKey = agree.Wrap(gost28147, GostKeyWrapMethod.CryptoProKeyWrap); //Формируем маркант Markant m = new Markant { Version = 2, SessionKey = wrappedKey, IV = gost28147.IV, PublicKey = Helper.ObjectToByteArray(encrypt_gost3410PublicKeyParameters) }; return(m); }