Il 20/02/2022 10:59, Davide Prina ha scritto:

*Di solito* (ma non necessariamente) l'operazione di cifratura è deterministica: dato [algoritmo,chiave,plaintext] viene sempre generato lo stesso cyphertext.
in realtà qui indicavo qualcosa di diverso, che secondo me potrebbe essere possibile. Prendo due algoritmi di cifratura diversi (o con chiavi diverse o...) su due testi diversi e il cifrato risultato è lo stesso.
Alg1 cifra Testo1 e ottiene Cifrato
Alg2 cifra Testo2 e ottiene Cifrato
Se non ti interessa il senso del secondo plaintext (p2) è banale:
p2=D(k2, E(k1, p1))
Ovvero decripti con k2 il cyphertext ottenuto cifrando il primo plaintext (p1) con k1. I due algoritmi per E e D possono essere uguali o diversi, basta che generino un blocco "compatibile" (normalmente basta che sia della stessa lunghezza, altrimenti sarebbe possibile determinare se un blocco di dati casuale è un testo criptato o meno, e questo sarebbe indesiderabile).

Secondo me, se si considerano solo gli algoritmi di cifratura che hanno come risultato una lunghezza "fissa" pari al testo da cifrare e dato che il numero di algoritmi è in teoria infinito, mentre il numero di combinazioni possibili su una lunghezza del Testox a piacere è finito si avranno per forza delle collisioni.
Dimostrato sopra. Con cifrari a blocchi (considerati più sicuri) hai da rilassare il vincolo sulla lunghezza del cyphertext aggiungendo un padding.

No, questo no. Oramai anche un telefonino può eseguire decine (se non centinaia) di cifrature a chiave pubblica al secondo.
dipende dall'algoritmo usato, dalla lunghezza della chiave, ... se arrivi a cifrare tutto il traffico, secondo me, introduci una latenza tale che il tuo dispositivo diventa inusabile.
Per traffico "normale" è indistinguibile. P.e. trasferire un file da 100M via https piuttosto che via http non ti porta una differenza percettibile, a meno che non lavori su hw veramente ridotto (Arduino, ESP8266... comunque dove non gira Debian - almeno per il momento :) ).

Il problema è che non necessariamente aumenti la sicurezza!
Esempio classico: cifri ("firmi") con RSA2048 un messaggio, *un carattere alla volta*.
naturalmente facendo così elimini del tutto la sicurezza che stai introducendo con la cifratura.
Infatti era un esempio estremo, anche se molto significativo.

Se cifri tutto devi cifrare il flusso di dati o il file completo.
Anche qui devi fare attenzione. P.e. c'era un attacco per determinare se c'era qualcuno in casa analizzando il traffico cifrato generato dalle webcam WiFi verso il DVR: senza bisogno di decifrarlo, bastava analizzare la quantità di traffico generata che aumentava enormemente in presenza di movimento.

Quando scrivevo di cifrare messaggi corti intendevo cifrare l'hash al posto del messaggio completo.
Normalmente firmi solo l'hash sia per questioni di performance (su sistemi veramente vecchi, tipo 386, una firma RSA2048 portava via una frazione significativa di un secondo) sia perché su alcuni sistemi (tipo le smartcard) la comunicazione è talmente lenta che trasferirgli un file da alcuni MB richiederebbe decine di secondi.

il problema è che l'utente (al cui gruppo appartengo anch'io), spesso non è consapevole di quello che sta facendo e se non ha interesse diretto, ha però un interesse indiretto, quando qualcuno di più esperto effettua un attacco e ha successo.
Ha fatto notizia giusto ieri un attacco/truffa ai possessori di NFT tramite contratti "smart": in pratica gli veniva fatto firmare un hash (su un sito apparentemente innocuo) e questa firma veniva poi utilizzata per trasferire all'attaccante tutti gli NFT del firmatario.

Il problema delle collisioni è che tutti i messaggi che entrano in collisione possono essere spacciati come autentici!
infatti.
Per questo ho da sempre proposto di non far firmare solo l'hash ma un "riassunto" della transazione, meglio se visualizzabile su un display nel token che difende la chiave segreta.

* l'uso di una funzione hash permette di usare un messaggio breve su cui applicare la cifratura. Più il messaggio è lungo e più volte viene usata la stessa chiave di cifratura e maggiori sono le probabilità di un attaccante di individuare la "chiave" usata
Con algoritmi recenti questo non è un problema.
questa cosa non la conosco. Mi dai qualche esempio?
Da DES in poi, una delle specifiche è che non deve essere possibile (tranne che con forza bruta, ovviamente) ottenere la chiave conoscendo il plaintext e il cyphertext.

http://practicalcryptography.com/cryptanalysis/breaking-machine-ciphers/cryptanalysis-enigma/ Con poco più di 18 miliardi di chiavi, un PC anche datato può fare brute forcing in poco tempo ("In general it will take less than 30 seconds to break short messages (50 characters), slightly longer for longer messages.").
alcuni punti:
1) a me sembra strano tutto questo. Prima di tutto di enigma sono state create diverse versioni e poi l'uso che è stato fatto è stato modificato nel tempo e anche a seconda della forza militare che lo utilizzava, aggiungendo maggior difficoltà d'attacco[2].
Non sono un esperto di Enigma. Comunque molto dipendeva dalla segretezza dei rotori.

Se fosse così com'è indicato nella pagina che hai indicato, come mai è stato creato questo progetto?
http://www.enigmaathome.net/
per decifrare 3 messaggi il tempo impiegato è totalmente diverso da quello indicato nell'articolo: "Project total CPU time equivalent to: 366959 years, 282 days, 16 hours of Athlon 3500+ running stock app."
Non lo conoscevo. Però non mi torna. O magari stanno tentando di decifrare messaggi erronei (errore dell'operatore, errore di trasmissione o di ricezione, o volutamente alterato al fine di far perdere tempo agli analisti alleati).

2) TONY SALE[1] ha detto[2]:
* The total number of ways in which the Enigma machine can be configured for any particular message is 150 million million million * Its complexity's enormous. I mean, if I sent just one message on an Enigma machine today it would still take a super Cray computer, the fastest in the world, a year to go through searching for that one message without supporting evidence as to what that message might have been.
Il problema è capire se il plaintext ottenuto è sensato o meno.
P.e. normalmente veniva trasmesso due volte un preambolo, il che rendeva facile capire che il messaggio era stato decrittato correttamente. Metti che l'operatore non lo abbia fatto, non hai modo di riconoscere il messaggio "vero", puoi solo escluderne una gran parte con delle euristiche, ma magari in questo modo scarti anche il messaggio che è stato trasmesso...

ok era il 1999, ma da quell'anno all'attuale un PC normale non è diventato più potente di un supercomputer dell'epoca.
Beh, diciamo che ci si è avvicinato parecchio :)

Poi enigma ha dei "bug" che rendono, in taluni casi, la sua robustezza minore.
Per fortuna.

3) oltre ad enigma, di cui io non avevo accennato nella mia risposta, sono stati usati altri "algoritmi" di cifratura, ad esempio Lorenz[2][3]
Una caterva. Con diversi gradi di sicurezza.
Ho un vago ricordo di un sistema che utilizzava un mazzo di carte per generare il keystream: cosa c'è di apparentemente più innocuo, nei beni di un rifugiato, di un mazzo di carte?

4) purtroppo, probabilmente a causa di come funziona la mente umana nel ricostruire i ricordi[4], in realtà io volevo riferirmi a quest'altro caso di cifratura sempre nato negli anni della seconda guerra mondiale e portato avanti fino al 1980: i messaggi cifrati spediti dalle spie russe dagli USA alla Russia

ho trovato questo documentario[5] che ne parla:

revealing thousands of telegrams sent between Moscow and the Soviet diplomats in the 1940s and '50s.

The Venona project lasted until 1980. Only those messages that reused sheets of one-time pad could be read, less than one percent of the total. No messages sent after 1948 could be broken;
Ah, beh, OTP è l'unico sistema dimostrabilmente sicuro. Purché non riutilizzi il keystream. E il keystream viene consumanto con ogni messaggio.

C'è anche un documentario, sempre di PBS Nova, più recente, che parla in modo più approfondito su questo argomento, dove dice esplicitamente che stanno tentando di decifrare tali messaggi cifrati, ma per ora non sono riusciti... purtroppo ora non riesco a trovarlo, nei quasi 1.000 documentari PBS Nova[6]
Se usavano (correttamente) OTP, è impossibile. A meno di non avere a disposizione le chiavi.

5) come dimostrano i documentari PBS Nova [2][5], la causa principale del fallimento di un sistema complesso di cifratura è l'inadeguatezza dell'utente che li utilizza. Secondo me, più un sistema è complesso e meno l'utente è esperto e più sono altre le probabilità di fallimento. Un utente per poter usare qualcosa dovrebbe capire cosa sta usando, come funziona e adottare conseguentemente un uso consapevole.
O avere per lo meno istruzioni precise e addestramento adeguato.

