1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-25 19:44:18 +00:00
appunti-steffo/8 - Crittografia applicata/2 - Comunicazione simmetrica/3 - Indistinguibilità/attacco contro initialization vector prevedibili.md
2023-09-21 02:46:23 +02:00

2.2 KiB

attacco contro cifrario a blocchi che sfrutta il determinismo dell'initialization vector per vincere l'esperimento IND-DCPA.

Requsiti

Funzionamento

Fase iniziale

  1. 😈 L'avversario sceglie un plaintext m_1 di dimensione di un blocco.
  2. ✉️ Lo comunica allo sfidante.
  3. 😇 Lo sfidante sceglie un initialization vector iv_1.
  4. 😇 Mescola il plaintext con l'initialization vector, creando m_1' = m \oplus iv_1.
  5. 😇 Calcola il ciphertext c_1 = encrypt(m_1')
  6. ✉️ Comunica ciphertext c_1 e initialization vector iv_1 all'avversario.

esperimento IND-CPA

  1. 😈 L'avversario usa l'initialization vector iv_1 ricevuto per determinare quello successivo, iv_2.
  2. 😈 Calcola un plaintext speciale, m_2 = m_1' \oplus iv_2.
  3. ✉️ Lo comunica allo sfidante.
  4. 😇 Lo sfidante sceglie un initialization vector uguale a quello predetto dall'avversario, iv_2.
  5. 😇 Mescola il plaintext con l'initialization vector, m_2' = m_2 \oplus iv_2 = m_1' \oplus iv_2 \oplus iv_2 = m_1'.
  6. 😇 Calcola il ciphertext c_2 = encrypt(m_2') = encrypt(m_1') = c_1.
  7. 😇 Come parte dell'esperimento IND-CPA sceglie se inviare dati casuali oppure il ciphertext c_2.
  8. ✉️ Lo comunica all'avversario.
  9. 😈 L'avversario è sempre in grado di distinguere ciphertext da dati casuali in quanto sa che il ciphertext sarà uguale a quello precedente, c_1 = c_2.

Codice di esempio

### Modificato dall'originale del prof. Ferretti.

>>> from os import urandom

>>> key = urandom(16)
>>> iv1 = urandom(16)
>>> iv2 = urandom(16)

>>> m1 = b'a' * 16
>>> c1 = encrypt(key, iv1, m1)
>>> c2 = encrypt(key, iv2, bxor(m1, iv1, iv2))

>>> print(f'{c1.hex()=}')
c1.hex()='fc5016bf41ec909e1dae7a6dd7102f0d'

>>> print(f'{c2.hex()=}')
c2.hex()='fc5016bf41ec909e1dae7a6dd7102f0d'