mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-25 11:34:18 +00:00
2.2 KiB
2.2 KiB
attacco contro cifrario a blocchi che sfrutta il determinismo dell'initialization vector per vincere l'esperimento IND-DCPA.
Requsiti
- Conoscenza della funzione di cifratura utilizzata e possibilità di selezionare il plaintext da cifrare
- initialization vector non casualità crittografica
Funzionamento
Fase iniziale
- 😈 L'avversario sceglie un plaintext
m_1
di dimensione di un blocco. - ✉️ Lo comunica allo sfidante.
- 😇 Lo sfidante sceglie un initialization vector
iv_1
. - 😇 Mescola il plaintext con l'initialization vector, creando
m_1' = m \oplus iv_1
. - 😇 Calcola il ciphertext
c_1 = encrypt(m_1')
- ✉️ Comunica ciphertext
c_1
e initialization vectoriv_1
all'avversario.
esperimento IND-CPA
- 😈 L'avversario usa l'initialization vector
iv_1
ricevuto per determinare quello successivo,iv_2
. - 😈 Calcola un plaintext speciale,
m_2 = m_1' \oplus iv_2
. - ✉️ Lo comunica allo sfidante.
- 😇 Lo sfidante sceglie un initialization vector uguale a quello predetto dall'avversario,
iv_2
. - 😇 Mescola il plaintext con l'initialization vector,
m_2' = m_2 \oplus iv_2 = m_1' \oplus iv_2 \oplus iv_2 = m_1'
. - 😇 Calcola il ciphertext
c_2 = encrypt(m_2') = encrypt(m_1') = c_1
. - 😇 Come parte dell'esperimento IND-CPA sceglie se inviare dati casuali oppure il ciphertext
c_2
. - ✉️ Lo comunica all'avversario.
- 😈 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'