Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 23:10, лабораторная работа
Сеть Фе́йстеля («Feistel cipher», «Feistel network») — один из методов построения блочных шифров. Сеть представляет собой определённую многократно повторяющуюся (итерированную) структуру, называющуюся ячейкой Фейстеля. При переходе от одной ячейки к другой меняется ключ, причём выбор ключа зависит от конкретного алгоритма. Операции шифрования и расшифрования на каждом этапе очень просты, и при определённой доработке совпадают, требуя только обратного порядка используемых ключей.
пМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ,
МОЛОДЕЖИ И СПОРТА УКРАИНЫ
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра прикладной математики и информатики
ОТЧЁТ
к лабораторной работе №2
на тему:
“ Изучение и реализация алгоритма Фейстеля.”
Выполнила:
Донецк 2013
Сеть Фе́йстеля («Feistel cipher», «Feistel network») — один из методов построения блочных шифров. Сеть представляет собой определённую многократно повторяющуюся (итерированную) структуру, называющуюся ячейкой Фейстеля. При переходе от одной ячейки к другой меняется ключ, причём выбор ключа зависит от конкретного алгоритма. Операции шифрования и расшифрования на каждом этапе очень просты, и при определённой доработке совпадают, требуя только обратного порядка используемых ключей.
К достоинствам данного алгоритма шифрования можно отнести простоту аппаратной и программной реализаций, к недостаткам – шифрование только половины входного блока за один раунд.
Рисунок 1 - Классическая сеть Фейстеля
Классическая (или простая) сеть Фейстеля (рисунок 1) разбивает исходный текст на блок длиной 2n бит, каждый блок разбивается на два потока L (левый) и R(правый). Далее выполняется преобразование по формуле:
где Ki – ключ, Fi – функция преобразования.
Каждое такое действие называется раундом. Обычно используется 8-16 раундов. При этом, ключ в каждом раунде может быть как частью общего ключа, так и ее модификацией по некоторому правилу: следует отметить, что это в значительной мере влияет на криптостойкость. Также важным является правило, по которому текст разбивается на потоки.
Основное достоинство алгоритма заключается в том, что функция f не обязана быть обратимой, более того, для повышения криптостойкости обычно используют нелинейные именно необратимые функции.
Ключ, с которым суммируется текст, не повторяется из блока в блок, а изменяется в зависимости от самого текста, это значительно увеличивает его энтропию, и, следовательно, увеличивает криптостойкость метода.
Входной блок
Разбиение блока на 2 части по 32 бита
i = 1…n
Li = Ri-1 XOR f(Li-1,Ri-1)
Ri = Li-1
Зашифрованный блок
4. Листинг программы
Dim a As String, key As String, mas1(1 To 100) As String, ch1 As Integer, i As Integer
Dim rpart As String, lpart As String, temp2 As String, rpart2 As String
Dim temp1 As Integer
Private Sub Command1_Click()
a = Text2.Text 'Вводим в a текст для шифровки
Label1.Caption = "" 'Очищаем значение
Ch = 1 'Обнуляем счётчик, он нужен для того, чтобы разбить текст на блоки из 8 символов
For i = 1 To (Len(a) \ 8) 'В цикле разбиваем текст на 8 и вводим "куски" в массив
mas1(i) = Mid(a, Ch, 8)
Ch = Ch + 8
Next i
For i = 1 To (Len(a) \ 8) 'Процедура шифровки
lpart = Mid(mas1(i), 1, 4) 'Делим на 2 части
rpart = Mid(mas1(i), 5, 4)
key = Text1.Text 'Берём ключ
temp2 = "" 'Временные переменные
temp1 = 0
For ii = 1 To 4 'Цикл первого шага (1 раунд)
temp1 = Abs(255 - Asc(Mid(lpart, ii, 1)) - 32) 'Берём символ блока
temp1 = temp1 + Abs(255 - Asc(Mid(key, ii, 1)) - 32) 'Складываем с ключом
If temp1 > 100 Then temp1 = -23 'Если есть пробел, то меняем, чтоб не было ошибки
If temp1 > 32 Then 'Проверяем, чтоб не было символов больше, чем букв в алфавите
temp1 = temp1 - 32 'Отнимаем, если привысило
End If
temp2 = temp2 & Chr(temp1 + 223) 'Собираем новое слово
Next ii
key = temp2 'Присваеваем его ключу
temp2 = "" 'Обнуляем
temp1 = 0
For ii = 1 To 4 'Аналогично (1 раунд) 2 раунд
temp1 = Abs(255 - Asc(Mid(rpart, ii, 1)) - 32)
temp1 = temp1 + Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 > 100 Then temp1 = -23
If temp1 > 32 Then
temp1 = temp1 - 32
End If
temp2 = temp2 & Ch(temp1 + 223)
Next ii
rpart = lpart 'Меняем местами
lpart = temp2
temp2 = ""
key = Text1.Text 'Опять ключ берём
For ii = 1 To 4 'Выполняем аналогично второй раунд
temp1 = Abs(255 - Asc(Mid(lpart, ii, 1)) - 32)
temp1 = temp1 + Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 > 100 Then temp1 = -23
If temp1 > 32 Then
temp1 = temp1 - 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
key = temp2
temp2 = ""
temp1 = 0
For ii = 1 To 4
temp1 = Abs(255 - Asc(Mid(rpart, ii, 1)) - 32)
temp1 = temp1 + Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 > 100 Then temp1 = -23
If temp1 > 32 Then
temp1 = temp1 - 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
rpart = temp2
Label1.Caption = Label1.Caption & lpart & rpart 'Выводим
mas1(i) = lpart & rpart 'ЗЗапоминаем в массиве
Next i
End Sub
Private Sub Command2_Click()
Label1.Caption = "" 'Очищаем
For i = 1 To (Len(a) \ 8)
lpart = Mid(mas1(i), 1, 4) 'Здесь так же, как и при шифровке
rpart = Mid(mas1(i), 5, 4)
key = Mid(Text1.Text, 4, 1) & Mid(Text1.Text, 3, 1) & Mid(Text1.Text, 2, 1) & Mid(Text1.Text, 1, 1) 'Перевёрнутый ключ
temp2 = ""
temp1 = 0
For ii = 1 To 4 '1 раунд
temp1 = Abs(255 - Asc(Mid(lpart, ii, 1)) - 32)
If temp1 = 128 Then temp1 = 35
temp1 = temp1 - Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 < 0 Then
temp1 = temp1 + 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
key = temp2
temp2 = ""
temp1 = 0
For ii = 1 To 4
temp1 = Abs(255 - Asc(Mid(rpart, ii, 1)) - 32)
If temp1 = 128 Then temp1 = 35
temp1 = temp1 - Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 < 0 Then
temp1 = temp1 + 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
rpart = lpart
lpart = temp2
key = Mid(Text1.Text, 4, 1) & Mid(Text1.Text, 3, 1) & Mid(Text1.Text, 2, 1) & Mid(Text1.Text, 1, 1)
temp2 = ""
'Второй
For ii = 1 To 4
temp1 = Abs(255 - Asc(Mid(lpart, ii, 1)) - 32)
If temp1 = 128 Then temp1 = 35
temp1 = temp1 - Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 < 0 Then
temp1 = temp1 + 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
key = temp2
temp2 = ""
temp1 = 0
For ii = 1 To 4
temp1 = Abs(255 - Asc(Mid(rpart, ii, 1)) - 32)
If temp1 = 128 Then temp1 = 35
temp1 = temp1 - Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 < 0 Then
temp1 = temp1 + 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
'key = temp2
rpart = temp2
temp2 = ""
lpart = key
key = Text1.Text
For ii = 1 To 4 'Здесь используем на 1 цикл больше, т.к. не полностью дешифруется 2 циклами
temp1 = Abs(255 - Asc(Mid(lpart, ii, 1)) - 32)
If temp1 = 128 Then temp1 = 35
temp1 = temp1 - Abs(255 - Asc(Mid(key, ii, 1)) - 32)
If temp1 < 0 Then
temp1 = temp1 + 32
End If
temp2 = temp2 & Chr(temp1 + 223)
Next ii
lpart = temp2
Label1.Caption = Label1.Caption & lpart & rpart 'И выводим
Next i
End Sub
6. Литература
1. http://exponenta.ru/educat/
2. http://frela14.ru/_fr/3/
3. http://www.cyberforum.ru/
4. http://www.oitzi.ru/Materials.
Информация о работе Изучение и реализация алгоритма Фейстеля