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

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

Dark Republic

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


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

Если говорить простыми словами, то

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

А если более заморочено, то wikipedia говорит нам:

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

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

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


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

Криптография очень пригодна ИБ специалисту, т.к. за частую без нее никак)

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


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

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

Иными словами

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

Познакомившись с новыми для некоторых определениями идем далее. 

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

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

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

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

Этот ключь должен быть как у отправителя, так и у получающей стороны.


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

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

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

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

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


[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=

Также мы можем и декодировать, для этого пропишите

base64 -d

Далее пишем наше закодированное сообщение и жмем CTRL+D

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

Base32.

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

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

В конце закодированого сообщения будут специальные символы(=), ситуация одинакова с base64.

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

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()



Report Page