Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.53/98: Рейтинг темы: голосов - 98, средняя оценка - 4.53
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Шифрование файлов AES алгоритмом

15.09.2011, 18:05. Просмотров 17960. Ответов 28

Здравствуйте, не могу решить проблему с дешифровкой файлов, при дешифровке строки написанные русскими буквами превращаются в псевдографику (квадраты).

Прошу помочь в данной проблеме!

Вот код дешифровки:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if (openfile.ShowDialog() == DialogResult.OK)
            {
                    FileStream fsFileIn = File.OpenRead(textBox2.Text);
 
                    FileStream fsKeyFile = File.OpenRead(openfile.FileName);
 
                    FileStream fsFileOut = File.Create(textBox2.Text+"_decrypt");
 
                    AesCryptoServiceProvider cryptAlgorithm = new AesCryptoServiceProvider();
                    BinaryReader brFile = new BinaryReader(fsKeyFile);
                    cryptAlgorithm.Key = key;
                    cryptAlgorithm.IV = iv;
 
 
                    CryptoStream csEncrypt = new CryptoStream(fsFileIn, cryptAlgorithm.CreateDecryptor(), CryptoStreamMode.Read);
 
 
                    StreamReader srStream = new StreamReader(csEncrypt);
                    StreamWriter swStream = new StreamWriter(fsFileOut);
                        
                    swStream.WriteLine(srStream.ReadToEnd());
                    
                    swStream.Close();
                    fsFileOut.Close();
                    srStream.Close();
 
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2011, 18:05
Ответы с готовыми решениями:

Зашифровать файл любого типа с пользовательским паролем, желательно — AES алгоритмом
Необходимо зашифровать файл любого типа с пользовательским паролем, желательно...

Aes шифрование
Привет, нужна помощь, есть программная реализация aes, помогите определить в...

AES шифрование, ошибка в дешифровке
Приветы! Задача такова: пользователь выбирает файл, файл шифруется,...

AES шифрование и разные векторы инициализации
Появилась задача шифрования файлов. Выбор пал на AES шифрование. Нашел...

Реализовать шифрование данных с помощью AES алгоритма
добрый день друзья помогите реализовать шифрование данных с помощью AES...

28
Петррр
6160 / 3461 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
15.09.2011, 18:30 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Security.Cryptography;
using System.IO;
 
class Program
{
    static void Main(string[] args)
    {
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.GenerateIV();
        byte[] iv = aes.IV;
        aes.GenerateKey();
        byte[] key = aes.Key;
        ICryptoTransform cryptoTransform = aes.CreateEncryptor();
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write);
        StreamWriter streamWriter = new StreamWriter(cryptoStream);
        string text = "привет, мир";
        streamWriter.Write(text);
        byte[] enryptText = memoryStream.ToArray();
        streamWriter.Dispose();
        cryptoStream.Dispose();
        memoryStream.Dispose();
        memoryStream = new MemoryStream(enryptText);
        cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
        StreamReader streamReader = new StreamReader(cryptoStream);
        string decryptText = streamReader.ReadToEnd();
        streamWriter.Dispose();
        cryptoStream.Dispose();
        memoryStream.Dispose();
        Console.WriteLine("Текст: " + text);
        Console.ReadLine();
    }
}
1
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
15.09.2011, 19:19  [ТС] 3
спасибо, но так и не понял почему у меня текст кодирует неправильно, если можно - поясни код, вот мой проект полностью:
EDS-File.zip
0
Петррр
6160 / 3461 / 897
Регистрация: 28.10.2010
Сообщений: 5,926
15.09.2011, 19:32 4
Может Вы файл считываете в кодировке windows-1251, а затем шифруте его как UTF-8.
2
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
15.09.2011, 19:48  [ТС] 5
Цитата Сообщение от Петррр Посмотреть сообщение
Может Вы файл считываете в кодировке windows-1251, а затем шифруте его как UTF-8.
Точно, надо преобразовывать поток в UTF8, спасибо.
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
16.09.2011, 10:34  [ТС] 6
Другая беда, текстовые файлы шифрует и дешифрует отлично, а вот бинарные и прочие форматы файлов дешифрует коряво, после чего они не открываются...

