Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/161: Рейтинг темы: голосов - 161, средняя оценка - 4.51
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
.NET 4.x

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

15.09.2011, 18:05. Показов 33674. Ответов 29

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

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

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

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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2011, 18:05
Ответы с готовыми решениями:

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

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

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

29
C#
57 / 57 / 5
Регистрация: 09.03.2013
Сообщений: 216
02.05.2013, 12:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Strangers Посмотреть сообщение
Не могли бы Вы подробней описать как решили свою проблему с квадратами, и вообще как Вы шифруете. У меня стоит похожая задача, вот только шифровать нужно большие файлы и поэтому нельзя применить поток MemoryStream... в потоках уже запутался я...
Используйте FileStream - то же самое, только с файлом.
0
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 47
02.05.2013, 12:52
Цитата Сообщение от A1exSun Посмотреть сообщение
Используйте FileStream - то же самое, только с файлом.
Ага, спасибо. Уже разобрался.
0
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 47
03.05.2013, 23:55
Снова столкнулся с проблемой. Когда дешифрую генерируется исключение "Заполнение не верно и не может быть удаленно", причем такое исключение бывает только если я шифрования и дешифрования в отдельные методы засовываю.
Вот методы шифрования и дешифрования:
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
public void EncryptAES_File(string path,out byte[] Key,out byte[] IV)
        {
            using (AesManaged AES = new AesManaged())
            {
                ICryptoTransform tr = AES.CreateEncryptor();
                Key = AES.Key;
                IV = AES.IV;
                using (FileStream instream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    using (FileStream outstream = new FileStream(path+".crypto", FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        int buflen = ((2 << 16) / AES.BlockSize) * AES.BlockSize;
                        byte[] inbuf = new byte[buflen];
                        byte[] outbuf = new byte[buflen];
                        int len;
                        while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                        {
                            int enclen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0);
                            outstream.Write(outbuf, 0, enclen);
                        }
                        outbuf = tr.TransformFinalBlock(inbuf, 0, len);
                        outstream.Write(outbuf, 0, outbuf.Length);
                    }
                }
            }
        }
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
public void DecryptAES_File(string path, byte[] Key, byte[] IV)
        {
            using (AesManaged AES = new AesManaged())
            {
                ICryptoTransform tr = AES.CreateDecryptor();
                AES.Key = Key;
                AES.IV = IV;
                AES.Padding = PaddingMode.None;
                using (FileStream instream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    using (FileStream outstream = new FileStream(path.Remove(path.LastIndexOf(".crypto")), FileMode.Create, FileAccess.Write, FileShare.None))
                    {
                        int buflen = ((2 << 16) / AES.BlockSize) * AES.BlockSize;
                        byte[] inbuf = new byte[buflen];
                        byte[] outbuf = new byte[buflen];
                        int len;
                        while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                        {
                            int declen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0);
                            outstream.Write(outbuf, 0, declen);
                        }
                        outbuf = tr.TransformFinalBlock(inbuf, 0, len);
                        outstream.Write(outbuf, 0, outbuf.Length); 
                    }
                }
            }
        }
Ошибку выдает при дешифровке в строке outbuf = tr.TransformFinalBlock(inbuf, 0, len). Буду очень благодарен за помощь.
0
 Аватар для Draiget
1 / 1 / 2
Регистрация: 02.05.2013
Сообщений: 31
04.05.2013, 20:12
Кликните здесь для просмотра всего текста
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/* using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;
*/
 
public static byte[] Encrypt<T>(byte[] plainFile, string password, string salt)
        where T : SymmetricAlgorithm, new()
        {
            DeriveBytes rgb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(salt));
            T algorithm = new T();
 
            byte[] rgbKey = rgb.GetBytes(algorithm.KeySize >> 3);
            byte[] rgbIV = rgb.GetBytes(algorithm.BlockSize >> 3);
 
            ICryptoTransform encryptor = algorithm.CreateEncryptor(rgbKey, rgbIV);
 
            MemoryStream msEncrypt = new MemoryStream();
 
            CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
 
            csEncrypt.Write(plainFile, 0, plainFile.Length);
            csEncrypt.FlushFinalBlock();
            csEncrypt.Close();
            csEncrypt.Dispose();
 
            return msEncrypt.ToArray();
        }
 
        public static byte[] Decrypt<T>(byte[] encryptedFile, string password, string salt)
        where T : SymmetricAlgorithm, new()
        {
            DeriveBytes rgb = new Rfc2898DeriveBytes(password, Encoding.Unicode.GetBytes(salt));
            T algorithm = new T();
 
            byte[] rgbKey = rgb.GetBytes(algorithm.KeySize >> 3);
            byte[] rgbIV = rgb.GetBytes(algorithm.BlockSize >> 3);
 
            ICryptoTransform decryptor = algorithm.CreateDecryptor(rgbKey, rgbIV);
 
            MemoryStream msDecrypt = new MemoryStream(encryptedFile);
 
            CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
 
            byte[] fromEncrypt = new byte[encryptedFile.Length];
 
            csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
            csDecrypt.Close();
            csDecrypt.Dispose();
 
            return fromEncrypt;
        }


C#
1
2
3
4
5
6
7
8
9
10
//Запись
String newText = "simple line";
byte[] b = Hashing.Encrypt<AesCryptoServiceProvider>(Encoding.UTF8.GetBytes(newText), "hash_pass", "pass_salt");
BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\myfile.txt", FileMode.Create));
bw.Write(b, 0, b.Length);
bw.Close();
 
//Чтение
byte[] bytes = Hashing.Decrypt<AesCryptoServiceProvider>(File.ReadAllBytes(@"C:\myfile.txt"), "hash_pass", "pass_salt");
String text = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
0
1 / 1 / 0
Регистрация: 08.02.2013
Сообщений: 47
05.05.2013, 22:08
Помогите пожалуйста. Ситуация следующая: до шифрования текст имеет вид
Code
1
2
 пїЅпїЅпїЅmhUпїЅ@пїЅvпїЅпїЅ#Я›Ыњ пїЅпїЅ пїЅпїЅпїЅпїЅ%пїЅпїЅ-ZiпїЅпїЅ.dg  пїЅ  qпїЅпїЅnRпїЅwPпїЅx
пїЅ]пїЅKпїЅ;+1$пїЅJпїЅxпїЅпїЅ2 пїЅпїЅjwпїЅ!4пїЅпїЅ.QDпїЅ\пїЅ3Зџ9пїЅ4пїЅпїЅ"PпїЅ9<{пїЅпїЅ^пїЅT$d6FпїЅa^yпїЅпїЅ_пїЅ6пїЅK
А после расшифровки
Code
1
2
 пїЅпїЅпїЅmhUпїЅ@пїЅvпїЅпїЅ#Я›Ыњ пїЅпїЅ пїЅпїЅпїЅпїЅ%пїЅпїЅ-ZiпїЅпїЅ.dg  пїЅ  qпїЅпїЅnRпїЅwPпїЅx
пїЅ]пїЅKпїЅ;+1$пїЅJпїЅxпїЅпїЅ2 пїЅпїЅjwпїЅ!4пїЅпїЅ.QDпїЅ\пїЅ3Зџ9пїЅ4пїЅпїЅ"PпїЅ9<{пїЅпїЅ^пїЅT$d6FпїЅa^yпїЅпїЅ_пїЅ6пїЅК NUL NUL NUL NUL NUL
Как бороться с этими NUL-ами?

Добавлено через 2 часа 13 минут
Все, проблема решена. Просто жёстко указал размер буфера для шифрования\расшифровывания.
0
Sten93
11.06.2013, 19:27
Все, проблема решена. Просто жёстко указал размер буфера для шифрования\расшифровывания.
А можно поконкретней?
 Аватар для pokerface
209 / 174 / 48
Регистрация: 20.09.2012
Сообщений: 481
26.12.2013, 13:04
Цитата Сообщение от NickoTin Посмотреть сообщение
C#
1
2
3
// Заполняем вектор случайными числами
rnd.GetNonZeroBytes( buff1 );
;
Привет. Извините за, возможно, примитивен вопрос но что такое в нашем случае "вектор" и для чего он нужен. Спасибо.

Добавлено через 28 минут
Также интересует вопрос, если мне нужно сделать комбинацию ключа и кодового слова. Например создан 256 битный ключ + есть строка string, которая через Encoding.Unicode.GetBytes() превращается в массив байт. Потом при зашифровке к массиву ключа добавляем массив байт слова. Такой путь будет правильный или надо как-то по другому это делать?
0
0 / 0 / 0
Регистрация: 16.04.2018
Сообщений: 1
16.04.2018, 22:52
представляю вам свою реализацию консольной програмки AES шифрования/дешифрования
(1)одного файла
(2)всех файлов по указанному пути.
Написано на С#..
Буду рад конструктивной критике.

P.S. Интересующий вас .exe файл находится в kursPasoib
Вложения
Тип файла: zip kursPasoib.zip (307.3 Кб, 26 просмотров)
0
3566 / 2507 / 1174
Регистрация: 14.08.2016
Сообщений: 8,219
17.04.2018, 01:13
и что же они,страдальцы, делали без малого 5 лет?!
0
0 / 0 / 0
Регистрация: 11.02.2012
Сообщений: 12
21.11.2018, 13:18
Форумчане, помогите пожалуйста с AES, брал за основу код из ссылки, которой поделился _arty_, добрые люди посоветовали заменить старый класс в теме: SecureString вместо String (пример в сообщении)
Заменил PasswordDeriveBytes на Rfc2898DeriveBytes... Теперь возникает ошибка: Заполнение неверно и не может быть удалено.

Где эта ошибка?

Вот код:
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
public static int KeyMaxSize = 0;
public static SymmetricAlgorithm alg = (SymmetricAlgorithm)RijndaelManaged.Create();
public static KeySizes[] ks = alg.LegalKeySizes; //получаем список допустимых размеров ключей
 
 
 
        #region 2018 11
        public static void Encrypt1(string password, string path_file)
        {
            try
            {
 
                //для ключа
                Proc1.Inic();
 
 
                //Зашифровать файл
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, 32, 10000, HashAlgorithmName.SHA512); //класс, позволяющий генерировать ключи на базе паролей
 
 
                alg.KeySize = KeyMaxSize; //устанавливаем размер ключа
                alg.Key = pdb.GetBytes(KeyMaxSize >> 3); //получаем ключ из пароля
                alg.Mode = CipherMode.CBC; //используем режим CBC
                alg.IV = new Byte[alg.BlockSize >> 3]; //и пустой инициализационный вектор
                ICryptoTransform tr = alg.CreateEncryptor(); //создаем encryptor
                FileStream instream = new FileStream(path_file, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream outstream = new FileStream(path_file, FileMode.Create, FileAccess.Write, FileShare.None);
                int buflen = ((2 << 16) / alg.BlockSize) * alg.BlockSize;
                byte[] inbuf = new byte[buflen];
                byte[] outbuf = new byte[buflen];
                int len;
                while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                {
                    int enclen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0); //собственно шифруем
                    outstream.Write(outbuf, 0, enclen);
                }
                instream.Close();
                outbuf = tr.TransformFinalBlock(inbuf, 0, len); //шифруем финальный блок
                outstream.Write(outbuf, 0, outbuf.Length);
                outstream.Close();
                alg.Clear();
            }
            catch (Exception x) { MessageBox.Show("Encrypt: " + x.Message, "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
 
        public static void Decrypt1(string password, string path_file)
        {
            try
            {
                //для ключа
                Proc1.Inic();
 
                //Расшифровать файл
                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, 32, 10000, HashAlgorithmName.SHA512);
 
                int keylen = KeyMaxSize;
                alg.KeySize = keylen;
                keylen >>= 3;
                alg.Key = pdb.GetBytes(keylen);
                alg.Mode = CipherMode.CBC;
                alg.IV = new Byte[alg.BlockSize >> 3];
                ICryptoTransform tr = alg.CreateDecryptor();
                FileStream instream = new FileStream(path_file, FileMode.Open, FileAccess.Read, FileShare.Read);
                FileStream outstream = new FileStream(path_file_decrypted, FileMode.Create, FileAccess.Write, FileShare.None);
                int buflen = ((2 << 16) / alg.BlockSize) * alg.BlockSize;
                byte[] inbuf = new byte[buflen];
                byte[] outbuf = new byte[buflen];
                int len;
                while ((len = instream.Read(inbuf, 0, buflen)) == buflen)
                {
                    int declen = tr.TransformBlock(inbuf, 0, buflen, outbuf, 0);
                    outstream.Write(outbuf, 0, declen);
                }
                instream.Close();
                outbuf = tr.TransformFinalBlock(inbuf, 0, len);
                outstream.Write(outbuf, 0, outbuf.Length);
                outstream.Close();
                alg.Clear();
                MessageBox.Show("Расшифровка завершена", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception x) { MessageBox.Show("Decrypt1: " + x.Message, "Исключение", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }
 
        //Инициализация размера ключа для шифрования/дешифрования
        public static void Inic()
        {
            //alg = (SymmetricAlgorithm)RijndaelManaged.Create(); //начальное значение
            //ks 
            for (int i = 0; i < ks.Length; i++)
            {
                KeyMaxSize = ks[i].MaxSize;
            }
        }
 
#endregion
Добавлено через 10 часов 42 минуты
Кто нибудь поможет с этой ошибкой при расшифровке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2018, 13:18

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru