Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
.NET 4.x

Шифрование / Дешифрование файла большого размера по определенному количеству байт

06.11.2021, 02:02. Показов 1723. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Перерыл весь инет но так и не нашел способа шифрования и дешифрования но не по 1 байту а по определенному количеству байт.
Шифровать сразу весь файл не вариант ибо нужно получать процесс ибо файлы могут достигать 100 гб.
Последнее что нарыл:
https://www.codeproject.com/Ar... ption-in-C
Переделал так:
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
public void EncryptArchive(string archiveFile, string encryptArchiveFile)
        {
            new Thread(() =>
            {
                try
                {
                    this.operation = Operation.StartEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                    string password = @"ключ";
                    UnicodeEncoding UE = new UnicodeEncoding();
                    byte[] passwordBytes = UE.GetBytes(password);
 
                    FileStream fsCrypt = new FileStream(encryptArchiveFile, FileMode.Create);
                    RijndaelManaged RMCrypto = new RijndaelManaged();
                    CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(passwordBytes, passwordBytes), CryptoStreamMode.Write);
 
                    FileStream fsIn = new FileStream(archiveFile, FileMode.Open);
 
                    int data;
                    byte[] buffer = new byte[51200];
                    int writed = 0;
                    while ((data = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        writed += data;
                        cs.WriteByte((byte)data);
 
                        this.operation = Operation.ProgressEncryptArchive;
                        progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(writed), MaxValue = Convert.ToDecimal(fsIn.Length) }); ;
                    }
 
                    fsIn.Close();
                    cs.Close();
                    fsCrypt.Close();
 
                    File.Delete(archiveFile);
 
                    this.operation = Operation.StopEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
                catch (Exception ex)
                {
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
                }
 
            }).Start();
        }
Но ошибка. Вроде связана с этим: RMCrypto.CreateEncryptor(passwordBytes, passwordBytes)
В другом способе который тоже нашел шифрование работает а вот дешифрование уже нет.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2021, 02:02
Ответы с готовыми решениями:

Шифрование файла большого размера
Вопрос нубского характера. Как зашифровать алгоритмом AES файл большого размера, основываясь на том факте, что метод cipher.doFinal()...

Шифрование/Дешифрование. Методом перестановки байт
Мне задали сделать шифратор/дешифратор методом перестановки байт ТЗ выглядит так: Необходимо реализовать шифровку и в дальнейшем...

Шифрование потоков большого размера
Здравствуйте, Уважаемые форумчане! Есть огромный по размерам Stream, необходмо его зашифровать. Судя по беглому осмотра криптографии в...

10
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
06.11.2021, 04:31
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Но ошибка. Вроде связана с этим: RMCrypto.CreateEncryptor(passwordBytes, passwordBytes)
Обычно ключ и вектор инициализации должно иметь определенную длину, которая зависит от алгоритма шифрования. Узнать поддерживаемые длину можно через соответствующие свойства класса...
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
07.11.2021, 18:04  [ТС]
rgbKey:
// Секретный ключ, используемый в алгоритме симметричного шифрования. Размер ключа
// должен составлять 128, 192 или 256 битов.
Но как тогда преобразовать свой ключ в определенную длянну байтов?

Добавлено через 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
52
53
public void EncryptArchive(string archiveFile, string encryptArchiveFile, string password = @"ключ")
        {
            new Thread(() =>
            {
                try
                {
                    this.operation = Operation.StartEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                    UnicodeEncoding UE = new UnicodeEncoding();
                    byte[] passwordBytes = new byte[256];
                    var id = 0;
                    foreach (var x in UE.GetBytes(password))
                    {
                        passwordBytes[id] = x;
                        id++;
                    }
                    
 
                    FileStream fsCrypt = new FileStream(encryptArchiveFile, FileMode.Create);
                    RijndaelManaged RMCrypto = new RijndaelManaged();
                    CryptoStream cs = new CryptoStream(fsCrypt, RMCrypto.CreateEncryptor(passwordBytes, passwordBytes), CryptoStreamMode.Write);
 
                    FileStream fsIn = new FileStream(archiveFile, FileMode.Open);
 
                    int data;
                    byte[] buffer = new byte[51200];
                    int writed = 0;
                    while ((data = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        writed += data;
                        cs.WriteByte((byte)data);
 
                        this.operation = Operation.ProgressEncryptArchive;
                        progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(writed), MaxValue = Convert.ToDecimal(fsIn.Length) }); ;
                    }
 
                    fsIn.Close();
                    cs.Close();
                    fsCrypt.Close();
 
                    File.Delete(archiveFile);
 
                    this.operation = Operation.StopEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
                catch (Exception ex)
                {
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
                }
 
            }).Start();
        }
алгоритма.
Но ошибка все таже. Заданный вектор инициализации не соответствует количеству блоков для этого алгоритма.
Я без понятия что это за ошибка и как ее решать. В принципе алгоритм шифрования вообще мало волнует главное чтобы по ключу без которого расшифровать было бы невозможным.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
07.11.2021, 19:26
Биты и байты это не одно и то же.

Добавлено через 8 минут
Ну и есть классы для генерации ключа по паролю, например
PasswordDeriveBytes
Rfc2898DeriveBytes
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
07.11.2021, 19:56  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Биты и байты это не одно и то же.
Добавлено через 8 минут
Ну и есть классы для генерации ключа по паролю, например
Честно нен особо понял ответа. Мне нужен рабочий способ или решение проблем с этим способом.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
08.11.2021, 03:42
Ну вот вы создали массив на 256 байт, а это 2048 бит...

Да и использовать одно и тоже значение для key и IV не правильно. Там и требуемая длина наверняка отличается.

IV можно вообще не трогать, а задать только ключ. Правда тогда придется значение IV сохранить куда-то, чтобы можно было расшифровать...

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
        public void EncryptArchive(string archiveFile, string encryptedArchiveFile, string password = @"ключ")
        {
            //new Thread(() =>
            //{
            try
            {
                //this.operation = Operation.StartEncryptArchive;
                //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                using (Aes aesCrypto = Aes.Create())
                {
                    byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 
                    using (Rfc2898DeriveBytes keyGen = new Rfc2898DeriveBytes(password, salt))
                    {
                        byte[] key = keyGen.GetBytes(32);
                        byte[] iv = keyGen.GetBytes(16);
 
                        Console.WriteLine($"Key {Convert.ToHexString(key)}");
                        Console.WriteLine($"IV {Convert.ToHexString(iv)}");
 
                        aesCrypto.Key = key;
                        aesCrypto.IV = iv;
                    }
 
                    using (FileStream fsCrypt = new FileStream(encryptedArchiveFile, FileMode.Create))
                    using (CryptoStream cs = new CryptoStream(fsCrypt, aesCrypto.CreateEncryptor(), CryptoStreamMode.Write))
                    using (FileStream fsIn = new FileStream(archiveFile, FileMode.Open))
                    {
                        int read;
                        byte[] buffer = new byte[4096];
                        int written = 0;
                        while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            written += read;
                            cs.Write(buffer, 0, read);
 
                            //this.operation = Operation.ProgressEncryptArchive;
                            //progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(written), MaxValue = Convert.ToDecimal(fsIn.Length) }); ;
                        }
                    }
 
                    //File.Delete(archiveFile);
 
                    //this.operation = Operation.StopEncryptArchive;
                    //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
            }
            catch (Exception ex)
            {
                //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
            }
 
            //}).Start();
        }
 
        public void DecryptArchive(string encryptedArchiveFile, string archiveFile, string password = @"ключ")
        {
            //new Thread(() =>
            //{
            try
            {
                //this.operation = Operation.StartEncryptArchive;
                //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                using (Aes aesCrypto = Aes.Create())
                {
                    byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 
                    using (Rfc2898DeriveBytes keyGen = new Rfc2898DeriveBytes(password, salt))
                    {
                        byte[] key = keyGen.GetBytes(32);
                        byte[] iv = keyGen.GetBytes(16);
 
                        Console.WriteLine($"Key {Convert.ToHexString(key)}");
                        Console.WriteLine($"IV {Convert.ToHexString(iv)}");
 
                        aesCrypto.Key = key;
                        aesCrypto.IV = iv;
                    }
 
                    using (FileStream fsCrypt = new FileStream(encryptedArchiveFile, FileMode.Open))
                    using (CryptoStream cs = new CryptoStream(fsCrypt, aesCrypto.CreateDecryptor(), CryptoStreamMode.Read))
                    using (FileStream fsOut = new FileStream(archiveFile, FileMode.Create))
                    {
                        int read;
                        byte[] buffer = new byte[4096];
                        int written = 0;
                        while ((read = cs.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            written += read;
                            fsOut.Write(buffer, 0, read);
 
                            //this.operation = Operation.ProgressEncryptArchive;
                            //progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(written), MaxValue = Convert.ToDecimal(fsIn.Length) }); ;
                        }
                    }
 
                    //File.Delete(encryptedArchiveFile);
 
                    //this.operation = Operation.StopEncryptArchive;
                    //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
            }
            catch (Exception ex)
            {
                //progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
            }
 
            //}).Start();
        }
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
13.05.2022, 21:45  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Ну вот вы создали массив на 256 байт, а это 2048 бит...
Да и использовать одно и тоже значение для key и IV не правильно. Там и требуемая длина наверняка отличается.
IV можно вообще не трогать, а задать только ключ. Правда тогда придется значение IV сохранить куда-то, чтобы можно было расшифровать...
А можно это значение хранить внутри программы. Мне бы вообще простенький способ шифрования но файлы большого размера.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
21.05.2022, 01:52  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Ну вот вы создали массив на 256 байт, а это 2048 бит...
Да и использовать одно и тоже значение для key и IV не правильно. Там и требуемая длина наверняка отличается.
IV можно вообще не трогать, а задать только ключ. Правда тогда придется значение IV сохранить куда-то, чтобы можно было расшифровать...
Попробовал ваш вариант кода и опять ошибка:
Заполнение неверно и не может быть удалено.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
21.05.2022, 18:07  [ТС]
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
96
97
98
99
100
101
102
103
104
105
106
107
public void EncryptArchive(string archiveFile, string encryptedArchiveFile, string password = @"3302-1107-8890-4470-6645")
        {
            new Thread(() =>
            {
                try
                {
                    this.operation = Operation.StartEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                    using (Aes aesCrypto = Aes.Create())
                    {
                        byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 
                        using (Rfc2898DeriveBytes keyGen = new Rfc2898DeriveBytes(password, salt))
                        {
                            byte[] key = keyGen.GetBytes(32);
                            byte[] iv = keyGen.GetBytes(16);
 
                            File.WriteAllText("KeysEncrypt.log", $"Key {BitConverter.ToString(key)}" + Environment.NewLine + $"IV {BitConverter.ToString(iv)}");
 
                            aesCrypto.Key = key;
                            aesCrypto.IV = iv;
                        }
 
                        using (FileStream fsCrypt = new FileStream(encryptedArchiveFile, FileMode.Create))
                        using (CryptoStream cs = new CryptoStream(fsCrypt, aesCrypto.CreateEncryptor(), CryptoStreamMode.Write))
                        using (FileStream fsIn = new FileStream(archiveFile, FileMode.Open))
                        {
                            int read;
                            byte[] buffer = new byte[4096];
                            int written = 0;
                            while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                written += read;
                                cs.Write(buffer, 0, read);
 
                                this.operation = Operation.ProgressEncryptArchive;
                                progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(written), MaxValue = Convert.ToDecimal(fsIn.Length) }); ;
                            }
                        }
                    }
 
                    File.Delete(archiveFile);
 
                    this.operation = Operation.StopEncryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
                catch (Exception ex)
                {
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
                }
 
            }).Start();
        }
 
        public void DecryptArchive(string encryptedArchiveFile, string archiveFile, string password = @"3302-1107-8890-4470-6645")
        {
            new Thread(() =>
            {
                try
                {
                    this.operation = Operation.StartDecryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
 
                    using (Aes aesCrypto = Aes.Create())
                    {
                        byte[] salt = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
 
                        using (Rfc2898DeriveBytes keyGen = new Rfc2898DeriveBytes(password, salt))
                        {
                            byte[] key = keyGen.GetBytes(32);
                            byte[] iv = keyGen.GetBytes(16);
 
                            File.WriteAllText("KeysDecrypt.log", $"Key {BitConverter.ToString(key)}" + Environment.NewLine + $"IV {BitConverter.ToString(iv)}");
 
                            aesCrypto.Key = key;
                            aesCrypto.IV = iv;
                        }
 
                        using (FileStream fsCrypt = new FileStream(encryptedArchiveFile, FileMode.Open))
                        using (CryptoStream cs = new CryptoStream(fsCrypt, aesCrypto.CreateDecryptor(), CryptoStreamMode.Read))
                        using (FileStream fsOut = new FileStream(archiveFile, FileMode.Create))
                        {
                            int read;
                            byte[] buffer = new byte[4096];
                            int written = 0;
                            while ((read = cs.Read(buffer, 0, buffer.Length)) > 0)
                            {
                                written += read;
                                fsOut.Write(buffer, 0, read);
 
                                this.operation = Operation.ProgressDecryptArchive;
                                progressInfo.Report(new CreatedPackageInfo(this.operation) { Value = Convert.ToDecimal(written), MaxValue = Convert.ToDecimal(cs.Length) }); ;
                            }
                        }
                    }
 
                    this.operation = Operation.StopDecryptArchive;
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = "" });
                }
                catch (Exception ex)
                {
                    progressInfo.Report(new CreatedPackageInfo(this.operation) { ErrorMsg = ex.Message });
                }
 
            }).Start();
        }
Может кто помочь решить проблему с дешифрованием:
Code
1
Заполнение неверно и не может быть удалено.
Я прочитал на одном из форумах что aesCrypto.Padding = PaddingMode.None; может помочь решить ошибку но тогда возникает другая ошибка:
Code
1
Поток не поддерживает поиск.
key и iv я проверял и они одинаковы для шифрования и дешифрования.
0
531 / 180 / 39
Регистрация: 18.08.2012
Сообщений: 907
21.05.2022, 19:24
а разве разработка алгоритмов шифрования не является лицензируемым видом деятельности?
и... если так - то. тему можно удалять
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,891
21.05.2022, 19:51  [ТС]
Цитата Сообщение от untyped Посмотреть сообщение
а разве разработка алгоритмов шифрования не является лицензируемым видом деятельности?
и... если так - то. тему можно удалять
Я вот воббще вас не понял. И как мне это поможет решить ошибку при дешифровании. Я не понимаю в чём проблема. Ключи одинаковые. Ошибок при шифровании не возникает. Но на дешифровки прям сразу:
Заполнение неверно и не может быть удалено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2022, 19:51
Помогаю со студенческими работами здесь

Шифрование/дешифрование файла
Есть программа которая шифрует файлы. Зашифрованный файл имеет расширение ".crypt". В программу подаётся список файлов,содержащий...

Шифрование и дешифрование файла
4. Реализовать в программе шифрование и дешифрацию файла с использованием квадрата Полибия, обеспечив его случ помогите срочно нужно...

Шифрование\дешифрование файла
Помогите пожалуйста сделать прогу, которая шифрует -дешифрует по следующему алгоритму: из файла считывается столько байт, сколько байт...

Шифрование/Дешифрование текстового файла
Здравствуйте! Подскажите пожалуйста, хочу сделать так: открываю свою программу, файл автоматически дешифруется, загружается в listbox, при...

Шифрование и дешифрование wav. файла
Можете помочь, с осуществлением шифрования сигнала, фильтрации частоты, а также дешифрации. Затем нужно перемешать спектры частот сигнала...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru