| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [Си] Зашифровать файл с помощью rc4 |
| Автор: Weman 4.11.2010, 13:34 | ||||||||||||||
Здравствуйте, уважаемые! Прошу помощи. Передо мной стоит такая задача: необходимо с помощью алгоритма RC4 зашифровать некоторый файл (например jpeg-картинка) на языке Си. Нашел в Википедии сам алгоритм (http://en.wikipedia.org/wiki/Rc4), вот его реализация (немного переделанная под себя):
Как я понимаю этот алгоритм - он состоит из 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 6.11.2010, 19:24 | ||
А стандартный Winapi??????
Добавлено через 4 минуты и 18 секунд Ключ генерится с помощью функции winapi любой не подойдет и гугл в помощь ....... |
| Автор: Weman 6.11.2010, 19:59 |
| Спасибо конечно за код, но для меня это очень сложно и даже непонятно что там делается.... :( Да и на языке Си надо. |
| Автор: bass 6.11.2010, 20:13 |
| Что там сложного надеюсь под винду пишешь то это готовые функции зашифровки буфера а потом расшифровки...... Указатеть на буфер и длина буфера.... Ключек я убрал вселедствии использования в своей программе ... Могу сгенерить..... |
| Автор: xvr 8.11.2010, 15:18 | ||
RC4 потоковый чипер (точнее, это генератор гаммы). Не надо брать 10 байтов из него для шифрования картинки, надо брать все:
|