Криптография, или как зашифровать свое послание

  • Автор темы Admin

Admin

#1
Администратор
Регистрация
31.12.2019
Сообщения
6,888
Реакции
25
https://telegra.ph/file/499c3217440f7cc9c3ffe.png


Криптография, или как зашифровать свое послание?(globalwinner228 к конкурсу статей 2020)

Многие задаются вопросом как зашифровать свое послание или что такое криптография? Одним словом криптография - наука о математических методах шифрования посланий. Развилась из-за практической необходимости передавать важные сведения самым надежным образом. В этой статье я расскажу вам об некоторых методах шифрования. Параллельно с теорией я покажу всё на практике, а также покажу собственную программу для шифрования. Я сам ее создал. Погнали!


Начнем с самого простого что такое шифрование и каких оно бывает видов.
Обо всем я рассказал в видео ниже.


https://youtu.be/qEqg2KeD3DM


Следует вопрос – как именно можно зашифровать сообщение? Для этого используют криптоалгоритмы – методы шифрования. Потребность в их использовании появилась очень давно. Вернемся на несколько тысячилетий назад и поговорим об первых методах шифрования. Первым известным применением криптографии принято считать использование специальных иероглифов около 4000 лет назад в Древнем Египте. Криптография египтян использовалась не с целью затруднить чтение, а скорее всего, со стремлением писцов превзойти друг друга в остроумии и находчивости, а также с помощью необычности и загадочности, привлечь внимание к своим текстам. Примеры использования криптографии можно встретить в священных иудейских книгах, в том числе в книге пророка Иеремии, где использовался простой метод шифрования под названием атабаш - простой шифр подстановки для аалфавитного письма. Правило шифрования состоит в замене i-й буквы алфавита буквой с номером n-i+1, где n — число букв в алфавите.​

https://i.ibb.co/JzymyGW/image.png

Скитала, также известная как «шифр древней Спарты», также является одним из древнейших известных криптографических устройств. Бесспорно известно, что скитала использовалась в ********************е Спарты против Афин. Скитала представляла собой длинный стержень, на который наматывалась лента из пергамента. На ленту наносился текст вдоль оси скиталы, так, что после разматывания текст становился нечитаемым. Для его восстановления требовалась скитала такого же диаметра. Считается, что автором способа взлома шифра скиталы является Аристотель, который наматывал ленту на конусообразную палку до тех пор, пока не появлялись читаемые куски текста.

https://telegra.ph/file/4c4fd16101e8348a8d634.jpg

С именем Энея Тактика связывают несколько техник шифрования и тайнописи.

1)Диск Энея:

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

2)Линейка Энея:

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

3)Книжный шифр:

В своём сочинении «О перенесении осады» Эней описывает ещё одну технику тайнописи, позже названную «книжным шифром». Он предложил делать малозаметные дырки рядом с буквами в книге или другом документе[17]. Много позже аналогичный шифр использовали немецкие шпионы во время Первой мировой ********************ы.

https://telegra.ph/file/34fb0e49177de1ab06a15.jpg

Вот я рассказал вам об первых методах и приборах шифрования. Ну а перед тем как мы перейдем к современным криптоалгоритмам хотелось би рассказать вам интересную историю об Энигме – одной из первых шифровальных машин. Она использовалась Германией во времена Второй Мировой ********************ы. Вот собственно и она:

https://telegra.ph/file/7dcd6a55324fdf6a50590.jpg

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

https://telegra.ph/file/b17c24ce45d28bd86b971.jpg
https://telegra.ph/file/3a2a6dd4f294ef3eb3918.jpg

Обо всех особенностях машинки, а также об методе шифрования я рассказал(точнее перевел) в видео ниже. Приятного просмотра!

https://youtu.be/zXrjTb3k5Ok

Теперь перейдем к современным методам шифрования. Их очень много и их разделяют на бесключевые, одноключевые и двухлучевые. Здесь я расскажу только про самые интересные или самые используемые криптоалгоритмы.

https://telegra.ph/file/deade1f54c42aa4878d38.gif

Бесключевые:

Есть довольно много бесключевых алгоритмов таких как MD2, Tiger, Sha – 1/2, Sha – 3, и другие. Я не буду рассказывать про каждый отдельно. Я всего лишь разглашу вам об них в общем. Бесключевые КА(криптографические алгоритмы) — алгоритмы которые не используют в вычислениях никаких ключей. Чаще всего они представляют из себя хеш-функции. Хеш-функция — функция, осуществляющая преобразование массива входных данных произвольной длины в битовую строку установленной длины, выполняемое определённым алгоритмом(без ключа). Обычно хеширование(использование хеш-функций) используют на сайтах где есть регистрация. С ёе помощью можно зашифровать пароль. Хеш-функция работает так что зашифровать легко, а расшифровать сложно. Зашифрованный текст обычно подается в 16-ричной системе счисления.

Одноключевые:

Этого вида алгоритмов так же является очень много. Я расскажу лишь про самые интересные или самые популярные алгоритмы. Погнали!

Шифр Цезаря

Это один из самых простых алгоритмов. И в тоже время один из самых популярных. Эго очень часто используют из-за простоты. Он является одноключевым(ключом есть цифра – количество сдвигов). А теперь подробнее про его работу. Допустим мы выбрали ключ 3:

https://telegra.ph/file/ccbbe14ce2bb50461e288.png

Вот примерно так он и работает. Каждую букву в исходном слове(словосочетании или предложении) мы сдвигаем на н(где н - ключ) единиц вправо по алфавиту. А теперь интересная история. Как думаете зачем Цезарь создал алгоритм? Дело в том что Юлий Цезарь просто не доверял своим подданым и был уверен что среди своих – крыса. Исходя из этих фактов, великий император решил создать шифр и использовать его в военных переписках. Ну что же надеюсь вы поняли как работает алгоритм. Тепер вы можете использовать его в личных целях. Чуть чуть оторвемся от теми. Как я и обещал в начале статьи я вам покажу мою программу для шифрования сообщений. Вот как она виглядит:

https://telegra.ph/file/8a2bb24d953990aab52c4.jpg

Что же можно здесь сделать? Можно прочитать термин шифрование. Можно начать работать. Нажимаю на кнопку Начать:

https://telegra.ph/file/6648300595778064f62c4.jpg

Здесь можно выбрать алгоритм шифрования с каким вы хотите работать. Здесь их только 5. Работают 2. Программы нету в доступе. Как только я добавлю побольше(ка минимум 10) алгоритмов я создам статью где опишу полностью программу и дам ссылку на скачивание. Ну а теперь к реализации шифра Цезаря. Надеюсь все знают C#. Я реализовал алгоритм именно на этом языке. Реализация:

Код:
public class CaesarCipher
        {
            //символы русской азбуки
            const string alfabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

            private string CodeEncode(string text, int k)
            {
                //добавляем в алфавит маленькие буквы
                var fullAlfabet = alfabet + alfabet.ToLower();
                var letterQty = fullAlfabet.Length;
                var retVal = "";
                for (int i = 0; i < text.Length; i++)
                {
                    var c = text[i];
                    var index = fullAlfabet.IndexOf(c);
                    if (index < 0)
                    {
                        //если символ не найден, то добавляем его в неизменном виде
                        retVal += c.ToString();
                    }
                    else
                    {
                        var codeIndex = (letterQty + index + k) % letterQty;
                        retVal += fullAlfabet[codeIndex];
                    }
                }

                return retVal;
            }

            //шифрование текста
            public string Encrypt(string plainMessage, int key)
                => CodeEncode(plainMessage, key);

            //дешифрование текста
            public string Decrypt(string encryptedMessage, int key)
                => CodeEncode(encryptedMessage, -key);
        }
Вот код. Это все функции и методы для алгоритма. Вот как всё выглядит в программе:

https://telegra.ph/file/aa42162e9247a18d66746.jpg

Не буду комментировать. Здесь всё ясно и понятно.
Примеры:

https://telegra.ph/file/e80fadd695b15b35b5e46.png
https://telegra.ph/file/26d565d3f2e5fc711f82b.jpg


Всё предельно просто!

Шифр Виженера
Этот шифр очень похож на предыдущий. Шифр Виженера представляет собой несколько шифров Цезаря. В шифре Цезаря каждая буква алфавита сдвигается на несколько позиций; например в шифре Цезаря при сдвиге +3, A стало бы D, B стало бы E и так далее. Шифр Виженера состоит из последовательности нескольких шифров Цезаря с различными значениями сдвига. Для зашифровывания может использоваться таблица алфавитов, называемая квадрат Виженера. Применительно к латинскому алфавиту таблица Виженера составляется из строк по 26 символов, причём каждая следующая строка сдвигается на несколько позиций. Таким образом, в таблице получается 26 различных шифров Цезаря. На каждом этапе шифрования используются различные алфавиты, выбираемые в зависимости от символа ключевого слова.
Например, предположим, что исходный текст имеет такой вид: Програмист, а за ключ возьмем слово – Хакер.
Таким образом, ми получим слово ЕРЩЗБХМУЦГ(расшифрованное - програмист). Я также реализовал алгоритм в своей программе. Таблца Виженера:


https://telegra.ph/file/316bba9125ff2841042c1.png


Код шифра Виженера:


Код:
public class VigenereCipher         {             const string defaultAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";             readonly string letters;              public VigenereCipher(string alphabet = null)             {                 letters = string.IsNullOrEmpty(alphabet) ? defaultAlphabet : alphabet;             }              //генерация повторяющегося пароля             private string GetRepeatKey(string s, int n)             {                 var p = s;                 while (p.Length < n)                 {                     p += p;                 }                  return p.Substring(0, n);             }              private string Vigenere(string text, string password, bool encrypting = true)             {                 var gamma = GetRepeatKey(password, text.Length);                 var retValue = "";                 var q = letters.Length;                  for (int i = 0; i < text.Length; i++)                 {                     var letterIndex = letters.IndexOf(text[i]);                     var codeIndex = letters.IndexOf(gamma[i]);                     if (letterIndex < 0)                     {                         //если буква не найдена, добавляем её в исходном виде                         retValue += text[i].ToString();                     }                     else                     {                         retValue += letters[(q + letterIndex + ((encrypting ? 1 : -1) * codeIndex)) % q].ToString();                     }                 }                  return retValue;             }              //шифрование текста             public string Encrypt(string plainMessage, string password)                 => Vigenere(plainMessage, password);              //дешифрование текста             public string Decrypt(string encryptedMessage, string password)                 => Vigenere(encryptedMessage, password, false);         }


Код работает довольно просто. Теперь я покажу как это выглядит в самой программе и, конечно, покажу парочку примеров.


https://telegra.ph/file/2b10a67934650f48d77ed.jpg
https://telegra.ph/file/de67ebc29aae11a51bb45.jpg


DES
DES — алгоритм для симметричного шифрования, разработанный фирмой IBM и утверждённый правительством США в 1977 году как официальный стандарт (FIPS 46-3). Размер блока для DES равен 64 битам. В основе алгоритма лежит сеть Фейстеля с 16 циклами (раундами) и ключом, имеющим длину 56 бит.

Схема шифрования алгоритма:


https://telegra.ph/file/457b5d2d617abfe0c17ad.png


К сожалению в моей программе еще нет этого алгоритма. Скоро он в ней появится!

RSA

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

Этот алгоритм создали ученые американского университета МИТ:
Рональд Ривест


https://telegra.ph/file/9a9c5e5a3cadc17ef41f2.jpg


Ади Шамир


https://telegra.ph/file/e60d18394ec1cc3cab11c.jpg


Леонард Адлеман


https://telegra.ph/file/d63607cb7f6b28a67176b.jpg



Теперь перейдем к алгоритму шифрования.

RSA-ключи генерируются следующим образом:

Выбираются два различных случайных простых числа p и q заданного размера (например, 1024 бита каждое).

Вычисляется их произведение n = p*q , которое называется модулем.

Вычисляется значение функции Эйлера от числа n:

F(n)=(p-1)*(q-1)

Выбирается целое числое ( 1<e<F(n) ), взаимно простое со значением функции F(n) .

Число е называется открытой экспонентой

Обычно в качестве е берут простые числа, содержащие небольшое количество единичных бит в двоичной записи, например, простые из чисел Ферма: 17, 257 или 65537, так как в этом случае время, необходимое для шифрования с использованием быстрого возведения в степень будет меньше.

Слишком малые значения e , например 3, потенциально могут ослабить безопасность схемы RSA.

Вычисляется число d, мультипликативно обратное к числу e по модулю F(n) , то есть число, удовлетворяющее сравнению:

d*e=1 (mod F(n)).

Число d называется секретной экспонентой. Обычно оно вычисляется при помощи расширенного алгоритма Евклида.

Пара (e,n) публикуется в качестве открытого ключа RSA

Пара (d,n)играет роль закрытого ключа RSA и держится в секрете.


https://telegra.ph/file/b3fa762bdd9340f897860.jpg


Алгоритм шифрования:

Взять открытый ключ (e,n) Алисы

Взять открытый текст m

Зашифровать сообщение с использованием открытого ключа Алисы:

c = E(m) = m^e mod(n)

Алгоритм расшифрования:

Принять зашифрованное сообщение c

Взять свой закрытый ключ (d,n)

Применить закрытый ключ для расшифрования сообщения:

m = D(c) = c^d mod(n)

Алгоритм не простой. Не пугайтесь если сразу же его не поняли.

Ну и на этом пожалуй всё. Есть так же интересный алгоритм AES(как вы видели я планирую добавить его в мою программу). Огромное спасибо что прочитали мою статью до конца. Я не профессиональный писатель так что не судите строго. Если есть вопроси пишите в коментариях!


Автор: Globalwinner228
 

Members, viewing this thread

Сейчас на форуме нет ни одного пользователя.