Главная страница
Навигация по странице:

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

  • Исходный код CODEMAGSQ . FRM

  • Криптографическая защита информации. Ведение Криптографическая защита информации


    Скачать 0.84 Mb.
    НазваниеВедение Криптографическая защита информации
    АнкорКриптографическая защита информации
    Дата25.12.2021
    Размер0.84 Mb.
    Формат файлаdoc
    Имя файлаКриптографическая защита информации.doc
    ТипДокументы
    #317994
    страница4 из 6
    1   2   3   4   5   6

    Шифрование методом магического квадрата

    Предыстория


    В китайской древней книге «Же-ким» («Книга перестановок») приводится легенда о том, что император Ню, живший 4 тысячи лет назад, увидел на берегу реки священную черепаху. На ее панцире был изображен рисунок из белых и черных кружков (рис. 1). Если изменить каждую фигуру число, показывающим, сколько в ней кружков, получится такая таблица:


    4

    9

    2

    3

    5

    7

    8

    1

    6


    У этой таблице есть замечательное свойство. Сложи числа первого столбца: 4+3+8=15. Тот же результат получится при сложении чисел второго, а также третьего столбцов. Он же получается при сложении чисел любой из трех строк. Мало этого, тот же ответ 15 получается, если сложить числа каждой из двух диагоналей: 4+5+6=8+5+2=15.

    Наверное, эту легенду китайцы придумали, когда нашли расположение чисел от 1 до 9 со столь замечательным свойством. Рисунок они назвали «ло-шу» и стали считать его магическим символом и употреблять при заклинаниях. Поэтому сейчас любую квадратную таблицу, составленную из чисел и обладающую таким свойством, называют магическим квадратом.

    Каким же образом составляют магические квадраты? Магический квадрат «ло-шу» можно найти, не прибегая к перебору одной за другой всех расстановок 9 цифр в 9 клетках (число таких расстановок 362 880). Будем рассуждать так. Сумма всех чисел от 1 до 9 равна: 1+2+3+4+5+6+7+8+9=45. Значит, в каждой строке и в каждом столбце сумма чисел должна равняться: 45:3=15. Но если просуммировать все числа во вторых столбце и строке и в обеих диагоналях, то каждое число войдет один раз, за исключением центрального, которое войдет четырежды. Значит, если обозначить центральное число через х, то должно выполняться равенство . Отсюда х=5, то есть в центре таблицы должно стоять число 5.

    Теперь заметим, что число 9 не может стоять в углу таблицы, скажем в левом верхнем. Ведь тогда в противоположном углу стояло бы число 1, а на первые строку и столбец оставалось бы одна комбинация – числа 4 и 2. Значит, 9 стоит в середине каких-то крайних строк или столбцов (у нас в середине первой строки). Двумя другими числами этой строки являются 4 и 2, а третьим числом среднего столбца должно быть 15–9–5=1. В одной строке с 1 должны стоять числа 8 и 6. Тем самым магический квадрат почти заполнен и легко найти место для оставшихся чисел. В результате получается квадрат «ло-шу». Конечно, для 9 можно выбрать другие 3 места, а после выбора места для этого числа остаются две возможности для расположения чисел 4 и 2. Всего получается различных магических квадратов из трех строк и трех столбцов (или, как говорят математики, квадратов третьего порядка). Все эти квадраты можно получить из «ло-шу», либо поворачивая квадрат вокруг центра на , или , либо зеркально отражая его.

    Вообще, если уже найден какой-нибудь магический квадрат, то из него можно описанными выше методами (поворачивая и зеркальными отражениями) получить еще 7 магических квадратов. Но как же найти хоть один магический квадрат? Для квадратов не четного порядка есть совсем простой способ, он заключается в следующем. Берем средний столбец и в его верхней клетке пишем число 1. Это же число пишем ниже самой нижней клетки среднего столбца и от него начинаем писать числа 2, 3, …, идя вверх и в право (нижнее число 1 находится вне квадрата). Это делаем до тех пор, пока не дойдем до самого правого столбца. Тогда последнее написанное число записываем в той же строке слева от квадрата и идем от него вправо вверх, записывая числа в порядке возрастания. Когда дойдем до числа, за которым идет ранее написанное число 1, опускаемся на одну клетку вниз, записываем в ней следующие по порядку число и снова пишем числа в порядке возрастания так же, как и раньше. Получился квадрат пятого порядка:





    17

    24

    1

    8

    15

    16

    23

    5

    7

    14

    16

    22

    4

    6

    13

    20

    22

    3

    10

    12

    19

    21

    3

    9

    11

    18

    25

    2

    9




    17

    24

    1

    8





    Несложно написать и магический квадрат четвертого порядка: для этого запишем числа от 1 до 16 в квадрат по порядку. А теперь поменяем местами числа, стоящие в противоположных углах всего квадрата и внутреннего квадратика:


    16

    2

    3

    13

    5

    11

    10

    8

    9

    7

    6

    12

    4

    14

    15

    1



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


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

    • вводим исходный текст;

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

    • определяем количество знаков в тексте MT;

    • вычисляем размер магического квадрата (массива):

        • N=MT1/2;

        • если N – натуральное число, тогда N=N+1;

        • если N2

    • разбиваем текст в одномерный массив и в пустые значения присваиваем “*”

    • определяем среднее значение массива Sr=N/2 и округляем её до целого числа;

    • приравниваем i=1, j=Sr;

    • в цикле по k от 1 до N2 с шагом равной 1:

        • приравниваем i=i+2, j=j-1, если i<1 и j>N, не-то i=N, если i<1, не-то j=1, если j>N, не-то i=i+2, j=j-1, если Mi,j>0;

        • Формируем магический квадрат Mi,j=k;

    • выводим размер магического квадрата

    • выводи магический квадрат;

    • распределяем текст в магический квадрат и выводим текст в матрице

    • выводим шифрованный текст.


    Блок-схема для метода шифрования магическим квадратом (создание магического квадрата из цифр):





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

    Тип и номер1

    Свойство

    Значение

    Form










    Name

    frmCodeMagSq




    BorderStyle

    4 – Fixed ToolWindows




    Caption

    Магический квадрат




    MaxButton

    0 – False




    MDIChild

    -1 – True




    MinButton

    0 – False




    ShowInTaskbar

    0 – False

    Label







    1

    Name

    LabTitle




    Alignment

    2 – Center




    Caption

    МАГИЧЕСКИЙ КВАДРАТ




    Font










    Underline

    -1 – True

    Label







    2

    Name

    Lab1




    Caption

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




    Font










    Underline

    -1 – True

    TextBox







    3

    Name

    txtEntrance




    MultiLine

    -1 – True




    ScrollBars

    2 – Vertical

    CommandButton







    4

    Name

    cmdCodeMagSq




    Caption

    Магический квадрат

    TextBox







    5

    Name

    txtMagSqInNum




    MultiLine

    -1 – True




    ScrollBars

    3 – Both

    TextBox







    6

    Name

    txtTextInMagSq




    MultiLine

    -1 – True




    ScrollBars

    3 – Both

    TextBox







    7

    Name

    txtCodeMagSq




    MultiLine

    -1 – True




    ScrollBars

    2 – Vertical

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




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

    Option Explicit
    Private Sub cmdCodeMagSq_Click()

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

    Dim intMagSqInNum() As Integer 'Магический квадрат в числах

    Dim strTextInMagSq() As String 'Текст в магическом квадрате

    Dim strTextInArray() As String 'Одномерный массив шифруемого текста

    Dim intSizeOfArray As Integer 'Размер массива

    Dim i%, j% 'Integer(%)

    Dim strTextWBlanks As String 'Текст без пробелов

    Dim lngMarksInText As Long 'Чило знаков в тексте

    'Убираем пробелы в тексте

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

    strTextWBlanks = StrConv(Replace(txtEntrance.Text, " ", ""), vbUpperCase)

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

    lngMarksInText = Len(strTextWBlanks)

    'Вычисляем размер магического квадрата (массива)

    intSizeOfArray = Int(Sqr(lngMarksInText))

    If intSizeOfArray Mod 2 = 0 Then intSizeOfArray = intSizeOfArray + 1

    If intSizeOfArray ^ 2 < lngMarksInText Then intSizeOfArray = intSizeOfArray + 2

    'Разбиваем текс в одномерный массив

    'и в пустые значения присваеваем "*"

    ReDim strTextInArray(intSizeOfArray ^ 2)

    For i = 1 To intSizeOfArray ^ 2

    If i > CInt(lngMarksInText) Then

    strTextInArray(i) = "*"

    Else

    strTextInArray(i) = Mid(strTextWBlanks, i, 1)

    End If

    Next i

    'Создаем магический квадрат с помощью функции MagSqInNum

    intMagSqInNum = MagSqInNum(intSizeOfArray)

    'Выводим магический квадрат

    txtMagSqInNum.Text = ""

    For i = 1 To intSizeOfArray

    For j = 1 To intSizeOfArray

    txtMagSqInNum.Text = txtMagSqInNum.Text & intMagSqInNum(i, j) & " "

    Next j

    txtMagSqInNum.Text = txtMagSqInNum.Text & vbCrLf

    Next i

    'Распределяем текст в магический квадрат

    'и выводим текст в матрице

    ReDim strTextInMagSq(intSizeOfArray, intSizeOfArray)

    txtTextInMagSq.Text = ""

    For i = 1 To intSizeOfArray

    For j = 1 To intSizeOfArray

    strTextInMagSq(i, j) = strTextInArray(intMagSqInNum(i, j))

    txtTextInMagSq.Text = txtTextInMagSq.Text & strTextInMagSq(i, j) & " "

    Next j

    txtTextInMagSq.Text = txtTextInMagSq.Text & vbCrLf

    Next i

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

    txtCodeMagSq.Text = ""

    For i = 1 To intSizeOfArray

    For j = 1 To intSizeOfArray

    strTextInMagSq(i, j) = strTextInArray(intMagSqInNum(i, j))

    txtCodeMagSq.Text = txtCodeMagSq.Text & strTextInMagSq(i, j)

    Next j

    Next i

    'Выводим размер квадрата на кнопку

    cmdCodeMagSq.Caption = "Магический квадрат (" & intSizeOfArray & " x " & intSizeOfArray & ")"

    End Sub
    Function MagSqInNum(intSizeOfArray As Integer) As Integer()

    'Функция для создания магического квадрата

    'нечетного порядка NxN

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

    Dim intMagSqInNum() As Integer 'Магический квадрат в числах

    Dim intAverArray As Integer 'Среднее значение массива

    Dim i%, j%, k% 'Integer(%)

    Dim intVariantSq As Integer 'Вариант магического квадрата

    'Определяем среднее значение массива

    intAverArray = Int(intSizeOfArray / 2) + 1

    'Переопределяем размер массива (квадрата)

    ReDim intMagSqInNum(intSizeOfArray, intSizeOfArray)

    'Выбираем вариант с помощью генератора случайных чисел

    Randomize

    intVariantSq = Int((8 - 1 + 1) * Rnd + 1)

    'Создаем магический квадрат соответственно варианту

    Select Case intVariantSq

    Case Is = 1

    ' 8 1 6

    ' 3 5 7

    ' 4 9 2

    i = 1: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i < 1 And j > intSizeOfArray Then

    i = i + 2: j = j - 1

    ElseIf i < 1 Then

    i = intSizeOfArray

    ElseIf j > intSizeOfArray Then

    j = 1

    ElseIf intMagSqInNum(i, j) > 0 Then

    i = i + 2: j = j - 1

    End If

    intMagSqInNum(i, j) = k

    i = i - 1: j = j + 1

    Next k

    Case Is = 2

    ' 6 7 2

    ' 1 5 9

    ' 8 3 4

    i = 1: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i < 1 And j < 1 Then

    i = i + 2: j = j + 1

    ElseIf i < 1 Then

    i = intSizeOfArray

    ElseIf j < 1 Then

    j = intSizeOfArray

    ElseIf intMagSqInNum(j, i) > 0 Then

    i = i + 2: j = j + 1

    End If

    intMagSqInNum(j, i) = k

    i = i - 1: j = j - 1

    Next k

    Case Is = 3

    ' 2 9 4

    ' 7 5 3

    ' 6 1 8

    i = intSizeOfArray: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i > intSizeOfArray And j < 1 Then

    i = i - 2: j = j + 1

    ElseIf i > intSizeOfArray Then

    i = 1

    ElseIf j < 1 Then

    j = intSizeOfArray

    ElseIf intMagSqInNum(i, j) > 0 Then

    i = i - 2: j = j + 1

    End If

    intMagSqInNum(i, j) = k

    i = i + 1: j = j - 1

    Next k

    Case Is = 4

    ' 4 3 8

    ' 9 5 1

    ' 2 7 6

    i = intAverArray: j = intSizeOfArray

    For k = 1 To intSizeOfArray ^ 2

    If i > intSizeOfArray And j > intSizeOfArray Then

    i = i - 1: j = j - 2

    ElseIf i > intSizeOfArray Then

    i = 1

    ElseIf j > intSizeOfArray Then

    j = 1

    ElseIf intMagSqInNum(i, j) > 0 Then

    i = i - 1: j = j - 2

    End If

    intMagSqInNum(i, j) = k

    i = i + 1: j = j + 1

    Next k

    Case Is = 5

    ' 6 1 8

    ' 7 5 3

    ' 2 9 4

    i = 1: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i < 1 And j < 1 Then

    i = i + 2: j = j + 1

    ElseIf i < 1 Then

    i = intSizeOfArray

    ElseIf j < 1 Then

    j = intSizeOfArray

    ElseIf intMagSqInNum(i, j) > 0 Then

    i = i + 2: j = j + 1

    End If

    intMagSqInNum(i, j) = k

    i = i - 1: j = j - 1

    Next k

    Case Is = 6

    ' 8 3 4

    ' 1 5 9

    ' 6 7 2

    i = 1: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i < 1 And j > intSizeOfArray Then

    i = i + 2: j = j - 1

    ElseIf i < 1 Then

    i = intSizeOfArray

    ElseIf j > intSizeOfArray Then

    j = 1

    ElseIf intMagSqInNum(j, i) > 0 Then

    i = i + 2: j = j - 1

    End If

    intMagSqInNum(j, i) = k

    i = i - 1: j = j + 1

    Next k

    Case Is = 7

    ' 4 9 2

    ' 3 5 7

    ' 8 1 6

    i = intAverArray: j = intSizeOfArray

    For k = 1 To intSizeOfArray ^ 2

    If i > intSizeOfArray And j > intSizeOfArray Then

    i = i - 1: j = j - 2

    ElseIf i > intSizeOfArray Then

    i = 1

    ElseIf j > intSizeOfArray Then

    j = 1

    ElseIf intMagSqInNum(j, i) > 0 Then

    i = i - 1: j = j - 2

    End If

    intMagSqInNum(j, i) = k

    i = i + 1: j = j + 1

    Next k

    Case Is = 8

    ' 2 7 6

    ' 9 5 1

    ' 4 3 8

    i = intSizeOfArray: j = intAverArray

    For k = 1 To intSizeOfArray ^ 2

    If i > intSizeOfArray And j < 1 Then

    i = i - 2: j = j + 1

    ElseIf i > intSizeOfArray Then

    i = 1

    ElseIf j < 1 Then

    j = intSizeOfArray

    ElseIf intMagSqInNum(j, i) > 0 Then

    i = i - 2: j = j + 1

    End If

    intMagSqInNum(j, i) = k

    i = i + 1: j = j - 1

    Next k

    End Select

    MagSqInNum = intMagSqInNum

    End Function



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


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

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


    написать администратору сайта