Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 4

Шифрование нетекстовых данных AES

23.01.2015, 16:34. Показов 2483. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую вспех форумчан!

Я не программист, но возникла необходимость реализовать шифрование AES для американской налоговой.

Написал/натырил вот такой вот код:

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
        private byte [] EncryptFiles()
        {
                string Keyfolder = getFolder(this.textBox1.Text);
                byte[] encrypted = {};
                string signedFile = Keyfolder + "[SenderGIIN]_Payload.zip";
                if (File.Exists(signedFile))
                {
                    string original = File.ReadAllText(signedFile);
                    using (AesManaged myAes = new AesManaged())
                    {
                        myAes.KeySize = 256;
                        myAes.Mode = CipherMode.ECB;
                        myAes.BlockSize = 128;
                        string ivstring = "00000000";
                        myAes.GenerateKey();
                        byte[] byteIV = System.Text.Encoding.Unicode.GetBytes(ivstring);
                        myAes.IV = byteIV;
                        File.WriteAllBytes(Keyfolder + "AesKey", myAes.Key);
                        string TextKey = File.ReadAllText(Keyfolder + "AesKey");
                        encrypted = EncryptStringToBytes_Aes(original, myAes.Key, myAes.IV, Keyfolder);
                        File.WriteAllBytes(Keyfolder + "[SenderGIIN]_Payload", encrypted);
                    }
                }
                return encrypted;
        }
 
        static byte[] EncryptStringToBytes_Aes(string plainText, byte[] Key, byte[] IV, string KeyfolderPub)
        {
            byte[] encrypted;
            string Keyfolder = KeyfolderPub;
            using (AesManaged aesAlg = new AesManaged())
            {
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
 
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
 
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                        File.WriteAllBytes(Keyfolder + "[SenderGIIN]_Payload", encrypted);
                    }
                }
            }
            return encrypted;
 
        }
 
       private void DecryptStringFromBytes_Aes(byte[] cipherText)
        {
            try
            {
                string Keyfolder = getFolder(this.textBox1.Text);
                using (AesManaged aesAlg = new AesManaged())
                {
                    aesAlg.IV = System.Text.Encoding.Unicode.GetBytes("00000000");
                    aesAlg.Key = File.ReadAllBytes(Keyfolder + "AesKey");
 
                    ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
 
                    string sOutputFilename = Keyfolder + "[SenderGIIN]_Payload_decrypted.zip";
                    using (MemoryStream msDecrypt = new MemoryStream(cipherText))
                    {
                        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                            {
                                string plaintext = srDecrypt.ReadToEnd();
                                File.WriteAllText(sOutputFilename, plaintext);
                            }
 
                        }
                    }
 
 
 
                }
            }
            catch (Exception e)
            {
                this.textBox3.Text = e.Message;
            }
        }
Вызов соответственно:
DecryptStringFromBytes_Aes(EncryptFiles( ));
Сделал так специально, чтобы исключить ошибку при записи файла на диск и работать непосредственно с зашифрованными байтами. Увы, не помогло.

И вот если данные текстовые, то все проходит на ура, но с зип архивом все существенно грустнее - в расшифрованном файле все нетекстовые символы портятся, при том что все текстовые остаются правильными.
куда можно копать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2015, 16:34
Ответы с готовыми решениями:

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

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

AES шифрование. Заполнение неверно и не может быть удалено
На строке cs.Close(); возникает ошибка: Заполнение неверно и не может быть удалено. Что делать? using System; using...

6
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17899 / 13995 / 5345
Регистрация: 17.03.2014
Сообщений: 28,654
Записей в блоге: 1
23.01.2015, 17:48
jazzmz, бинарный файл нельзя читать и записывать как текст. Вместо ReadAllText/WriteAllText следовало использовать ReadAllBytes/WriteAllBytes. Еще лучше воспользоваться методом Stream.CopyTo (если у тебя .NT 4 и выше). Я бы написал методы так:
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
private void EncryptFile(string sourcePath, string targetPath, byte[] key, byte[] iv)
{
    if (!File.Exists(sourcePath))
    {
        //throw new FileNotFoundException("Source file does not exists", sourcePath);
        return;
    }
    
    using (AesManaged aesAlg = new AesManaged())
    {
        aesAlg.IV = iv;
        aesAlg.Key = key;
        using (FileStream sourceStream = File.OpenRead(sourcePath))
        using (FileStream targetStream = File.OpenWrite(targetPath))
        using (CryptoStream csEncrypt = new CryptoStream(targetStream, aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Write))
        {
            sourceStream.CopyTo(csEncrypt);
        }
    }
}
 
private void DecryptFile(string sourcePath, string targetPath, byte[] key, byte[] iv)
{
    if (!File.Exists(sourcePath))
    {
        //throw new FileNotFoundException("Source file does not exists", sourcePath);
        return;
    }
    
    using (AesManaged aesAlg = new AesManaged())
    {
        aesAlg.IV = iv;
        aesAlg.Key = key;
        using (FileStream sourceStream = File.OpenRead(sourcePath))
        using (CryptoStream csEncrypt = new CryptoStream(sourceStream, aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV), CryptoStreamMode.Read))
        using (FileStream targetStream = File.OpenWrite(targetPath))
        {
            csEncrypt.CopyTo(targetStream);
        }
    }
}
P.S. Что делает метод getFolder()? Если возвращает имя папки из полного пути, то для этого уже есть System.IO.Path.GetDirectoryName()
1
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 4
23.01.2015, 20:52  [ТС]
Ой точняк, ЗИП читаю как строку, блин. Тестил то на строках и забыл поменять.
Если честно, увы, не очень понимаю до конца место, где идет работа со Stream Видимо все же придется глубоко погружаться.
Метод getFolder() получает имя папки для выбранного на отправку в налоговую файла (соответственно и все файлы валятся туда же, их очень много, т.к. там довольно обширные требования у налоговой и пришлось написать очень много разных обработчиков)

Добавлено через 13 минут
Спасибо огромное за подсказку!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17899 / 13995 / 5345
Регистрация: 17.03.2014
Сообщений: 28,654
Записей в блоге: 1
23.01.2015, 21:23
Цитата Сообщение от jazzmz Посмотреть сообщение
Если честно, увы, не очень понимаю до конца место, где идет работа со Stream
Там же всё прямолинейно. При шифровании открываем входной файл на чтение, выходной на запись. Для самой операции шифрования создаем CryptoStream "вокруг" потока для выходного файла. Затем одним вызовом sourceStream.CopyTo(csEncrypt) копируем данные из входного файла через CryptoStream - выполняя шифрование - в выходной файл. При дешифровании делается то же самое с поправкой на порядок создания потоков. Вокруг входного потока создаем CryptoStream в режиме дешифрования и копируем данные из него в выходной поток. Единственная неясность которая тут может возникнуть это взаимосвязь трех потоков. Чтобы её понять не надо глубоко вникать в потоки. Надо просто внимательно прочитать код.

Цитата Сообщение от jazzmz Посмотреть сообщение
Метод getFolder() получает имя папки для выбранного на отправку в налоговую файла
Повторю совет. Не изобретай велосипед, а используй методы класса Path.
1
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 4
23.01.2015, 22:29  [ТС]
А что физически представляет собой этот поток?
Про класс Path учту, спасибо!
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
17899 / 13995 / 5345
Регистрация: 17.03.2014
Сообщений: 28,654
Записей в блоге: 1
23.01.2015, 23:17
jazzmz, поток это источник бинарных данных с поддержкой чтения/записи. Также можно сказать что поток это класс-наследник System.IO.Stream. Физическое воплощение потока зависит от конкретного потока: FileStream - файл на диске, MemoryStream - массив в памяти, NetworkStream - данные получаемые по сети. Некоторые потоки являются так сказать вспомогательными. В том смысле что они применяются вместе с другими потоками, а не сами по себе. Например, CryptoStream (шифрование/дешифрование) или GZipStream (архивация/деархивация).
1
0 / 0 / 0
Регистрация: 23.01.2015
Сообщений: 4
26.01.2015, 10:42  [ТС]
Еще раз спасибо огромное, помогло!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.01.2015, 10:42
Помогаю со студенческими работами здесь

Шифрование данных.
Мне нужно шифровать содержание файла и пересылать его по email. а там расшифровывать по определенному ключу, например какое нить число типа...

Шифрование данных
Здравствуйте! Разрабатывается приложение, которое 'общается' по сети. Есть ли в С# какие-либо классы для шифрования данных, чтоб защитить...

Шифрование базы данных
Есть локальная бд на SQL Server 2012. Нужно зашифровать данные в нем. Я читал что SQL Server сам хранит данные в зашифрованном виде....

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Списки и кортежи в Python: различия, особенности, применение
py-thonny 13.04.2025
Python славится своей гибкостью при работе с данными. В арсенале языка есть две основные последовательные структуры данных, которые программисты используют ежедневно — списки и кортежи. Эти структуры. . .
Middleware в ASP.NET Core
UnmanagedCoder 13.04.2025
В ASP. NET Core термин "middleware" занимает особое место. Что же это такое? Middleware представляет собой программные компоненты, которые формируют конвейер обработки HTTP-запросов в приложении. . . .
Таблицы лута в Unity с MinMaxCurve и AnimationCurve
GameUnited 12.04.2025
Создание сбалансированного лута в играх — задача не из простых. Разработчики постоянно ищут способы настройки систем выпадения предметов, которые будут одновременно справедливыми для игроков и. . .
std::expected в C++: Управление ошибками
bytestream 12.04.2025
Обработка ошибок всегда была важной и одновременно сложной задачей в программировании на C++. На протяжении долгого времени разработчики использовали различные подходы: возвращаемые коды ошибок,. . .
Nullable типы и операторы объединения null в C#
UnmanagedCoder 12.04.2025
Многие шутят, что null — это миллиардная ошибка в программировании. И в этой шутке только доля шутки. Тони Хоар, создатель null-ссылки, сам назвал её своей "ошибкой на миллиард долларов". Почему?. . .
Аутентификация и авторизация JWT в микросервисах с API Gateway
stackOverflow 12.04.2025
В традиционных монолитных приложениях безопасность часто реализуется как единый защитный периметр - пользователь проходит аутентификацию один раз, после чего получает доступ ко всем функциям системы. . . .
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер