Статья [Начинающим] - Криптография. Введение.

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

-------------------------------------------------------------------------------------------------

[1] - Что изучает криптография.

Если говорить простыми словами, то
Криптография - наука изучающая методы обеспечения безопасности информации.

А если более заморочено, то wikipedia говорит нам:
Криптография - наука о методах обеспечения конфеденциальности(невозможности прочтения информации посторонним), целостности данных (невозможности незаметного изменения информации), аутентификации(проверки подлинности авторства или иных свойств объекта), а также невозможности отказа от авторства.

Это невероятная наука которая на самом деле существует вот уже несколько тысяч лет. Мы живем в мире обетованом безграничным количеством информации. В этом мире есть и люди, жадно впитывающие в себя всю информацию. Так вот криптография защитит нас от опасности раскрытия конфеденциальных данных.

В основном криптография занимается изучением методов шифрования информации, разробатывая для этого различные алгоритмы(с некоторыми из них мы сегодня познакомимся).


[2] - Где вам оно понадобится.

Криптография очень пригодна ИБ специалисту, т.к. за частую без нее никак)
Часто задания связаные с криптографией встречаются на CTF соревнованиях. Мы сегодня разберем малую часть таких заданий. В дальнейшем они будут все трудней. Чем выше в гору вы взберетесь, тем трудней вам будет.



[3] - Что такое шифрование и как оно осуществляется.

С шифрованием мы имеем дело повседневно. Когда мы находимся на веб ресурсе с протоколом https, когда разговариваем по телефону, говорим текст наоборот(редкие случаи:)), и все этому подобное..
Иными словами
Шифрование - кодирование информации с целью обеспечить конфеденциальность и защиту(чаще всего передоваемой информации).

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

Декодирование - возвращение информации в нормальную(удобную) форму.

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

[3.1] - Симметричное шифрование.

В симетричном шифровании используют один ключь. Этот ключь преднозначен для

  • Кодирования информации(в скором поймете зачем нужны ключи)
  • Декодирование информации.
Этот ключь должен быть как у отправителя, так и у получающей стороны.
symmetric_encryption_graphic_ru.png


[3.2] - Асимметричное шифрование.

Тут дела обстаят интересней. В асимметричном шифровании используют 2 ключа(публичный и закрытый).

Первый - для шифрации.
Второй - для дешифрации.

Эти ключи не должны быть одинаковы. Отсюда собственно и название - асимметричные. Для каждой стороны достаточно иметь и одного ключа.

asymmetric_encryption_graphic_ru.png



[4] - Кодируем информацию с base(64/32/16)

Не молодая кодировка base - алгоритм кодирования информации.
В чем отличия между 64/32/16? - А самое наиглавнейшее отличае в алгоритме. Там информация разделяется на группы. И в каждой кодировке base свое кол-во символов в одной группе. Поясняю.


Base64.

В алфавите a-z, A-Z, 0-9, ?, +. И так, всего в его алфавите 64 символа. Также, в конце шифрования может быть знак "=". Он появляется из-за лишнего нулевого байта. А связано это стем, что при кодировании алгоритм переводит сообщение в двоичную систему которую должен разделить на равные группы. Так вот при нехватке для полноты равенства добавляется 0.

Мы можем как закодировать так и декодировать информацию в base64 без использования ключа.
Откройте свой терминал *nix.
Для работы с этим алгоритмом нам потребуется инструмент который предустановлен в систему. Это base64)
Давайте закодируем сообщение "CoDeBy123"
Для этого запускаем base64.
Код:
base64
Далее пишем наш текст и зажимаем CTRL+D.
Получаем закодированное в base64 сообщение

Код:
Q29EZUJ5MTIzCgo=

2017_12_02_02.06.35-1-1-1.png

Также мы можем и декодировать, для этого пропишите
Код:
base64 -d
Далее пишем наше закодированное сообщение и жмем CTRL+D
2017_12_02_02.09.35-1.png

Или же для работы с алгоритмом кодирования base, можете воспользоватся какими-либо специальными ресурсами.

Base32.

Он не далек от base64, но отличен тем, что

  • В алфавите 32 символа. С A-Z(иногда a-z) и 2-7.
  • При приобразовании, делим на группы так, чтоб в каждой группе было по 5 бит информации.
В конце закодированого сообщения будут специальные символы(=), ситуация одинакова с base64.

В терминале используется аналогично предыдущему.

2017_12_02_02.21.06-1.png

2017_12_02_02.21.42-1.png


Base16.

Этот алгоритм "основан" на шеснадцатиричной системе и содержет в алфавите 16 символов. С A-F и 0-9
При кодировании весь алгоритм не меняется, разве что в группе по 4 бита.


А теперь предлогаю вам решить парочку заданий.

Задание 1.

Определите кодировку и расшифруйте сообщение ниже. Дешифрованый текст и есть ответ.
Код:
MZWGCZZAFUWT4ICNPFIGCU3TK5XVEZBVGQ3AUCQ=

Задание 2.

Какая из кодировок ниже является base64?
Код:
1. MJQXGZJTGIFA====
2. YmFzZTY0Cg==
3. 626173653634

[5] - Base в Python.

В Python имеется библиотека base64. В ней содержится много плюшек. В том числе и кодирование в base64/32/16

Давайте напишем простую программку которая будет кодировать/декодировать сообщение. Я набросал не много, это сильно автоматизирует действия.

Код:
import base64

bord = """

[1] - Encode
[2] - Decode

"""
print(bord)
my_input_one = input("--> ")

def decoder():
    x = input("Enter base --> ")
    my_input_two = input("Enter base(64/32/16) -> ")
    if my_input_two =="64":
        a = base64.b64decode(x.encode("utf-8"))
        print("Output --> ",a.decode("utf-8"))

    elif my_input_two == "32":
        a = base64.b32decode(x.encode("utf-8"))
        print("Output --> ",a.decode("utf-8"))

   elif my_input_two == "16":
        a = base64.b16decode(x.encode("utf-8"))
        print("Output --> ",a.decode("utf-8"))


def encoder():
    x = input("Enter text --> ")
    my_input_two = input("Enter base(64/32/16) -> ")
    if my_input_two =="64":
        a = base64.b64encode(x.encode("utf-8"))
        print("Output --> ",a.decode("utf-8"))

    elif my_input_two == "32":
        a = base64.b32encode(x.encode("utf-8"))
        print("Output --> ",a.decode("utf-8"))

   elif my_input_two == "16":
        a = base64.b16encode(x.encode("utf-8"))
        print("Output --> ", a.decode("utf-8"))

if my_input_one == "1":
    encoder()
elif my_input_one == "2":
    decoder()

И вот что вышло
2017_12_02_03.09.48-1.png

2017_12_02_03.10.23-1.png


До встречи в следующей части!

 
Статья несет очень полезную информацию. Спасибо огромное за статью, она заслуживает отметки "нравится", но прошу проверять текст на ошибки, перед ее выпуском. Еще раз спасибо.
 
Автор, просто красава. Обьяснил все детально .Жду с нетерпением, следующую часть...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!