EDS-File.zip
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
16.09.2011, 19:03  [ТС] 7
ни у кого такого не случалось, голову ломаю почему не выходит, гугл уже даже не помогает )
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
16.09.2011, 22:37 8
В Вашем коде не разбирался, т.к. когда-то делал заготовку под симметричные алгоритмы, её в Вашем проекте и применил (там 2 метода CryptFile, DecryptFile).

Принцип остался тот-же:
1) Выбрать файл для шифрования -> будет создан файл рядом с существующим, с расширением *.crypt
2) Ключи сохранятся в Application.StartupPath + "\\keys\\" + имя_файла_плюс_.key
3) Выбрать файл для дешифровки с расширением *.crypt -> Будет создан файл рядом с существующим, с расширением *.decrypt
1
Вложения
Тип файла: rar EDS-File.rar (24.3 Кб, 656 просмотров)
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
16.09.2011, 23:57  [ТС] 9
Цитата Сообщение от SSTREGG Посмотреть сообщение
В Вашем коде не разбирался, т.к. когда-то делал заготовку под симметричные алгоритмы, её в Вашем проекте и применил (там 2 метода CryptFile, DecryptFile).

Принцип остался тот-же:
1) Выбрать файл для шифрования -> будет создан файл рядом с существующим, с расширением *.crypt
2) Ключи сохранятся в Application.StartupPath + "\\keys\\" + имя_файла_плюс_.key
3) Выбрать файл для дешифровки с расширением *.crypt -> Будет создан файл рядом с существующим, с расширением *.decrypt
и чем собственно он отличается от моего? Может и не стоило так сильно всё переделывать? Потому как сейчас я вообще не могу разобраться в коде...
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
17.09.2011, 00:46  [ТС] 10
SSTREGG, можете хотябы коменты к коду дать, что и для чего вообще используется, например вот это:
C#
1
2
3
4
5
6
7
8
9
                var rnd = RNGCryptoServiceProvider.Create();
                byte[] buff0 = new byte[aes.KeySize / 8],
                       buff1 = new byte[16];
 
                rnd.GetNonZeroBytes( buff0 );
                rnd.GetNonZeroBytes( buff1 );
 
                fs.Write( buff0, 0, buff0.Length );
                fs.Write( buff1, 0, buff1.Length );
