camp-creepy-crypto/01-01-symmetric.md
2018-10-23 14:38:18 +03:00

11 KiB
Raw Blame History

class: animation-fade layout: true


class: impact

Криптография

без криптокупюр


One Time Pad

--

  • Что это?
    Схема шифрования (Cipher).

--

$ c = E(k, m) $

```
   7 (H)   4 (E)  11 (L)  11 (L)  14 (O) сообщение (m)
+ 23 (X)  12 (M)   2 (C)  10 (K)  11 (L) ключ шифрования (k)
= 30      16      13      21      25     m + k
=  4 (E)  16 (Q)  13 (N)  21 (V)  25 (Z) (m + k) mod 26
      E       Q       N       V       Z  → шифротекст (c)
```

-- m = D(k, c)

```
    4 (E)  16 (Q)  13 (N)  21 (V)  25 (Z) шифротекст (c)
-  23 (X)  12 (M)   2 (C)  10 (K)  11 (L) ключ шифрования (k)
= -19       4      11      11      14     c  k
=   7 (H)   4 (E)  11 (L)  11 (L)  14 (O) c  k (mod 26)
       H       E       L       L       O  → сообщение (m)
```

One Time Pad

  • Какая задача?
    Конфиденциальность (Confidentiality).

--

- Возможность скрыть от посторонних глаз содержимое сообщения.

--

  • Насколько он хорош в этой задаче?
    Идеально хорош. 🌝

--

- Обладает свойством _perfect security_. 

-- - Не раскрывает ни крупицы информации об исходном сообщении.

-- - Лучшее, что есть в криптографии.

--

  • Почему же им никто не пользуется?
    Непрактично. 🌚

--

- Размер _ключа_ должен быть не меньше размера _сообщения_.

-- |K| \gg |M|


One Time Pad

During WWII the Soviet Union could not produce enough one-time pads ... to keep up with the enormous demand .... So, they used a number of one-time pads twice, thinking it would not compromise their system. American counter-intelligence during WWII collected all incoming and outgoing international cables. Beginning in 1946, it began an intensive effort to break into the Soviet messages with the cooperation of the British and by ... the Soviet error of using some one-time pads as two-time pads, was able, over the next 25 years, to break some 2900 messages, containing 5000 pages of the hundreds of thousands of messages that had been sent between 1941 and 1946 (when the Soviets switched to a different system).

Harvey Klehr


Symmetric ciphers


Stream ciphers

--

  • Например, One Time Pad.

--

  • Как решить проблему с длиной ключа?

--

  • Ответ есть!
    CSPRNG!

--

<img src="assets/kot_gosha.jpg" style="width: 50%;" />

Stream ciphers

CSPRNG

Криптографический генератор псевдослучайных чисел (Cryptographically secure pseudo-random number generator).

--

  • Эффективный
    детерминированный
    --
    алгоритм G = (S, R).

--

  • На вход подаётся seed s \in S, S = \\{0,1\\} ^ l.

--

  • В результате последовательность r \in R, R = \\{0,1\\} ^ L.

--

  • l \ll L!

Stream ciphers

Схема шифрования

Имея на руках надёжный генератор случайных чисел, мы можем шифровать сообщения, гарантируя их конфиденциальность.

--

  • E(s, m) := G(s)[0 .. v - 1] \oplus m

--

  • D(s, c) := G(s)[0 .. v - 1] \oplus c

--

XOR

0 0 1 1 = n
\oplus 0 1 0 1 = m
= 0 1 1 0

-- | \oplus | 0 | 1 | 0 | 1 | = m | | | 0 | 0 | 1 | 1 | = n |


Semantic security

--

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

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

--

  • Злоумышленники обладают ограниченными вычислительными ресурсами.

--

  • Схема шифрования надёжна, если вероятность извлечь информацию из шифротекста крайне мала.

--

- например, $ \varepsilon \leq \frac{1}{2 ^ {80}} $,
- но не $ \varepsilon \geq \frac{1}{2 ^ {30}} $

Semantic security

Вероятностный эксперимент

--

  • Мы хотим, чтобы вывод генератора был неотличим от случайного набора бит.

--

  • Предложим злоумышленнику сыграть в игру, где он:
    • выбирает пару сообщений (m_0, m_1 \in M),
    • передаёт их честному судье,
    • судья выбирает случайно одно из сообщений (b \xleftarrow{R} \\{0, 1\\}),
    • шифрует его при помощи случайного набора бит (c \leftarrow m_b \oplus \\{0,1\\}^l),
    • и возвращает злоумышленнику;
    • тот должен решить, первое или второе сообщение было зашифровано (b^\prime \leftarrow \\{0, 1\\}).

--

  • Вероятность выбрать правильный вариант Pr[b = b^\prime] = \frac{1}{2}.

Semantic security

Вероятностный эксперимент

Схема надёжна, если |Pr[b_1 = b_1^\prime] - Pr[b_2 = b_2^\prime]| \leq \varepsilon.


Stream ciphers

Надёжность

  • Stream cipher семантически надёжен, если злоумышленник не может предсказать следующий бит вывода генератора случайных чисел, если ему известны все предыдущие.
    Но неизвестно внутреннее состояние, заданное секретным ключом.
    --
    Генератор считается непредсказуемым (Unpredictability).

--

  • Но что если мы модифицируем игру?
    Дадим злоумышленнику возможность сформировать более одной пары сообщений.

--

$ c_1 \leftarrow m_1 \oplus G(k) $

$ c_2 \leftarrow m_2 \oplus G(k) $

$ m^\prime \leftarrow c_1 \oplus c_2 $

Stream ciphers

Надёжность

  • Текст на естественном языке неслучаен, в m^\prime много информации об исходном сообщении!

--

  • Если шифровать файлы, в заголовках которых часто встречается один и тот же набор бит, можно раскрыть часть вывода генератора!

--

Stream cipher нельзя использовать для шифрования различных сообщений с одним и тем же ключом!


Block ciphers

--

\\{ E(K, M), D(K, C) \\}

K \in \\{0,1\\}^k

M, C \in \\{0,1\\}^n

--

AES

  • Блоки размера 128 бит.
  • Ключ размера 128, 192 или 256 бит.

Block ciphers

Надёжность

  • Можно использовать один и тот же секретный ключ более одного раза.
    Устойчив к модифицированной игре со злоумышленником.
    --
    Называется Chosen Plaintext Attack, сокращённо CPA.

--

  • Злоумышленник должен отличить схему шифрования от идеально случайной функции перестановки (Perfect Random Permutation).

    k \xleftarrow{R} K, f \leftarrow E(k, \cdot) \Rightarrow |E(k, \cdot)| = |K| = 2^k

    f \xleftarrow{R} Perms[M] \Rightarrow |Perms[M]| = |M|! \approx 2^{2^{135}}

--

  • Блоки ограниченного размера. Как зашифровать сообщение любой длины?

Block ciphers

Electronic Code Book (ECB)

Что если мы просто разобьём на блоки и зашифруем каждый блок по отдельности?

--

  • Не является семантически надёжной схемой.
    Блоки с одним и тем же содержимым шифруются в идентичный шифротекст.

    m_1 = m_2 \Rightarrow c_1 = c_2


Block ciphers

Deterministic Counter Mode (CTR)

Что если мы разобьём на блоки и будем складывать их содержимое с результатом шифрования номера блока?

m[0] m[1] ... m[l]
\oplus E(k,0) E(k,1) ... E(k,l)
= c[0] c[1] ... c[l]

--

  • Нельзя использовать один и тот же ключ дважды.
    Как и в случае со stream cipher.

Block ciphers

Cipher Block Chaining (CBC)

Что если мы используем случайность для схемы шифрования?

Введём Initial Vector (IV) блок, состоящий из случайного набор бит.

--

  • IV часть шифротекста.

--

  • Схема, надёжная относительно CPA.

class: impact

Криптопауза


  • PKCS7 padding

  • AES CBC padding oracle

  • Будет пятисотить на невалидный padding в последнем блоке

  • http://10.4.52.9:8000/

    • POST
    • formdata
    • ct={ciphertext}
0BE60A54AD58CDE624660AA544506937
A4208766F51D2D1947AC7E63391B6680
808F4EFEE37AB03C320A2D89279F5129
18AB43988F86EFE751001965F6C043FF