![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Weman |
|
||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.11.2005 Где: Санкт-Петрбург Репутация: нет Всего: нет |
Здравствуйте, уважаемые! Прошу помощи. Передо мной стоит такая задача: необходимо с помощью алгоритма RC4 зашифровать некоторый файл (например jpeg-картинка) на языке Си. Нашел в Википедии сам алгоритм (здесь), вот его реализация (немного переделанная под себя):
Как я понимаю этот алгоритм - он состоит из 2х частей: 1. Создание ключа. Берется некое выражение, по которому будет создаваться ключ (в этом примере это выражение unsigned char key[] = "Secret";), считается его длина (6 символов) и передается в функцию rc4_init(key, 6);. В функции rc4_init происходит первоначальная инициализация массива 0..255 значениями от 0 до 255 и после происходит перемешивание этих значений в соответствии с входным выражением. Получаем массив символов, перемешанный неким образом. 2. Получение некоего выражения какой-то длины (в этом примере длины 10 - output_length = 10;), которое будет использоваться для шифрования исходного текста. В этом примере это зашифрованное выражение просто выводится на экран по-символьно с помощью цикла
В общих чертах все примерно понятно как работает, но вернемся к моей задаче. Мне необходимо реализовать программу следующим способом. У программы будут два входных файла - 1. Файл для шифрования (jpeg-картинка). 2. Секретный ключ-выражение (если я все правильно понял, то это аналог вот этой строки unsigned char key[] = "Secret";). и будет один выходной файл - это результат работы программы - зашифрованная с помощью алгоритма rc4 картинка. Теперь что я делаю: 1. Определяю константы с входными и выходными файлами
2. Открываем файлы для чтения (файл с секретным ключом читаем как текстовый, а файлы с картинкой и выходной файл как бинарный, так необходимо читать побайтово).
3.Читаем из файла с секретом секретное слово и вычисляем его длину:
4. Потом происходит инициализация массива и перемешивание в соответствии с секретным выражением. В функцию передаем наше слово и его длину:
5. Ну и теперь заключительный подготовительный этап. Необходимо получить некую последовательность, которая потом будет с помощью операции XOR (исключающее ИЛИ) складываться с исходной jpeg-картинкой и будет получаться зашифрованный поток по алгоритму rc4. Делаю так:
Получаю я вот эту строку, длинной 10 символов. И теперь мне надо как-то ее использовать, чтобы закодировать исходную последовательность. ВОПРОС: Если я исходный jpeg-файл буду читать побайтово, и для шифрования использоваться операцию XOR (исключающее ИЛИ), то как мне считанный байт складывать со строкой и что у меня должно получиться на выходе и что я в итоге должен буду записать в зашифрованный файл? Или может надо читать блоками по 256 байт и их обрабатывать и потом читать еще 256 и так далее... Подскажите пожалуйста. Или может я неправильно понимаю принцип работы алгоритма и дальнейшего шифрования?... P.S.:извините что так длинно получилось, но по другому не смог объяснить... --------------------
|
||||||||||||||
|
|||||||||||||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: нет Всего: 2 |
А стандартный Winapi??????
Добавлено через 4 минуты и 18 секунд Ключ генерится с помощью функции winapi любой не подойдет и гугл в помощь ....... |
|||
|
||||
Weman |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 133 Регистрация: 29.11.2005 Где: Санкт-Петрбург Репутация: нет Всего: нет |
Спасибо конечно за код, но для меня это очень сложно и даже непонятно что там делается.... :( Да и на языке Си надо.
--------------------
|
|||
|
||||
bass |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 315 Регистрация: 5.8.2007 Репутация: нет Всего: 2 |
Что там сложного надеюсь под винду пишешь то это готовые функции зашифровки буфера а потом расшифровки...... Указатеть на буфер и длина буфера.... Ключек я убрал вселедствии использования в своей программе ... Могу сгенерить.....
|
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
RC4 потоковый чипер (точнее, это генератор гаммы). Не надо брать 10 байтов из него для шифрования картинки, надо брать все:
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |