Криптография,
карго-культ
и крафтовая энтропия
Дмитрий Грошев
@lambdadmitry
О чём этот доклад
- Непонимание механизмов порождает мифы
- «Для Настоящей Криптографии™ нужен Настоящий Рандом™»
- «/dev/urandom – не кошерно, нужна Физическая Энтропия™»
- Утверждения в кавычках – ерунда
План
- На каких китах стоит криптография
- AES-CTR
- [Тривиальный вывод]
Шутка. К чертям это старьё
Пожалуй, главный кит
(начиная примерно с WW2)
- «Выглядит надёжно» => доказательства
- One-time pad
- "One-time pads are "information-theoretically secure" in that the encrypted message (i.e., the ciphertext) provides no information about the original message to a cryptanalyst (except the maximum possible length of the message)." – wiki
Заметки на полях:
- Существуют разные классы «доказанной безопасности» – IND-CCA, IND-CPA, semantically secure, information-theoretically secure, …
- Девелоперы Телеграма очень плохи, не будьте, как они!
Проблемы с шифрблокнотом
- Длина «ключа» равна длине сообщения
- Пичалька :(((
- Можем ли мы лучше?
- Дааа! Но нужно больше слов
Криптографические примитивы
Разные уровни:
- RF/PRF/PRP/…
- AES/ChaCha/…
- Построение
- Библиотека/бинарник/…
RF = Random Function,
PRF = PseudoRandom Function,
PRP = PseudoRandom Permutation
Hun… Oracle games
Строго говоря, PRF != RF, но полагаются неотличимыми
------- x -------------
| | <---------- | |
| ??? | f(x) | Adversary | =======> f = RF? f = PRF?
| | ----------> | |
------- -------------
Подводный камень: PRP != PRF
(перестановка != функция,
суръекция != биекция)
AES
- f[key](x128bits) => y128bits, f биективна
- Больше ничего знать не надо (почти)
- Не очень полезно
Построение
- Как превратить 128 бит в миллиард гигабайт?
- AES-CBC, AES-CTR, …
- Требуется доказательство!
AES-CTR
- Классный! Надёжный, параллельный, можно искать
- Подводный камень: уникальность nonce
- Практически one-time pad при условии неотличимости шифртекста от случайного текста
AES-CTR, ещё раз
- Базируется на верности того, что:
- AES это PRP
- PRP ~ PRF
- PRF ~ RF
- Генератор истинных случайных чисел это RF
AES-CTR и /dev/urandom
- /dev/urandom генерирует последовательность псевдослучайных бит из «настоящей энтропии»
- AES-CTR генерирует последовательность псевдослучайных бит из ключа и входа
- Найдите три отличия!
AES-CTR и /dev/urandom
- Если AES[key](nonce|counter) отличим от истинно случайной последовательности, AES-CTR небезопасен
- 128 бит «настоящей энтропии» и персистентного счётчика должно быть достаточно для каждого!
Дима, но как же rekeying?!
- Возможно, вы слышали, что ключи стоит менять
- AES ~ PRP, PRP != PRF, это «становится заметно» после примерно 264 блоков
- 264 блоков > 250 миллионов ТБ
- Сломанное доказательство != практическая атака
- Даже если вы столько шифруете, /dev/urandom «сменит ключ» гораздо, гораздо раньше