Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
 Аватар для Нейлирлин
1 / 1 / 0
Регистрация: 15.05.2016
Сообщений: 14

Дешифрование файла

12.05.2017, 18:52. Показов 2745. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток))
Уже несколько дней сижу над одной задачей: необходимо зашифровать файл и, соответственно, его дешифровать. Для реализации этой задачи решила попробовать два алгоритма: RSA (асимметричное шифрование) и Rijndael (симметричное). Реализацию задания было решено выполнить в windows forms, а методы encryption и decryption выделены в отдельный класс (собственно, тогда и начались проблемы. когда было все вместе - все работало). Так вот... На данный момент, шифрование файла выполняется, а дешифрация - нет. При выполнении программы появилась ошибка System.NullReferenceException, а в моих неуклюжих попытках это исправить появляется другая ошибка - System.Security.Cryptography.Cryptograph icException...
Помогите, пожалуйста((((((

Код метода для дешифрования:
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
 public void DecryptFile(string inFile)
        {
            //создаем экземпляр Rijndael для симметричного дешифрования данных.
            RijndaelManaged rjndl = new RijndaelManaged();
            rjndl.KeySize = 256;
            rjndl.BlockSize = 256;
            rjndl.Mode = CipherMode.CBC;
 
            //создайте байт-массивы, чтобы получить длину зашифрованного ключа и IV.
            //эти значения были сохранены как 4 байта в начале зашифрованного пакета.
            byte[] LenK = new byte[4];
            byte[] LenIV = new byte[4];
 
            //создайте имя файла для зашифрованного файла.
            string outFile = DecrFolder_cl + inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt";
 
            //используйте объекты FileStream для чтения зашифрованного файла (inFs) и сохранения расшифрованного файла (outFs).
            using (FileStream inFs = new FileStream(EncrFolder_cl + inFile, FileMode.Open))
            {
                inFs.Seek(0, SeekOrigin.Begin);
                inFs.Seek(0, SeekOrigin.Begin);
                inFs.Read(LenK, 0, 3);
                inFs.Seek(4, SeekOrigin.Begin);
                inFs.Read(LenIV, 0, 3);
 
                //преобразует длины в целочисленные значения.
                int lenK = BitConverter.ToInt32(LenK, 0);
                int lenIV = BitConverter.ToInt32(LenIV, 0);
 
                int startC = lenK + lenIV + 8; //начальная позиция зашифрованного текста
                int lenC = (int)inFs.Length - startC; //его длину
 
                //создание байтовых массивов для зашифрованного ключа Rijndael, IV и шифрованного текста
                byte[] KeyEncrypted = new byte[lenK];
                byte[] IV = new byte[lenIV];
 
                //извлечение ключа и IV, начиная с индекса 8, после значения длины.
                inFs.Seek(8, SeekOrigin.Begin);
                inFs.Read(KeyEncrypted, 0, lenK);
                inFs.Seek(8 + lenK, SeekOrigin.Begin);
                inFs.Read(IV, 0, lenIV);
                Directory.CreateDirectory(DecrFolder_cl);
                //использование RSACryptoServiceProvider для дешифрования ключа Rijndael
                //rsa = new RSACryptoServiceProvider(cspp);
                //RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
                byte[] KeyDecrypted = rsa.Decrypt(KeyEncrypted, false);
                //ключ расшифрования
                ICryptoTransform transform = rjndl.CreateDecryptor(KeyDecrypted, IV);
 
                //расшифровать шифрованный текст из FileSteam зашифрованного файла (inFs) в FileStream для расшифрованного файла (outFs).
                using (FileStream outFs = new FileStream(outFile, FileMode.Create))
                {
                    int count = 0;
                    int offset = 0;
 
                    //blockSizeBytes может быть любого произвольного размера
                    int blockSizeBytes = rjndl.BlockSize / 8;
                    byte[] data = new byte[blockSizeBytes];
 
                    //дешифрование с начала зашиврованного текста
                    inFs.Seek(startC, SeekOrigin.Begin);
                    using (CryptoStream outStreamDecrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
                    {
                        do
                        {
                            count = inFs.Read(data, 0, blockSizeBytes);
                            offset += count;
                            outStreamDecrypted.Write(data, 0, count);
                        }
                        while (count > 0);
 
                        outStreamDecrypted.FlushFinalBlock();
                        outStreamDecrypted.Close();
                    }
                    outFs.Close();
                }
                inFs.Close();
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2017, 18:52
Ответы с готовыми решениями:

Открытие файла и его последующее шифрование/дешифрование (алгоритм DES)
После открытия файла в textbox английские слова шифруются, а русские - нет. Как это можно исправить? И как исправить то, что некоторая...

Дешифрование Цезаря
Всем привет) Помогите написать дешифратор Шифра цезаря. Буду очень благодарен C# using System.Collections.Generic; using...

Дешифрование DES
Здравствуйте, пишу программку для шифрования/дешифрирования DES Во время дешифрования получается исключительная ситуация: ...

4
18 / 18 / 8
Регистрация: 11.01.2016
Сообщений: 54
12.05.2017, 21:56
Честно говоря, влом на код смотреть - тяпница же, да и с телефона. И до компа до начала рабочей недели врядли доберусь. Так что, ежель по срокам не горит - могу, как доберусь до цивилизации, свой старенький класс для шифровки/дешифровки скинуть. Там как раз вроде aes у меня и юзался. Только он у меня был под массив байтов - сами работу с файлами допилите же?
0
 Аватар для Нейлирлин
1 / 1 / 0
Регистрация: 15.05.2016
Сообщений: 14
12.05.2017, 22:05  [ТС]
Да, будет просто замечательно)) Спасибо))
0
18 / 18 / 8
Регистрация: 11.01.2016
Сообщений: 54
15.05.2017, 10:37
Как обещал:
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
    class Crypto
    {
 
        public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes, byte[] saltBytes)
        {
            byte[] encryptedBytes = null;
            if (saltBytes == null)
            {
                saltBytes = new byte[] { 101, 111, 67, 85, 13, 1, 217, 99 };
            }
            if (passwordBytes == null)
            {
                SHA256 mySHA256 = SHA256Managed.Create();
                passwordBytes = mySHA256.ComputeHash(Utils.Converting.GetBytes("Сорок тысяч обезьян с жопой что-то там того"));
            }
            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;
 
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);
 
                    AES.Mode = CipherMode.CBC;
                    AES.Padding = PaddingMode.PKCS7;
                    using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                    }
                    encryptedBytes = ms.ToArray();
                }
            }
 
            return encryptedBytes;
        }
 
        public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes, byte[] saltBytes)
        {
            byte[] decryptedBytes = null;
 
            if (saltBytes == null)
            {
                saltBytes = new byte[] { 101, 111, 67, 85, 13, 1, 217, 99 };
            }
 
            if (passwordBytes == null)
            {
                SHA256 mySHA256 = SHA256Managed.Create();
                passwordBytes = mySHA256.ComputeHash(Utils.Converting.GetBytes("Сорок тысяч обезьян с жопой что-то там того"));
            }
            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;
 
                    var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);
 
                    AES.Mode = CipherMode.CBC;
                    AES.Padding = PaddingMode.PKCS7;
                    try
                    {
                        using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                        }
                        decryptedBytes = ms.ToArray();
                        return decryptedBytes;
                    }
                    catch
                    {
                        return null;
                    }
 
                }
            }
        }
    }
Не забудьте подключить:
C#
1
2
using System.IO;
using System.Security.Cryptography;
И да, забыл добавить - перевод строки в byte[] и обратно:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        public static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }
 
        public static string GetString(byte[] bytes)
        {
            char[] chars = new char[bytes.Length / sizeof(char)];
            System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
            return new string(chars);
        }
1
 Аватар для Нейлирлин
1 / 1 / 0
Регистрация: 15.05.2016
Сообщений: 14
15.05.2017, 21:31  [ТС]
Спасибо огромное)) Буду разбираться))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.05.2017, 21:31
Помогаю со студенческими работами здесь

Шифрование и дешифрование файлов
Как реализовать шифрование и дешифрования файлов на C#, пример: У меня есть 2 кнопки, и одно поле для ввода путь к фалу, при нажатии на...

Шифр Хилла, дешифрование
Помогите пожалуйста с шифром Хилла. Использую алфавит из 29 символов. Шифрует верно, я проверяла, а вот дешифрует... Вот код того, что я...

Аффинный шифр (шифрование и дешифрование)
Ребята, помогите мне в написании кода программы шифрования и дешифрования аффинного шифра, прошу. Я в Шарпе не шарю, а надо.. От этого...

Шифрование и дешифрование теста (AES128) без встроенных классов
Может у кого-то есть уже готовая прога. Нужно зашифровать и потом расшифровать текстовый документ (~1mb) не используя встроенных в c#...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru