Expand Cut Tags

No cut tags
xaliavschik_lj: (Default)
[personal profile] xaliavschik_lj
начало здесь: ссылка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



(deleted comment)
From: [identity profile] xaliavschik.livejournal.com
зачем изобретать велосипед? openSSL же

там написано:

Я не верю в "фирменные" алгоритмы шифрования. Бывает их взламывают,
бывает что специально спецслужбы оставляют "лючки" для взлома. Вообще,
если почитать математическое описание, всё это ужасно запутанно
и непонятно. А я в ответственных случаях принципиально не пользуюсь
вещами, которые мне непонятны.
(deleted comment)
From: [identity profile] xaliavschik.livejournal.com
Алогоритмы шифрования в SSL применяются стандартные, я им не доверяю, в том число и по этой причине:

Так что "лючки" могут быть только в мат. модели разве что.
(deleted comment)

Re: в общем довольно смешно

Date: 2010-08-16 10:07 am (UTC)
From: [identity profile] xaliavschik.livejournal.com
У меня есть подозрения, что в самой матмодели имеются "закладки".
В общем, я уже написал: если не понимаю, то в ответственных случаях не использую. Верить им нельзя.

Date: 2010-08-16 11:32 pm (UTC)
From: [identity profile] dimax4.livejournal.com
охуенно, спасибо. Хотим сорцы!

Date: 2010-08-17 03:25 am (UTC)
From: [identity profile] xaliavschik.livejournal.com
Там же есть вначале ссылка: link

Profile

xaliavschik_lj: (Default)
xaliavschik_lj

January 2026

S M T W T F S
     1 2 3
4 5 6 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Page generated Jan. 7th, 2026 01:34 pm
Powered by Dreamwidth Studios