Реферат: Хеш-функции в криптосистемах
3. Методы расшифровки
Этот метод связан с использованием большинством пользователей слишком простых паролей (длиной менее 8 символов, или, пароль, несущий на сбе какую-то смысловую нагрузку (отчество прабабушки по маминой линии)). В этом случае атаки сводятся к перебору возможных паролей, а защита - к их усложнению.
Для расшифровки пароля вторым методом, требуется знать его длину и алгоритм шифования. В случае, когда длина пароля составит менее восьми символов, можно воспользоваться следующим алгоритмом:
1. Перевернуть зашифрованный пароль.
2. Так как размер блока не может быть более 5 байт и менее 1 байта, то разобьём его на 8 блоков и запишем в список (список первых блоков, список вторых, и т. д.). Получим восьмиподсписковый список списков, каждый подсписок которого представляет собой все возможные блоки шифрованных символов.
3. Пробегаем в цикле по подсписку, сверяя каждый элемент со всеми символами из ASCII следующим образом:
If j*generate(x,n,j) = <элемент подсписка> then write(ord(j)), где j десятичный код символа, x - ключ, n - последовательный номер символа в пароле (в диапазоне [1, 8]). Если выполнилось это условие, то выведем на экран найденный символ.
После выполнения алгоритма на выходе получим либо пароль, либо такую последовательность, из которой его можно получить.
Описание
В основе алгортма лежит функция от трёх аргументов generate=trunc(k*(abs(sin(ln(a)*x)+ sin(cos(b)*x)))) :
1. ключа (x );
2. десятичного код символа (a );
3. номера символа во введённой строке (b ).
Она используется для преобразования десятичного кода символа в число, лежащее в интервале от 0 до 2*k , где k - любое число целого типа.Чем больше число k - тем меньше вероятность коллизий в дальнейшем.
После обработки символа он добавляется в список списков процедурой add_in_list(x: integer; s: string; var gr: llist) следующим образом - l^.inf:=ord(s[k])*generate(x,ord(s[k]),k) , где l^.inf -элемент списка списков, x - ключ (для функции generate ), s - строка, разбиваемая на блоки по 8 символов. Каждый подсписок имеет длину не более 8 элементов размером до 5 байт.
Третим шагом является сложение соответствующих элементовпроцедурой summ_all(gr: llist; var a:array_type) из каждого подсписка l в 8 элментный массивa , т.е. первый элемент из первого элемента складывается с первым элементом второго, третьего и т.д. подсписка и записываетсявa[1] .
Так - же поступаем и с другими элементами подсписков.
Следующим щагом записываем в файл ключ и по очереди все элементы массива a , обработанные функцией FromIntToString(), которая переводит численный тип в символьный и переворачивает.
Для сверки пароля его требуется зашифровать заново по известному ключу и сверить с зашифрованным экземпляром.
Вот исходный текст программы:
kriptmod.pas
unit kriptmod;
interface
type Plist=^list;
list=record
inf: word;
num: 1..8;
next: Plist;
end;