Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Шифрование файла по ГОСТ #7

Closed
zlobkom opened this issue May 31, 2018 · 6 comments
Closed

Шифрование файла по ГОСТ #7

zlobkom opened this issue May 31, 2018 · 6 comments

Comments

@zlobkom
Copy link

zlobkom commented May 31, 2018

Александр, добрый день.
Пытаюсь использовать вашу библиотеку в следующей задаче:
PDF файл зашифровать через CryptoPro и сохранить полученный результат в БД.

Если использую код из примера:

var sharedKey = new Gost28147SymmetricAlgorithm();
var dataStream = new MemoryStream(Encoding.UTF8.GetBytes("Some data for encrypt..."));;

var encryptedDataStream = EncryptDataStream(sharedKey, dataStream);
var decryptedDataStream = DecryptDataStream(sharedKey, encryptedDataStream);

то dataStream совпадает с decryptedDataStream;

но если в dataStream кладу содержимое файла PDF,

dataStream = new MemoryStream(Convert.FromBase64String(obj.Content));

то дешифрованный результат не совпадает с исходным.

@AlexMAS
Copy link
Owner

AlexMAS commented May 31, 2018

Здравствуйте.

Я думаю, что дело в размере данных и пример не совсем корректный. Попробуйте в методе шифрования, непосредственно после записи исходных данных в поток CryptoStream (см. L72) вызвать что-то типа CryptoStream.FlushFinalBlock(). Я думаю, что не все данные попали в encryptedDataStream, но могу ошибаться. Если получится, дайте знать. :)

var cryptoStream = new CryptoStream(encryptedDataStream, encryptor, CryptoStreamMode.Write);
dataStream.CopyTo(cryptoStream);
cryptoStream.FlushFinalBlock();

P.s. Вот тут также есть интересный комментарий.

@zlobkom
Copy link
Author

zlobkom commented Jun 1, 2018

Здравствуйте.

Спасибо за помощь. Все заработало :)

@zlobkom zlobkom closed this as completed Jun 1, 2018
@zlobkom zlobkom reopened this Jun 1, 2018
@zlobkom
Copy link
Author

zlobkom commented Jun 1, 2018

Александр, помогите, еще раз, пожалуйста.

По моей задаче, мне файл надо зашифровать и сохранить в БД, потом его нужно расшифровать и показать пользователю.

если я создаю ключ через
var key = new Gost28147SymmetricAlgorithm();
то он "живет" до конца выполнения блока.
Т.к. мне не нужен уникальный ключ для каждого файла то я решил попробовать создавать ключ через
var sharedKey = Gost28147SymmetricAlgorithm.CreateFromPassword(Encoding.ASCII.GetBytes("password"));
Но наткнулся на то, что каждый вызов этой функции создает новый ключ.

Тогда решил, попробовать создать ключ, сохранить его в файл и использовать как общий ключ.

var sharedKey = Gost28147SymmetricAlgorithm.CreateFromPassword(Encoding.ASCII.GetBytes("password"));
var exportKey = sharedKey.EncodePrivateKey(new Gost28147SymmetricAlgorithm(), GostKeyExchangeExportMethod.GostKeyExport);
var newSharedKey =  exportKey.DecodePrivateKey(exportKey, GostKeyExchangeExportMethod.GostKeyExport);

но на последнем шаге падает Exception "Плохие данные".

Похоже, я делаю что-то не так :) но понять не могу

@AlexMAS
Copy link
Owner

AlexMAS commented Jun 2, 2018

Не думаю, что так можно сделать напрямую. Говорят, что это не соответствует канонам использования этого ключа. Однако вы можете попробовать сгенерировать пару iv/sessionKey, как в этом примере, и куда-нибудь ее сохранить для дальнейшего использования. Но для этого нужен будет ГОСТовский сертификат.

@AlexMAS
Copy link
Owner

AlexMAS commented Jun 6, 2018

Получилось решить проблему?

@zlobkom
Copy link
Author

zlobkom commented Jun 6, 2018

Александр, простите, на радостях забыл отписаться.

Да, проблема решилась: создал сертификат 34.10-2001, а дальше по примеру.
Была проблема не работы приложения в релизе... Долго разбирался, оказалось не хватает прав у пользователя IIS на доступ к ветке реестра.

Буду пробовать теперь на 2012 сертификат перевести. Думаю, все получится.

Еще раз большое спасибо за помощь )

@AlexMAS AlexMAS closed this as completed Jun 18, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants