Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17

Написать AES, шифрования любого файла .exe.

22.06.2015, 12:44. Показов 6160. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача написать AES, который будет зашифровывать и расшифровывать любой файл .exe. Как лучше открывать этот файл, если нужно считывать по 16 байт? В моей программе сначала неадекватно работало с переносом на новую строку (после расшифровывался какой-то бред вместо текста), а теперь не работает совсем. Само шифрование/расшифрование написано вроде правильно, было протестировано на строке байтов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.06.2015, 12:44
Ответы с готовыми решениями:

Чтение byte из файла (Программа шифрования и дешифрования AES-128)
Добрый день, реализую программу шифрования и дешифрования AES-128 Весь код уже прописан и всё работает в норме, но хотелось бы...

Алгоритм шифрования из exe файла
Hola amigos! :) На C++ к слову я мало что понимаю и столкнулся с некой необходимостью получить алгоритм шифрования обычного CD-ключа из...

Получить версию любого .exe файла
Привет всем. Давно уже видел в интернете много вопросов на эту тему, поэтому когда мне понадобилось получать версию любого exe файла, я...

20
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.06.2015, 12:52
В бинарном режиме, понятное дело. Приведи код, глянем......
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
22.06.2015, 13:00
Цитата Сообщение от FM_Volna Посмотреть сообщение
В моей программе сначала неадекватно работало с переносом на новую строку (после расшифровывался какой-то бред вместо текста),
как это стыкуется с этим
Цитата Сообщение от FM_Volna Посмотреть сообщение
любой файл .exe.
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 13:43  [ТС]
Просто изначально программу сказали написать для текстовых файлов, поэтому тесты проходили на текстовых файлах. Но оно даже txt не шифрует нормально
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.06.2015, 13:52
Цитата Сообщение от FM_Volna Посмотреть сообщение
для текстовых файлов, поэтому тесты проходили на текстовых файлах
Текстовый файл отличается от бинарного только в способе отображения данных.
Если бы AES изначально работал для случая бинарных файлов, то и с текстами он бы справлялся на ура и не было бы проблемы с переносами строки.
Так что тебе нужно:
1) Открывать файлы в бинарном виде.
2) Читать и писать при помощи методов read() write() для fstream, или fread() и fwrite() для случая сишного FILE *.

Добавлено через 2 минуты
Цитата Сообщение от FM_Volna Посмотреть сообщение
было протестировано на строке байтов.
Строка байт - это вообще что в твоем понимании?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.06.2015, 13:57
Цитата Сообщение от FM_Volna Посмотреть сообщение
Но оно даже txt не шифрует нормально
Оно - это что?
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 14:02  [ТС]
Оно - шифрование.
Не строка, а массив байтов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int j = 0; j < h; j++){
        
        fstream f;
        char c[17], c1[17];
        f.open("1.txt", ios::in | ios::out | ios::binary);
        f.seekg((16*j), ios_base::beg);
        f.getline(c1, sizeof(c1));
        byte stat2[N][N];
        for (int i = 0; i < N*N; i++){
            if (i <= 3)stat2[0][i % 4] = (byte)c1[i];
            if (i>3 && i <= 7)stat2[1][i % 4] = (byte)c1[i];
            if (i>7 && i <= 11) stat2[2][i % 4] = (byte)c1[i];
            if (i>11 && i <= 15) stat2[3][i % 4] = (byte)c1[i];
        }
        Cipher(stat2, key, Sbox, RKey, End, ShRows, MixCol);
        for (int i = 0; i < N; i++){
            for (int j = 0; j < N; j++)
        
                f<< End[i][j];
 
        }
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.06.2015, 14:06
Цитата Сообщение от FM_Volna Посмотреть сообщение
Но оно даже txt не шифрует нормально
Оно даже проблему описать толком не может.
Что это за херня в виде набора символов? Я даже не буду спрашивать что такое Cipher.
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 14:11  [ТС]
Cipher просто функция шифрования. На вход подаётся двухмерный массив из байтов, поэтому сначала из c1 распихиваем значения в массив.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
22.06.2015, 14:22
- У тебя что болит, голова?
- Нет.
- Рука?
- Нет.
- Лоб?
- Нет.
- А что болит?
- Отэц.
Я понял ход твоих мыслей, если он вообще существует...
1
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 16:28  [ТС]
Я открываю любой файл, например, так
C++
1
ifstream fin1("wmplayer.exe", ios::binary);
Или так (у меня есть оба варианта)
C++
1
2
std::string full_path = "wmplayer.exe";
        ifstream fff(full_path.c_str(),  ios::binary);
Мне нужно считывать из него каждый раз по 16 байт (не по 8, пардон) и записывать в другой. Я это делаю с помощью всё тех же read и write. Потом всё это заношу в двухмерный массив и шифрую (так как шифрование работает именно с таким массивом в моём случае). Как я понимаю, txt и exe в бинарном режиме это одна и та же фигня, то есть открываешь текстовый в бинарном, шифруешь и закрываешь. С exe то же самое ведь по сути? Так что, как понимаю, можно тестировать программу и на txt для удобства. И вопрос в основном вот в чем: изначально кодировка txt была ASCII, и шифровалось всё хорошо до второго знака переноса строки. С exe такое пройдёт? Мне вроде говорили, что там кодировка юникод, и там нужно считывать как-то иначе
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
22.06.2015, 17:18
Цитата Сообщение от FM_Volna Посмотреть сообщение
С exe такое пройдёт? Мне вроде говорили, что там кодировка юникод, и там нужно считывать как-то иначе
там вообще никакой кодировки, случайное расположение байт от 0 до 255, ну это если не брать заголовки, у заголовков хот какая то структура есть
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 17:30  [ТС]
ValeryS, спасибо)
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.06.2015, 21:42
Цитата Сообщение от FM_Volna Посмотреть сообщение
char c[17], c1[17];
Почему именно 17?
Цитата Сообщение от FM_Volna Посмотреть сообщение
Я это делаю с помощью всё тех же read и write.
Цитата Сообщение от FM_Volna Посмотреть сообщение
f.getline(c1, sizeof(c1));
Это относится к read или write?
Эта функция прочитает максимум 17 символов, до первого перевода строки.
Не стоит говорить, что после кодирования этого перевода строки уже не будет.
И условно существующий ваш декодер будет декодировать нечто не то.

Строки 10-13:
Это что за шаманство такое?
stat2[i / N][i % N] = (byte)c1[i];
Стоит учесть, что из файла может прочитать меньше, чем 16 байт.
Тогда в массиве stat2 будет лежать непонятный хлам.
Цитата Сообщение от FM_Volna Посмотреть сообщение
f<< End[i][j];
Записывая результат в тот же файл, из которого читаете данные, добавляет вам только больше проблем.
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 22:18  [ТС]
Да, ошибка, должно быть не 17, а 16 (изначально так и было сделано, но считывало из текстовых файлов на один символ меньше, поэтому 17). И в stat2 будут лежать считанные байты, которые после идут на вход в функцию шифрования. Вот этот код работает нормально, зашифровывает, а аналогичный расшифровывает. h это размер в байтах файла, который нужно зашифровать. P.S. Код кривой, но умею писать только так
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
ofstream f("11.exe", ios::binary| ios::trunc); //файл для записи зашифрованного
    for (int j = 0; j < h; j++){
        std::string full_path = "wmplayer.exe";
        ifstream fff(full_path.c_str(),  ios::binary);
        char c[16], c1[16];
        byte stat2[N][N];
        if (!fff.is_open()){
            printf("Файл не найден");
            return 0;
        }
        fff.seekg((16*j), ios_base::beg); //чтение с определенного места
        
        if (j < h){
        fff.read(c1, sizeof(c1));
        for (int i = 0; i < N*N; i++){ //запись в массив
            if (i <= 3)stat2[0][i % 4] = (byte)c1[i];
            if (i>3 && i <= 7)stat2[1][i % 4] = (byte)c1[i];
            if (i>7 && i <= 11) stat2[2][i % 4] = (byte)c1[i];
            if (i>11 && i <= 15) stat2[3][i % 4] = (byte)c1[i];
        }
        }
        if (j == (h-1) ){
            fff.read(c, g1+1);
            int h = 0;
            for (int i = 0; i < N*N; i++){
                if (i<(N*N-g1-1))stat2[i/4][i % 4] =(byte)'0'; //заполнение нулями остатка до 16 байт
                else { stat2[i / 4][i % 4] = (byte)c[h]; h++; }
            }
        }
 
        Cipher(stat2, key, Sbox, RKey, End, ShRows, MixCol); 
        char * memblock;
        memblock = new char[16];
        int h = 0;
        for (int e = 0; e < N; e++){
            for (int e1 = 0; e1 < N; e1++){
            memblock[h]= End[e][e1];
            h++;
            }   
        }
        
        
        f.write(memblock,16); //запись в файл зашифрованных блоков    
    fff.close();
    }
 
    f.close();
    printf("\n Файл зашифрован");
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.06.2015, 23:04
Цитата Сообщение от FM_Volna Посмотреть сообщение
но считывало из текстовых файлов на один символ меньше, поэтому 17
Потому что при считывании строки один байт всегда отводится на символ конца строки '\0'.
Цитата Сообщение от FM_Volna Посмотреть сообщение
memblock = new char[16];
Утечка памяти.
Цитата Сообщение от FM_Volna Посмотреть сообщение
stat2[i/4][i % 4] =(byte)'0';
Это не заполнение нулями, а скорее заполнение массива байт 48-ками.
И такой подход приведет к тому, что размер расшифрованного файла будет отличаться от изначального.

Не по теме:

Цитата Сообщение от FM_Volna Посмотреть сообщение
Код кривой, но умею писать только так
Это не повод писать кривой код.

0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
22.06.2015, 23:54  [ТС]
В смысле, утечка памяти?
Он там заполняет не нулями, я понимаю, но это в принципе ничего не меняет. Тут же существует проблема последнего блока текста (если количество байт не делится на 16). Вот последний блок заполняется этими 48 сначала, а потом идут байты из файла exe. Там в любом случае последний блок нужно чем-то дозаполнять, в моём случае это такое число. При расшифровании эта куча 48-ок всё равно отбрасывается.
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.06.2015, 00:06
Цитата Сообщение от FM_Volna Посмотреть сообщение
В смысле, утечка памяти?
Память выделяется, но не освобождается.
Цитата Сообщение от FM_Volna Посмотреть сообщение
При расшифровании эта куча 48-ок всё равно отбрасывается.
Как определяется сколько символов нужно отбросить?
Не стоит исключать, что в конце файла могут быть свои 48-ки.
Тут либо нужно данные шифровать вместе с их размером, либо вводить стоп-символы.
0
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 17
23.06.2015, 00:42  [ТС]
Изначальное количество байт у нас есть, берем по модулю 16 = остаток, который нам нужен. Остальное откидываем. Разве нет?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
23.06.2015, 01:02
Цитата Сообщение от FM_Volna Посмотреть сообщение
Изначальное количество байт у нас есть
Все же предполагается,
что дешифровку можно выполнить, имея на руках только сам зашифрованный файл и ключ.
Так что хорошая реализация подразумевает два модуля.
Первый с помощью ключа шифрует файл, второй с помощью этого же ключа дешифрует ранее зашифрованный файл. И работать они должны независимо друг от друга.
Частой проверкой работы алгоритма является внесение ручных изменений в зашифрованный файл и проверка того, что получается при дешировке. Если при приеме у вас не так, то можно ничего больше не делать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2015, 01:02
Помогаю со студенческими работами здесь

Алгоритм шифрования AES
Всем доброго времени суток! Господа, прошу помочь определиться с тем как более правильно использовать алгоритм AES для лицензирования...

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

Алгоритм шифрования AES-128
Здравствуйте программисты!!! :) Подскажите пожалуйста, или покажите какой-то пример реализации алгоритма шифрования AES-128. Слышал что...

Получение ключа для AES шифрования из строки
Здравствуйте, есть строка в формате string, имеющая 32 символа (хеш md5). Нужно эту строку преобразовать в byte 128bit, для использования в...

Ошибка при открытии любого приложения вследствие удаления файла StormII.exe
Антивирус обнаружил процесс StormII.exe и удалили его. Из за него невероятно тормозил компьютер,но после его удаления при попытке открыть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru