2011-01-12 5 views
6

È necessario creare un blocco temporaneo per crittografare alcuni dati (alcuni KB di dimensioni). Come dovrei andare a generare questo pad monouso per evitare tutti i problemi pseudo casuali associati alla generazione di numeri casuali di base come rand()?Blocco monouso perfettamente casuale per la crittografia

Esiste uno strumento o una libreria affidabile e affidabile che posso utilizzare per questo?

+0

Quale lingua/sistema operativo/ambiente di runtime si sta utilizzando? –

+1

guarda qui per un paio di buone soluzioni: http://stackoverflow.com/questions/3436376/what-is-the-most-secure-seed-for-random-number-generation –

+0

@Erik, non importa troppo tanto. Preferibilmente Windows, comunque. –

risposta

4

Prova Random.ORG. Hanno vari servizi gratuiti (e pagati) che generano numeri veramente casuali basati sul rumore atmosferico (o almeno questo è ciò che sostengono di fare).

+0

Sembra promettente. –

+8

Fintanto che non ti dispiace che qualcun altro conosca il tuo super-secret one time pad. E non ti dispiace che i tuoi attaccanti siano in grado di intercettarlo sul filo. –

5

I sistemi operativi più moderni dispongono di cryptographically-secure pseudo-random number generator.

Ad esempio, Windows ha CryptGenRandom. È possibile accedere allo stesso flusso da .NET utilizzando la classe RNGCryptoServiceProvider. Da C++, è possibile accedere allo stesso flusso utilizzando la funzione di libreria Microsoft C++ rand_s. Da Python, è accessibile usando la funzione urandom (vedi il fondo della pagina collegata) nel modulo os.

A differenza dei normali PRNG, i CSPRNG sono progettati per superare rigorosi test di casualità statistica. Sono anche progettati per resistere bene a un attacco serio, anche quando il loro stato iniziale o di esecuzione diventa disponibile per un attaccante.

Il termine "pseudo-casuale", usato dai crittografi, può essere fuorviante per un lettore non tecnico. Un CSPRNG espande una raccolta di valori casuali, nota come seme, in una sequenza di numeri più lunga. Quella sequenza è riproducibile dato il seme, ma per ogni buon CSPRNG, un piccolo cambiamento nel seme produce una sequenza molto diversa. Pertanto, fintanto che almeno una parte del seme viene scelta tramite un processo adeguatamente casuale, un attaccante non è in grado di predire la sequenza risultante - anche se l'attaccante può influenzare il resto del seme.

Numerosi sistemi importanti, dalle comunicazioni militari alla crittografia che protegge virtualmente tutte le transazioni online, si basano sulla sicurezza funzionalmente equivalente tra "crittograficamente sicuro pseudo-casuale" e "casuale".

EDIT: Se siete abbastanza fortunati da lavorare con la gamma di processori Intel Ivy Bridge, ora avete another very interesting alternative.

4

Non è possibile generare numeri casuali in modo algoritmico: è necessaria assistenza hardware. Se si utilizza un algoritmo, tuttavia sicuro (come un PRNG crittograficamente sicuro), si sta semplicemente creando un codice di flusso basato su quel PRNG; non è più un One Time Pad.

+2

@Nick: quando si utilizza un PNRG crittograficamente sicuro per un pad singolo non è come utilizzare un vero RNG, i due metodi sono quasi identici per forza. Non è chiamato "crittograficamente sicuro" per niente. E mi piace la citazione di Steve Bellovin: "Ho osservato che i pad monouso sono teoricamente indistruttibili, ma praticamente molto deboli, al contrario, i cifrari convenzionali sono teoricamente fragili, ma praticamente forti". – RoadWarrior

+2

No, non sono "quasi identici nella forza". Un OTP reale, usato correttamente, è letteralmente indistruttibile, poiché tutti i testi in chiaro sono ugualmente probabili. Al contrario, un PRNG crittograficamente sicuro ha uno stato molto più limitato.L'OP quasi certamente vuole un cifrario convenzionale - le OTP sono molto raramente la risposta corretta - ma semplicemente dire "usa un PRNG" è un cattivo consiglio: stai solo inventando il tuo cifrario basato sul PRNG, e saresti di gran lunga migliore fuori usando un codice esistente. –

+2

Non esiste un "OTP reale" garantito. La sicurezza è definita solo relativa a un modello di attacco. Ad esempio, un circuito hardware per produrre bit sovvertiti può essere costruito su un circuito integrato di pochi millimetri quadrati. Il generatore di numeri casuali hardware più sofisticato può essere sovvertito posizionando un tale chip ovunque a monte di dove viene digitalizzata la fonte di casualità, ad esempio in un chip del driver di uscita o persino nel cavo che collega l'RNG al computer. – RoadWarrior