или вот это:
C#
1
2
3
4
5
6
7
8
9
10
                using ( var fs = File.Open( fileIn, FileMode.Open, FileAccess.Read ) ) {
                    buff = new byte[fs.Length + sizeof( long )];
                    fs.Read( buff, sizeof( long ), buff.Length - sizeof( long ) );
                    /* Записываем в первые 8 байт длину исходного файла
                     * нужно это для того чтобы, после дешифровки не было
                     * лишних данных
                     */
                    int i = 0;
                    foreach ( byte @byte in BitConverter.GetBytes( fs.Length ) )
                        buff[i++] = @byte;
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
17.09.2011, 00:56 11
Цитата Сообщение от >arty< Посмотреть сообщение
и чем собственно он отличается от моего?
Реализацией.
Цитата Сообщение от >arty< Посмотреть сообщение
Может и не стоило так сильно всё переделывать?
У меня не было желания выискивать ошибку в Вашем коде, можете подождать, возможно кому-то будет интересно. Я использовал проверенную реализацию, которая поддерживает все симметричные алгоритмы .NET.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Создаем генератор случайных чисел
// [url]http://msdn.microsoft.com/ru-ru/library/system.security.cryptography.rngcryptoserviceprovider.aspx[/url]
var rnd = RNGCryptoServiceProvider.Create();
// Создаем буфер, равный длине ключа, и длине вектора (16 байт)
byte[] buff0 = new byte[aes.KeySize / 8],
       buff1 = new byte[16];
// Заполняем ключ случайными числами
rnd.GetNonZeroBytes( buff0 );
// Заполняем вектор случайными числами
rnd.GetNonZeroBytes( buff1 );
// Пишем ключ в файл
fs.Write( buff0, 0, buff0.Length );
// Пишем вектор в файл
fs.Write( buff1, 0, buff1.Length );
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using ( var fs = File.Open( fileIn, FileMode.Open, FileAccess.Read ) ) {
// Создаем буфер длинной в файл + 8 байт, для хранения изначальной
// длины файла, т.к. при шифровании используется выравнивание по
// определенной длине блока (например 512 байт, или 1024)
// тем самым файл может немного "раздуть" и оригинал при дешифровке
// мы уже не получим
buff = new byte[fs.Length + sizeof( long )];
// Читаем данные в буфер не с самого начала, а со смещением 8 байт
fs.Read( buff, sizeof( long ), buff.Length - sizeof( long ) );
/* Записываем в первые 8 байт длину исходного файла
 * нужно это для того чтобы, после дешифровки не было
 * лишних данных
 */
int i = 0;
// Перевод значение из long в byte[]
foreach ( byte @byte in BitConverter.GetBytes( fs.Length ) )
    buff[i++] = @byte;
1
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
17.09.2011, 11:42  [ТС] 12
SSTREGG, а реализацию сами делали или где-то брали, если брали, скиньте ссылку на первоисточник пожалуйста, почитаю...
P.S. может посоветуете книжку где описываются примеры шифрования на языке C# ?
0
NickoTin
Почетный модератор
Эксперт .NET
8446 / 3568 / 402
Регистрация: 14.06.2010
Сообщений: 4,512
Записей в блоге: 9
17.09.2011, 11:57 13
>arty<, сам делал. Книжку не подскажу, т.к. не читал таковых. Читал MSDN и статьи которые попадались в сети.
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
17.09.2011, 12:06  [ТС] 14
Цитата Сообщение от SSTREGG Посмотреть сообщение
>arty<, сам делал. Книжку не подскажу, т.к. не читал таковых. Читал MSDN и статьи которые попадались в сети.
Очень жаль, хотел свой до ума довести, Ваш хоть и готовый, но это Ваш код!
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
17.09.2011, 12:34  [ТС] 15
И всё таки я нашёл: Хеширование, шифрование и цифровая подпись
1
IamRain
1314 / 1201 / 372
Регистрация: 02.08.2011
Сообщений: 3,493
30.03.2013, 16:13 16
Цитата Сообщение от _arty_ Посмотреть сообщение
псевдографику (квадраты).
ууу, на те же грабли натыкался, если при формировании в строку произвольных бинарных файлов, используя например utf-8, utf-8 не найдет код символа, равный значению того или иного байта, то она искажает его(этот байт), делая заглушку.
Например, у меня байт 128 (10000000) заменялся на байт 63 (00111111).
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
30.03.2013, 17:43  [ТС] 17
Цитата Сообщение от IamRain Посмотреть сообщение
ууу, на те же грабли натыкался, если при формировании в строку произвольных бинарных файлов, используя например utf-8, utf-8 не найдет код символа, равный значению того или иного байта, то она искажает его(этот байт), делая заглушку.
Например, у меня байт 128 (10000000) заменялся на байт 63 (00111111).
Вопрос уже давно решён, побайтово шифрую и дешифрую....
0
Strangers
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 47
30.04.2013, 01:52 18
Цитата Сообщение от _arty_ Посмотреть сообщение
Вопрос уже давно решён, побайтово шифрую и дешифрую....
Не могли бы Вы подробней описать как решили свою проблему с квадратами, и вообще как Вы шифруете. У меня стоит похожая задача, вот только шифровать нужно большие файлы и поэтому нельзя применить поток MemoryStream... в потоках уже запутался я...
0
_arty_
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
30.04.2013, 06:39  [ТС] 19
Цитата Сообщение от Strangers Посмотреть сообщение
Не могли бы Вы подробней описать как решили свою проблему с квадратами, и вообще как Вы шифруете. У меня стоит похожая задача, вот только шифровать нужно большие файлы и поэтому нельзя применить поток MemoryStream... в потоках уже запутался я...
Посмотрите ссылку что я приводил выше, там весь необходимый материал.
1
Strangers
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 47
30.04.2013, 22:28 20
Цитата Сообщение от _arty_ Посмотреть сообщение
Посмотрите ссылку что я приводил выше, там весь необходимый материал.
Большое спасибо. Выручили)
0
30.04.2013, 22:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2013, 22:28

Шифрование AES. Переполнение в результате выполнения арифметической операции
Помогите пожалуйста почему выдает ошибку:&quot;Переполнение в результате выполнения...

AES шифрование
Видел кучу тем на эту тему, но так для себя решения и не нашел, здесь...

Шифрование AES 128.
Привет. Нужно зашифровать string используя AES 128 битный. Что-то написал,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru