начало здесь: ссылка1 ссылка2
Давненько я не брал в руки шашек.
Решил немного доработать (в плане ловли ошибок) свою небольшую утилиту
для шифрования и выложить для скачивания. Я вообще-то непрофессиональный
программист и редко этим занимаюсь, если чо.
Ссылка для скачивания: link
Обязательно читать readme.txt сначала.
Здесь его дублирую:
------------------------
encipher - утилита для шифровки/дешифровки файлов простейшим способом
с использованием ключа длиной, равной длине файла.
Предысторию можете прочитать тут:
http://xaliavschik.livejournal.com/306464.html
http://xaliavschik.livejournal.com/308359.html?thread=1174663#t1174663
Я не верю в "фирменные" алгоритмы шифрования. Бывает их взламывают,
бывает что специально спецслужбы оставляют "лючки" для взлома. Вообще,
если почитать математическое описание, всё это ужасно запутанно
и непонятно. А я в ответственных случаях принципиально не пользуюсь
вещами, которые мне непонятны.
Поэтому свой простой алгоритм разжую здесь подробно, чтобы было понятно
даже детям. На самом деле, алгоритм не мой и придуман давно, но я своим
умом изобрел этот велосипед. :-) Вот ссылка для примера:
http://axofiber.no-ip.org/inside/xor.ciphering.htm
Итак, начнём с разъяснения, что такое операция xor - "исключающее ИЛИ".
Это битовая операция, производится над нулями и единицами. Вот таблица:
0 xor 0 -> 0
0 xor 1 -> 1
1 xor 0 -> 1
1 xor 1 -> 0
В нашем случае она будет выполняться побитово над целыми байтами,
например:
10011001
xor
00101011
||
10110010 (результат)
У этой операции есть одна интересная особенность, если дважды применить
её к одному и тому же байту, то в результате получим первоначальное
значение:
1. A xor B -> C
2. C xor B -> A (получаем первоначальное значение)
Это собственно и есть описание алгоритма шифрования для одного байта.
A - исходное сообщение
B - ключ
С - зашифрованное сообщение
шаг 1 - шифрование
шаг 2 - дешифровка
В нашем случае сообщение конечно длиннее одного байта, а ключ равен
длине сообщения. Описанная операция производится последовательно со
всеми байтами сообщения и ключа (первый с первым, второй со вторым,
третий с третьим и т.д.)
Наилучшие результаты в плане криптостойкости будут, если ключ состоит
из случайной последовательности байтов. Представьте, что бросаете
в воздух монету и последовательно записываете цепочку результатов
(нулей или единиц, в зависимости от того, на какую сторону упала монета)
- вот это будет хороший ключ. Но реально конечно этим никто не станет
заниматься. Можно использовать программный генератор случайных чисел
для генерации ключа, но это плохой вариант - обычно у него
последовательность совсем не случайная. Лучше всего для ключа
использовать кусок из большого архивного файла: rar или zip. Причем
брать этот кусок нужно не из начала (там идут заранее известные
сигнатуры, названия файлов в архиве и т.д.). Сжатые данные в файле
rar/zip выглядят как случайная последовательность, и восстановить
какую-то информацию по такому вырезанному куску совершенно невозможно.
Если сделать операцию xor между текстом и случайной последовательностью
байтов (ключом), то на выходе получим также случайную последовательность
(по виду) и никто никаким образом не сможет вытащить оттуда первоначальную
информацию, не зная ключа. Однако для надёжности и большей криптостойкости
необходимо и сам исходный файл заархивировать в rar или zip, перед тем
как его шифровать.
Итак, пересылка секретной информации выглядит следующим образом.
У отправителя и получателя имеется ключ, никто кроме них не знает этого
ключа. Отправитель шифрует файл этим ключом и отправляет получателю.
Если зашифрованное сообщение перехватывает кто-то посторонний, то он никак,
никаким сверхмощным суперкомпьютером не сможет его расшифровать, если
не знает ключ. Получатель же с помощью ключа легко и просто его
расшифрует. Всё.
Теперь конкретно об утилите encipher и её использовании.
Эта утилита запускается в командной строке и исходник encipher.c может
быть скомпилирован практически везде. Я добавил в архив уже
скомпилированный исполняемый файл encipher.exe для Windows, но всякий
нормальный здравомыслящий параноик конечно не будет его запускать,
а скомпилирует исходник сам.
Запускается утилита с четырьмя параметрами:
encipher.exe [исходный_файл] [файл_ключ] [смещение_от_начала_в_файле_ключа] [результат]
Предположим мы хотим зашифровать сообщение mess.rar, используя
в качестве ключа кусок файла voron.rar со смещением 1200 от начала:
encipher.exe mess.rar voron.rar 1200 abcd
Полученный файл abcd - зашифрованное сообщение. Отправляем его получателю,
а также сообщаем получателю (можно по другому каналу), каким ключом
пользоваться для расшифровки и смещение в нём (1200). У получателя тоже
есть файл voron.rar и утилита encipher. Он запускает её с такими
параметрами:
encipher.exe abcd voron.rar 1200 res.rar
И получает res.rar - расшифрованное сообщение
P.S. В данном примере значение смещения 1200 взято произвольно,
можно использовать любое другое значение. С помощью
одного файла-ключа с разными смещениями можно шифровать
несколько разных сообщений, только надо следить, чтобы
эти участки не перекрывались и не использовались
повторно и многократно. И смещение не должно быть
слишком маленьким, потому что в начале архивного файла
идут заранее известные сигнатуры и имена фалов. Начало
архивного файла нельзя использовать в качестве ключа.
-----------------------------------------------------------
Приложение - сообщения об ошибках утилиты encipher:
Error(1): wrong number of input arguments
- неверное количество параметров
Error(2): can't open input file
- невозможно открыть такой входной файл
Error(3): can't set position pointer in file
- невозможно установить указатель на конец
входного файла
Error(4): ftell error
- ошибка функции ftell
Error(5): the input file has zero size
- входной файл имеет нулевую длину
Error(6): can't open key-file
- невозможно открыть файл-ключ
Error(7): can't set position pointer in file
- невозможно установить указатель на конец
файла-ключа
Error(8): ftell error
- ошибка функции ftell
Error(9): bad offset argument
- задано неправильное смещение в файле ключа
Error(10): key too short
- ключ слишком короткий
Error(11): can't open output file
- невозможно открыть выходной файл
для записи
Error(12): fseek error
- ошибка функции fseek
Error(13): fseek error
- ошибка функции fseek
Давненько я не брал в руки шашек.
Решил немного доработать (в плане ловли ошибок) свою небольшую утилиту
для шифрования и выложить для скачивания. Я вообще-то непрофессиональный
программист и редко этим занимаюсь, если чо.
Ссылка для скачивания: link
Обязательно читать readme.txt сначала.
Здесь его дублирую:
------------------------
encipher - утилита для шифровки/дешифровки файлов простейшим способом
с использованием ключа длиной, равной длине файла.
Предысторию можете прочитать тут:
http://xaliavschik.livejournal.com/306464.html
http://xaliavschik.livejournal.com/308359.html?thread=1174663#t1174663
Я не верю в "фирменные" алгоритмы шифрования. Бывает их взламывают,
бывает что специально спецслужбы оставляют "лючки" для взлома. Вообще,
если почитать математическое описание, всё это ужасно запутанно
и непонятно. А я в ответственных случаях принципиально не пользуюсь
вещами, которые мне непонятны.
Поэтому свой простой алгоритм разжую здесь подробно, чтобы было понятно
даже детям. На самом деле, алгоритм не мой и придуман давно, но я своим
умом изобрел этот велосипед. :-) Вот ссылка для примера:
http://axofiber.no-ip.org/inside/xor.ciphering.htm
Итак, начнём с разъяснения, что такое операция xor - "исключающее ИЛИ".
Это битовая операция, производится над нулями и единицами. Вот таблица:
0 xor 0 -> 0
0 xor 1 -> 1
1 xor 0 -> 1
1 xor 1 -> 0
В нашем случае она будет выполняться побитово над целыми байтами,
например:
10011001
xor
00101011
||
10110010 (результат)
У этой операции есть одна интересная особенность, если дважды применить
её к одному и тому же байту, то в результате получим первоначальное
значение:
1. A xor B -> C
2. C xor B -> A (получаем первоначальное значение)
Это собственно и есть описание алгоритма шифрования для одного байта.
A - исходное сообщение
B - ключ
С - зашифрованное сообщение
шаг 1 - шифрование
шаг 2 - дешифровка
В нашем случае сообщение конечно длиннее одного байта, а ключ равен
длине сообщения. Описанная операция производится последовательно со
всеми байтами сообщения и ключа (первый с первым, второй со вторым,
третий с третьим и т.д.)
Наилучшие результаты в плане криптостойкости будут, если ключ состоит
из случайной последовательности байтов. Представьте, что бросаете
в воздух монету и последовательно записываете цепочку результатов
(нулей или единиц, в зависимости от того, на какую сторону упала монета)
- вот это будет хороший ключ. Но реально конечно этим никто не станет
заниматься. Можно использовать программный генератор случайных чисел
для генерации ключа, но это плохой вариант - обычно у него
последовательность совсем не случайная. Лучше всего для ключа
использовать кусок из большого архивного файла: rar или zip. Причем
брать этот кусок нужно не из начала (там идут заранее известные
сигнатуры, названия файлов в архиве и т.д.). Сжатые данные в файле
rar/zip выглядят как случайная последовательность, и восстановить
какую-то информацию по такому вырезанному куску совершенно невозможно.
Если сделать операцию xor между текстом и случайной последовательностью
байтов (ключом), то на выходе получим также случайную последовательность
(по виду) и никто никаким образом не сможет вытащить оттуда первоначальную
информацию, не зная ключа. Однако для надёжности и большей криптостойкости
необходимо и сам исходный файл заархивировать в rar или zip, перед тем
как его шифровать.
Итак, пересылка секретной информации выглядит следующим образом.
У отправителя и получателя имеется ключ, никто кроме них не знает этого
ключа. Отправитель шифрует файл этим ключом и отправляет получателю.
Если зашифрованное сообщение перехватывает кто-то посторонний, то он никак,
никаким сверхмощным суперкомпьютером не сможет его расшифровать, если
не знает ключ. Получатель же с помощью ключа легко и просто его
расшифрует. Всё.
Теперь конкретно об утилите encipher и её использовании.
Эта утилита запускается в командной строке и исходник encipher.c может
быть скомпилирован практически везде. Я добавил в архив уже
скомпилированный исполняемый файл encipher.exe для Windows, но всякий
нормальный здравомыслящий параноик конечно не будет его запускать,
а скомпилирует исходник сам.
Запускается утилита с четырьмя параметрами:
encipher.exe [исходный_файл] [файл_ключ] [смещение_от_начала_в_файле_ключа] [результат]
Предположим мы хотим зашифровать сообщение mess.rar, используя
в качестве ключа кусок файла voron.rar со смещением 1200 от начала:
encipher.exe mess.rar voron.rar 1200 abcd
Полученный файл abcd - зашифрованное сообщение. Отправляем его получателю,
а также сообщаем получателю (можно по другому каналу), каким ключом
пользоваться для расшифровки и смещение в нём (1200). У получателя тоже
есть файл voron.rar и утилита encipher. Он запускает её с такими
параметрами:
encipher.exe abcd voron.rar 1200 res.rar
И получает res.rar - расшифрованное сообщение
P.S. В данном примере значение смещения 1200 взято произвольно,
можно использовать любое другое значение. С помощью
одного файла-ключа с разными смещениями можно шифровать
несколько разных сообщений, только надо следить, чтобы
эти участки не перекрывались и не использовались
повторно и многократно. И смещение не должно быть
слишком маленьким, потому что в начале архивного файла
идут заранее известные сигнатуры и имена фалов. Начало
архивного файла нельзя использовать в качестве ключа.
-----------------------------------------------------------
Приложение - сообщения об ошибках утилиты encipher:
Error(1): wrong number of input arguments
- неверное количество параметров
Error(2): can't open input file
- невозможно открыть такой входной файл
Error(3): can't set position pointer in file
- невозможно установить указатель на конец
входного файла
Error(4): ftell error
- ошибка функции ftell
Error(5): the input file has zero size
- входной файл имеет нулевую длину
Error(6): can't open key-file
- невозможно открыть файл-ключ
Error(7): can't set position pointer in file
- невозможно установить указатель на конец
файла-ключа
Error(8): ftell error
- ошибка функции ftell
Error(9): bad offset argument
- задано неправильное смещение в файле ключа
Error(10): key too short
- ключ слишком короткий
Error(11): can't open output file
- невозможно открыть выходной файл
для записи
Error(12): fseek error
- ошибка функции fseek
Error(13): fseek error
- ошибка функции fseek
Re: зачем изобретать велосипед?
Date: 2010-08-16 09:43 am (UTC)там написано:
Я не верю в "фирменные" алгоритмы шифрования. Бывает их взламывают,
бывает что специально спецслужбы оставляют "лючки" для взлома. Вообще,
если почитать математическое описание, всё это ужасно запутанно
и непонятно. А я в ответственных случаях принципиально не пользуюсь
вещами, которые мне непонятны.
Re: зачем изобретать велосипед?
Date: 2010-08-16 09:56 am (UTC)Так что "лючки" могут быть только в мат. модели разве что.
Re: зачем изобретать велосипед?
Date: 2010-08-16 10:01 am (UTC)1024-битный ключ RSA взломали за 100 часов
Re: в общем довольно смешно
Date: 2010-08-16 10:07 am (UTC)В общем, я уже написал: если не понимаю, то в ответственных случаях не использую. Верить им нельзя.
no subject
Date: 2010-08-16 11:32 pm (UTC)no subject
Date: 2010-08-17 03:25 am (UTC)