объявил переменные, сертификат получил:
private X509Certificate2 _certificate;
private Gost3410_2012_256 AssymKey;
private byte[] IV;
переделал 2 функции из примеров:
//зашифровать
private void EncryptFile(GostKeyTransport encKey, string inFileName, string outFileName)
{
//Создаем потоки для входного и выходного файлов.
byte[] bin = new byte[100]; // Промежуточный буфер.
long rdlen = 0; // Общее число записанных байт.
FileStream fin = new FileStream(inFileName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outFileName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
long totlen = fin.Length; // Общий размер входного файла.
int len; // Число считанных за один раз байт.
// Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
Gost2012_256KeyExchangeDeformatter Deformatter = new Gost2012_256KeyExchangeDeformatter(AssymKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);
// Устанавливаем синхропосылку.
key.IV = IV;
// Создаем дешифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)key.CreateEncryptor();
// Создаем криптопоток для записи
CryptoStream encStream = new CryptoStream(fout, cryptoTransform, CryptoStreamMode.Write);
// Читаем из входного файла, шифруем и пишем в выходной.
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}
encStream.Close();
fout.Close();
fin.Close();
}
//Расшифровать
private void DecryptFile(GostKeyTransport encKey, string EncryptedFileName, string DecryptedFileName)
{
// Открываем зашифрованный файл.
using (FileStream ifs = new FileStream(EncryptedFileName, FileMode.Open, FileAccess.Read))
{
// Деформаттер для ключей, зашифрованных на ассиметричном ключе получателя.
Gost2012_256KeyExchangeDeformatter Deformatter = new Gost2012_256KeyExchangeDeformatter(AssymKey);
// Получаем ГОСТ-овый ключ из GostKeyTransport.
Gost28147 key = (Gost28147)Deformatter.DecryptKeyExchange(encKey);
// Устанавливаем синхропосылку.
key.IV = IV;
// Создаем дешифратор для ГОСТ.
CPCryptoAPITransform cryptoTransform = (CPCryptoAPITransform)key.CreateDecryptor();
// Создаем поток разшифрования из файла.
using (CryptoStream cs = new CryptoStream(ifs, cryptoTransform, CryptoStreamMode.Read))
{
// Открываем расшифрованный файл
using (FileStream ofs = new FileStream(DecryptedFileName, 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);
}
}
}
}
}
Вызов в функции такой:
AsymmetricAlgorithm pk = _certificate.PrivateKey;
AssymKey = pk as Gost3410_2012_256CryptoServiceProvider;
// Создаем случайный секретный ключ, который необходимо передать.
Gost28147 key = new Gost28147CryptoServiceProvider();
IV = key.IV;
// Создаем форматтер, шифрующий на ассиметричном ключе получателя.
Gost2012_256KeyExchangeFormatter Formatter = new Gost2012_256KeyExchangeFormatter(AssymKey);
// GostKeyTransport - формат зашифрованной для безопасной передачи ключевой информации.
GostKeyTransport encKey = Formatter.CreateKeyExchange(key);
EncryptFile(encKey, BeginName, SourceName);
DecryptFile(encKey, SourceName, DestName);
---
BeginName, SourceName, DestName - имена файлов.
После выполнения у меня конечный файл соответсвовал исходному - но есть одно но, простой текстовый файл с строкой "123456789" равен 9 байт, зашифрованный с именем 111.txt.enc тоже имеет размер 9, расшифрованный полностью соответсвует начальному = 9, а вот зашифрованный файл, полученный через cryptcp имеет размер 548 байт.
В поп-меню виндовс встроен вызов КриптоАПМ, файл, сжатый через мою функцию не открывается с ошибкой неверный формат данных, подозреваю не хватает заголовка, подскажите, двигаюсь ли я в правильном направлении и где споткнулся в реализации?