---
# System prepended metadata

title: Модуль №2
tags: [MOE]

---


## Основы криптографии

:::    success
- Основные понятия
- Базовые принципы работы криптоалгоритмов
- Симметричное/асимметричное шифрование
- Хэширование
- Принципы безопасной передачи данных
- Пример атак
:::


### Базовые принципы работы криптоалгоритмов

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

Все алгоритмы безопасны до того момента пока не найдется математический инструмент способный их обойти.

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

Абсолютной стойкостью для алгоритма шифрования являются условия:

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

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

Алгоритм DES:

![](https://hackmd.io/_uploads/H1uCpuNc2.png)

Алгоритм AES:

![](https://hackmd.io/_uploads/SyReAO4qn.png)

Алгоритм ГОСТ 28147-89:

![](https://hackmd.io/_uploads/H1_BRdE9n.png)

Алгоритм RSA:

![](https://hackmd.io/_uploads/ryok1tVq3.png)


### Симметричное/асимметричное шифрование

Основное отличие количество ключей и их использование.

- Симметричная криптография = 1 ключ для шифрования и расшифровки
- Ассиметричная криптография 2 ключа, 1 для шифрования, 1 для расшифрования



### Хэширование

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

Примеры алгоритмов:

- Argon2, scrypt, bcrypt or PBKDF2
- md5, sha1
- ...

Примеры хэшей:

md5 - f806fc5a2a0d5ba2471600758452799c
sha1 - f1cf651ce1a2191a760c0b2f161234f7958e26e4
pbkdf2 - sha256:4096:bEJJem5JcTI=:mvW7jv+5py4wiLhB7AnGUN3xJmKw6Z1c



### Принципы безопасной передачи данных

- Использование только криптостойких алгоритмов для передачи данных
- Обмен ключами только по доверенному каналу или с использованием алгоритмов обмена ключами
- Запрет на использование алгоритмов для обратной совместимости

Пример настройки соединения TLS:
![](https://hackmd.io/_uploads/HkM3nks52.png)



### Примеры атак

Padding Oracle - https://github.com/PortSwigger/padding-oracle-hunter
Bit Flip Attack - атака, при которой есть возможность влиять на данные, которые будут участвовать при расшифровке сообщения.


### Методы противодействия

TLS 1.3 больше не поддерживает CBC режимы алгоритмов:

{0x13,0x01} - TLS_AES_256_GCM_SHA384
{0x13,0x02} - TLS_CHACHA20_POLY1305_SHA256
{0x13,0x03} - TLS_AES_128_GCM_SHA256
{0x13,0x04} - TLS_AES_128_CCM_8_SHA256
{0x13,0x05} - TLS_AES_128_CCM_SHA256

Но даже в этом наборе стоит помнить, о правилах использования ключей и параметров алгоритмов.

### Практическая плоскость

**Рандомизаторы** - основной механизм, который используется для работы с приложениями и, в частности в веб.

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

- Сессионные токены
- Токены для 2FA
- Токены для CAPTCHA
- ...

#### Линейный конгруэнтный PRNG

Самый распространенный пример - java.util.Random

Случайное число этим генератором создается на основании состояния генератора. Чтобы его можно было привести в это самое состояние, используют так называемый seed. 

```seed = (seed * multiplier + addebd) mod(2^precision)```

Любой seed по сути является ограничителем для данного типа генератора. Кстати, для этой версии максимальная длина случайного числа будет почти 48 бит.



:::     danger

Практика с Burp по определению случайности последовательности.

:::

### Дополнительные материалы

- https://hashcat.net/hashcat/
- https://cryptohack.org