6) Dalla mia scarsa conoscenza della criptografia mi sono fatto l'idea che il metodo di cifratura più sicuro, anche considerando l'aspetto dell'utente "ignorante" in materia che lo utilizzerà è quello di usare un metodo di cifratura basato su una "chiave" diversa per ogni messaggio e la lista delle chiavi posseduto solo da chi deve comunicare/ricevere. Tale lista non deve essere generata da una lista pseudocasuale. Questo, secondo me, è valido e inattaccabile soprattutto per messaggi brevi, come l'autenticazione. Le chiavi possono benissimo trovarsi su un foglio di carta.
"Don't roll your own crypto". Spesso anche gli esperti sbagliano...
Prendo ad esempio PGP, che portò alla portata di "tutti" alcune best practice, per quanto ora sia pesantemente criticato. Per cifrare un messaggio con RSA, come prima cosa veniva generata una chiave di sessione, che veniva cifrata con la chiave pubblica RSA del destinatario (o dei destinatari) e utilizzata per criptare con un algoritmo simmetrico il plaintext. Così, oltre ad avere la massima sicurezza (una chiave diversa per ogni messaggio) potevi mandare lo stesso cyphertext a molti utenti (p.e. su FidoNet la banda era molto ridotta).

Un esempio è l'autenticazione a due fattori: Google ha dichiarato che con l'autenticazione a due fattori gli attacchi che hanno successo sono circa il 50% in meno rispetto ad un'autenticazione con sola password. Come dire che aumentare la complessità per l'utente di 10-100 volte diminuisce la probabilità di successo dell'attaccante del 50%. (non trovo l'articolo)
Uh? Perché aumenti la complessità per l'utente di "10-100 volte"? Coi token Fido basta tenere la chiavetta inserita e toccare il tasto quando ti viene chiesto. Se invece ti riferisci a TOTP/HOTP la UX è meno lineare ma comunque non così complessa... Anche mia madre riesce ad usare Google Authenticator, ma sicuramente rallenta parecchio il login...

Però nessuno valuta se il bug è a livello matematico, cioè se vi è un "problema", magari intenzionale, che permetta di avere un passpartout, backdoor o come la si voglia chiamare o magari soltanto un metodo per diminuire la complessità dell'attacco di alcuni fattori.
"Nessuno"? Solo tutti i crittoanalisti e buona parte dei matematici :)
tieni conto che alcuni modelli matematici sono proposti da enti come l'NSA[9] o indicati come mandatori per l'uso...
E proprio per questo gli viene sbattuto in faccia in modo molto pesante ogni piccolo difetto o comportamento sospetto. P.e. DRDB è considerato non sicuro coi paramentri dello standard: chi è in possesso della chiave segreta usata per generarli è anche in grado di decrittare il traffico. Discorso diverso per DES: malgrado alcune modifiche alle s-box siano state viste con molto sospetto dai ricercatori, si è poi scoperto che la NSA le aveva fatte introdurre per renderlo resistente alla crittoanalisi differenziale, allora segreto militare e "scoperta" pubblicamente solo molti anni dopo -- il fatto che la versione iniziale di DES fosse attaccabile e quella "rivista" no ha fatto capire che NSA la conosceva ben prima della comunità accademica.

Io penso che sia "semplice" verificare se il modello matematico sia corretto, mentre sia molto più complesso individuare se esista un ulteriore modello matematico che permetta di avere un passpartout, backdoor al primo. E nell'articolo che avevo letto, da quello che mi ricordo, si indicava che questo secondo passaggio non viene generalmente fatto.
Beh, se cifratura e decifratura funzionano, il modello matematico è "corretto". La verifica che non abbia backdoor o altre debolezze è proprio il lavoro dei crittoanalisti. P.e. molti algoritmi, anche se implementati correttamente e senza debolezze matematiche (note) possono rivelare dati sensibili tramite side channel. Molte implementazioni di RSA sono "poco sicure" perché il tempo usato per decrittare dipende dal valore dei bit della chiave. In altri casi si guarda il consumo del chip. Comunque sempre più spesso una delle specifiche per nuovi algoritmi è l'essere "constant time".

--
Diego Zuccato
DIFA - Dip. di Fisica e Astronomia
Servizi Informatici
Alma Mater Studiorum - Università di Bologna
V.le Berti-Pichat 6/2 - 40127 Bologna - Italy
tel.: +39 051 20 95786

Rispondere a