Выходными данными являются сам магический квадрат, его размер, магический квадрат из букв и шифрованный текст.

2.5  Блочные шифры простой замены (шифр Плейфера)

Описание задачи

Простейший блочный шифр оперирует с биграммными шифрвеличинами. Одними из первых таких шифров были биграммные шифры Порта и Плейфера. Приведем описание шифра Плейфера, нашедшего широкое применение в начале нашего века.

Основой шифра Плейфера является прямоугольная таблица, в которую записан систематически перемешанный алфавит (для удобства запоминания). Правило зашифрования состоит в следующем.

Буквы биграммы (i, j), i<>j (являющейся шифрвеличиной) находятся в данной таблице. При зашифровании биграмма (i, j) заменяется биграммой (k, l), где k и l определяются в соответствии с правилами 1–3.

1.  Если i и j не лежат в одной строке или одном столбце, то их позиции образуют противоположные вершины прямоугольника. Тогда k и l – другая пара вершин, причем k – вершина, лежащая в той же строке, что и i.

2.  Если i и j лежат в одной строке, то k и l – буквы той же строки, расположенные непосредственно справа от i и j соответственно. При этом если одна из букв – последняя в строке, то считается, что ее “правым соседом” является первая буква той же строки.

3.  Аналогично, если i и j лежат в одном столбце, то они заменяются их “соседями снизу”.

Наглядно правило зашифрования можно проиллюстрировать следующим образом.

В случае 1:

i

k

l

j

В случае 2:

НЕ нашли? Не то? Что вы ищете?

I

k

..

j

l

k

j

l

j

В случае 3:

k

i

k

j

l

j

l

i

При зашифровании открытый текст представляется в виде последовательности биграмм. Если текст имеет нечетную длину или содержит биграмму, состоящую из одинаковых букв, то в него добавляются “пустышки” следующим образом. “Пустышкой” является некоторая редкая для данного типа текста буква (или знак), которая вставляется между одинаковыми буквами биграммы или добавляется в текст для того, чтобы его длина стала четной. Такие изменения открытого текста, как правило, не мешают при расшифровании. Проиллюстрируем сказанное следующим примером.

Пусть шифр использует прямоугольник размером 5 x 6, в который записан систематически перемешанный русский 30 буквенный алфавит на основе ключевого слова командир:

к

о

м

а

н

д

и

р

б

в

г

е

ж

з

л

п

с

т

у

ф

х

ц

ч

ш

щ

ь

ы

э

ю

я

Зашифруем фразу “автором метода является Уитстон”. В качестве “пустышки” будем использовать редкую букву ф.

Представим фразу в виде последовательности биграмм:

АВ ТО РО МФ МЕ ТО ДА ЯВ ЛЯ ЕТ ТЯ УИ ТС ТО НФ

(Нам пришлось дважды вставить “пустышку”.)

В соответствии со сформулированными правилами получаем шифртекст:

ВП ЗД ЗР ОХ ДБ ЗД КН ЭЕ ТЫ ТШ ТЮ ЩЖ ЖТ ЗД ОЧ

или без пробелов

впздзрохдбздкнэетытштющжжтздоч

Криптоанализ шифра Плейфера опирается на частотный анализ биграмм, триграмм и четырехграмм шифртекста и особенности замены шифрвеличин на шифробозначения, связанные с расположением алфавита в прямоугольнике. При этом существенную информацию о заменах дает знание того, что используется систематически перемешанный алфавит.

Описание логической структуры

Для шифрования текста методом Плейфера, выполним следующие действия:

-  водим 30 буквенный алфавит, ключ и шифрованный текст;

-  вычисляем количество знаков в ключе;

-  убираем буквы в алфавите, которые встречаются в ключе;

-  создаем перемешанный буквенный алфавит на основе ключевого слова;

-  перемешанный буквенный алфавит распределяем в массив;

-  вычисляем кол-во знаков в шифруемом тексте;

-  представим фразу в виде последовательности биграмм;

-  разбиваем текст на массив;

-  шифруем методом Плейфера;

-  выводим перемешанный алфавит, текст в виде последовательности биграмм, шифр текст и шифр текст без пробелов.

Объекты CODEPLAPHER.FRM и значения их свойств

Тип и номер1

Свойство

Значение

Form

Name

frmCodePlapher

BorderStyle

4 – Fixed ToolWindows

Caption

Шифр Плейфера

MaxButton

0 – False

MDIChild

-1 – True

MinButton

0 – False

ShowInTaskbar

0 – False

Label

1

Name

lblTitle

Alignment

2 – Center

Caption

БЛОЧНЫЕ ШИФРЫ ПРОСТОЙ ЗАМЕНЫ

шифр Плейфера)

Font

Underline

-1 – True

Label

2

Name

lblEntrance

Caption

1. Введите шифруемый текс:

Font

Underline

-1 – True

TextBox

3

Name

txtEntrance

Alignment

2-Center

Font

Name

Courier New

Label

4

Name

lblKey

Caption

2. Введите ключ (буквы не должны повторятся)

Font

Underline

-1 – True

TextBox

5

Name

txtKey

Alignment

2-Center

Font

Name

Courier New

CommandButton

6

Name

cmdCodePlapher

Caption

Шифр Плейфера

TextBox

7

Name

txtAlphabetInArray

Font

Name

Courier New

MultiLine

-1 – True

Label

8

Name

lblBigramma

Caption

Представление фразы в виде последовательности биграмм:

Font

Underline

-1 – True

TextBox

9

Name

txtBigramma

Alignment

2-Center

Font

Name

Courier New

Label

10

Name

lblCodePlapher

Caption

Полученный шифртекст

Font

Underline

-1 – True

TextBox

11

Name

txtCodePlapher

Alignment

2-Center

Font

Name

Courier New

Label

12

Name

lblCodePlapher1

Caption

Или без пробелов

Font

Underline

-1 – True

TextBox

13

Name

txtCodePlapher1

Alignment

2-Center

Font

Name

Courier New

1 Номер указанный в первой колонке, соответствует порядковому номеру объекта на форме (рис. )

Исходный код CODEPLAPHAR.FRM

Option Explicit

Private Sub cmdCodePlapher_Click()

'Описываем переменные

Dim Alphabet As String 'Алфавит

Dim Key As String 'Ключевое слово

Dim AlphabetInArray() As String 'Алфавит в массиве

Dim TextAsBigramm As String 'Текст в виде последовательности биграмм

Dim TextAsBigrammInArray() As String 'Текст в массиве

Dim MarksInKey As Integer 'Число знаков в ключе

Dim MarksInText As Integer 'Число знаков в тексте

Dim EntranceText As String 'Шифруемый текст

Dim CodePlapher() As String 'Шифрованный текст

Dim Text$, A$, B$

Dim x%, i%, j%, s1%, s2%, t1%, t2%

'Вводим 30 буквенный алфавит

Alphabet = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЭЮЯ"

'Вводим ключ

'и преобразуем прописные буквы в строчные

Key = StrConv(txtKey, vbUpperCase)

'Вычисляем количество знаков в ключе

MarksInKey = CInt(Len(Key))

'Проверяем, чтобы не было в ключе одинаковых букв

For i = 1 To MarksInKey

A = Mid(Key, i, 1)

For j = i + 1 To MarksInKey

B = Mid(Key, j, 1)

If A = B Then

MsgBox "В ключе имеются одинаковые буквы. " _

& "Введите другое ключевое слово", , "Ошибка в ключе"

Exit Sub

End If

Next j

Next i

'Проверям, есть ли подобные знаки в алфавите как в ключе

For i = 1 To MarksInKey

Text = Mid(Key, i, 1)

x = InStr(Alphabet, Text)

If x = 0 Then

MsgBox "Знак '" & Text & "' не найден в алфавите. " _

& "Введите другое ключевое слово.", , "Ошибка в ключе"

Exit Sub

End If

Next i

'Убираем буквы в алфавите,

'которые встречаются в ключе

For i = 1 To MarksInKey

Text = Mid(Key, i, 1)

Alphabet = Replace(Alphabet, Text, "")

Next i

'Создаем перемешанный буквенный алфавит

'на основе ключевого слова

Alphabet = Key & Alphabet

'Перемешанный буквенный алфавит

'распределяем в массив

ReDim AlphabetInArray(5, 6)

x = 1

For i = 1 To 5

For j = 1 To 6

AlphabetInArray(i, j) = Mid(Alphabet, x, 1)

x = x + 1

Next j

Next i

'Считываем шифруемый текст

EntranceText = txtEntrance. Text & " "

'Вычисляем кол-во знаков в тексте

MarksInText = CInt(Len(EntranceText))

'Представим фразу

'в виде последовательности биграмм,

'преобразовав строчные буквы в прописные

Text = "": j = 1

For i = 1 To MarksInText

If j Mod 2 <> 0 Then

If Mid(EntranceText, i, 1) <> " " Then

Text = Text & Mid(EntranceText, i, 1)

j = j + 1

End If

ElseIf j Mod 2 = 0 Then

If Mid(EntranceText, i, 1) = " " Then

Text = Text & "Ф"

j = j + 1

Else

Text = Text & Mid(EntranceText, i, 1)

j = j + 1

End If

End If

Next i

TextAsBigramm = StrConv(Text, vbUpperCase)

'Вычисляем кол-во знаков в тексте

MarksInText = CInt(Len(TextAsBigramm))

'Разбиваем текст на массив

ReDim TextAsBigrammInArray(MarksInText / 2, 2)

x = 1

For i = 1 To MarksInText / 2

For j = 1 To 2

TextAsBigrammInArray(i, j) = Mid(TextAsBigramm, x, 1)

x = x + 1

Next j

Next i

'Шифруем

ReDim CodePlapher(MarksInText / 2, 2)

For x = 1 To MarksInText / 2

A = TextAsBigrammInArray(x, 1)

B = TextAsBigrammInArray(x, 2)

'Находим букву в массиве алфавита

For i = 1 To 5

For j = 1 To 6

If AlphabetInArray(i, j) = A Then

s1 = i: t1 = j

ElseIf AlphabetInArray(i, j) = B Then

s2 = i: t2 = j

End If

Next j

Next i

'Выполняем замену по правилам:

'Правило 1

If s1 <> s2 And t1 <> t2 Then

CodePlapher(x, 1) = AlphabetInArray(s1, t2)

CodePlapher(x, 2) = AlphabetInArray(s2, t1)

'Правило 2

ElseIf s1 = s2 Then

If t1 = 6 Then

CodePlapher(x, 1) = AlphabetInArray(s1, 1)

Else

CodePlapher(x, 1) = AlphabetInArray(s1, t1 + 1)

End If

If t2 = 6 Then

CodePlapher(x, 2) = AlphabetInArray(s2, 1)

Else

CodePlapher(x, 2) = AlphabetInArray(s2, t2 + 1)

End If

'Правило 3

ElseIf t1 = t2 Then

If s1 = 5 Then

CodePlapher(x, 1) = AlphabetInArray(1, t2)

Else

CodePlapher(x, 1) = AlphabetInArray(s1 + 1, t2)

End If

If s2 = 5 Then

CodePlapher(x, 2) = AlphabetInArray(1, t1)

Else

CodePlapher(x, 2) = AlphabetInArray(s2 + 1, t1)

End If

End If

Next x

'Выводим перемешанный алфавит

Text = ""

For i = 1 To 5

For j = 1 To 6

Text = Text & AlphabetInArray(i, j) & " "

Next j

Text = Text & vbCrLf

Next i

txtAlphabetInArray. Text = Text

'Выводим текст в виде последовательности биграмм

Text = ""

For i = 1 To MarksInText / 2

For j = 1 To 2

Text = Text & TextAsBigrammInArray(i, j)

Next j

Text = Text & " "

Next i

txtBigramma. Text = Text

'Выводим шифр текст

Text = ""

For i = 1 To MarksInText / 2

For j = 1 To 2

Text = Text & CodePlapher(i, j)

Next j

Text = Text & " "

Next i

txtCodePlapher. Text = Text

'Выводим шифр текст без пробелов

txtCodePlapher1.Text = StrConv(Replace(Text, " ", ""), vbProperCase)

End Sub

Входные и выходные данные

Входными данными являются 30 буквенный алфавит, ключ и шифруемый текст.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7