mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-22 10:44:17 +00:00
1.8 KiB
1.8 KiB
attacco avanzato che può essere effettuato da un adaptive chosen-ciphertext attacker.
Codice di esempio per cipher block chaining operation mode
Non è stata effettuata una code review su questo codice.
Utilizzatelo (anche per studiare) a vostro rischio e pericolo.
# Un attaccante CCA2 conosce il ciphertext e ha accesso alla funzione di decifratura.
cipherblock = b"abcdefgh"
blocksize = len(cipherblock)
decrypt = lambda plaintext: ...
# Vogliamo trovare il contenuto dell'ultimo blocco di un plaintext.
# Usiamo un array di bytes temporaneo in cui inseriamo le scoperte che abbiamo fatto.
tempblock = bytearray(blocksize)
# Per ogni byte del cyphertext...
for idx, cipherbyte in enumerate(cipherblock):
# Per ogni possibile valore di un byte...
for byte in range(256):
# Crea un blocco vuoto, che farà da "initialization vector" per la funzione di decifratura
exploitblock = bytearray(blocksize)
# Imposta il byte corrente a `byte`
# (-idx-1) seleziona l'idxultimo byte
exploitblock[-idx-1] = byte
# Se esistono, imposta i byte successivi al corrente in modo tale da formare un padding valido
for nex in range(idx):
exploitblock[-nex-1] = byte ^ tempblock
# Prova a decifrare il nostro testo concatenato al blocco di ciphertext.
try:
resulttext = decrypt(exploitblock + cipherblock)
except PaddingError:
# Se la funzione dà un errore di padding, ricomincia con un valore di padding diverso.
continue
# Prendi l'ultimo blocco del testo risultante.
resultblock = resulttext[-blocksize:]
# Abbiamo trovato l'ultimo byte del blocco intermedio (e quindi anche del plaintext, ma ci arriveremo dopo)
tempblock[-idx-1] = byte ^ resultblock[-idx-1]
break
# Invertiamo lo XOR e abbiamo trovato il plaintext!
plainblock = cipherblock ^ tempblock