Статус: Новичок
Группы: Участники
Зарегистрирован: 03.11.2017(UTC) Сообщений: 4
Сказал(а) «Спасибо»: 5 раз
|
Всем привет! Есть задача: шифровать файлы и расшифровывать. Формат файла PKCS7. Файл должен разбираться КриптоАРМом Шифрование реализовано у меня сейчас следующим образом: Код:
public static void Encrypt(string certFileName, string inFileName, string outFileName)
{
// Разбираем сертификат получателя
X509Certificate2 cert = new X509Certificate2(certFileName);
ContentInfo plainContent = new ContentInfo(File.ReadAllBytes(inFileName));
EnvelopedCms encryptedData = new EnvelopedCms(
SubjectIdentifierType.IssuerAndSerialNumber,
plainContent,
new AlgorithmIdentifier(new Oid("1.2.643.7.1.2.5.1.1")));
CmsRecipient recipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, cert);
encryptedData.Encrypt(recipient);
byte[] encryptedBytes = encryptedData.Encode();
File.WriteAllBytes(outFileName, encryptedBytes);
}
Дешифрование: Код:
public static void Decrypt(string inFileName, string outFileName)
{
EnvelopedCms encryptedData = new EnvelopedCms();
encryptedData.Decode(File.ReadAllBytes(inFileName));
encryptedData.Decrypt(encryptedData.RecipientInfos[1]);
File.WriteAllBytes(outFileName, encryptedData.ContentInfo.Content);
}
Всё работает как надо, файлы получаются именно в том формате, в котором мне необходимо. Но у данного кода два серьёзных недостатка:
- Не потоковая работа. При большом объёме файла, он будет загружаться весь в память.
- Пароль от контейнера мне приходится писать руками во всплывающем окне. А мне надо задавать его из кода.
Порывшись в гугле я пришёл к выводу, что это можно реализовать с помощью BouncyCastle. Начать я решил с дешифрования. Но я не понимаю как подружить Bouncy и КриптоПРО. Сейчас я пришёл к такому коду: Код:
public static void BouncyDecrypt(string inFileName, string outFileName)
{
using (var inputFileStream = new FileStream(inFileName, FileMode.Open))
{
CmsEnvelopedDataParser ep = new CmsEnvelopedDataParser(inputFileStream);
var recInfo = GetSingleRecipient(ep);
using (var outputFileStream = File.Create(outFileName))
{
recInfo.GetContentStream(GetPrivateKey()).ContentStream.CopyTo(outputFileStream);
}
}
}
private static RecipientInformation GetSingleRecipient(CmsEnvelopedDataParser parser)
{
var recInfos = parser.GetRecipientInfos().GetRecipients();
var enumerator = recInfos.GetEnumerator();
enumerator.MoveNext();
return (RecipientInformation)enumerator.Current;
}
GetPrivateKey() реализацию не привожу, так как там экспериментальный код, который всё равно не работает. В кратце я создаю инстанс Gost3410_2012_256CryptoServiceProvider, а дальше пытаюсь достать оттуда и сконвертировать в формат Bouncy приватный ключ. Проблема у меня несколько в таким кодом:
- Я не могу получить приватный ключ. КриптоПРО не даёт его экпортировать.
- По всей видимости метод GetContentStream не умеет работать с ГОСТ3410_256. Это я выяснил забравшись в исходники. Он не может по Oid 1.2.643.7.1.2.5.1.1 получить алгоритм.
В связи с этим взываю к вашей помощи. Возможно кто-то уже сталкивался с подобными проблемами и знает как их решить или хотя бы в каком направлении двигаться. Я пока в тупике.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 20.02.2017(UTC) Сообщений: 217
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 63 раз в 59 постах
|
Приветствую. КриптоПро .NET не позволяет экспорт секретных ключей в явном виде. Насколько я знаю, полноценной поддержки ключей 2012 госта у BouncyCastle нет. Сертификаты так же не откроются. Возможно и cms для 2012 госта не поддерживается. Тут сделали что похожее для потоковой cms подписи через нативные вызовы. Можно попробовать переписать для шифрования. Отредактировано пользователем 3 сентября 2018 г. 16:22:07(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Артём Макаров за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close