Sto lavorando su un codice che tenta di identificare i file il cui contenuto sembra essere "casuale". In quanto tale, sto cercando misure statistiche che possano essere utilizzate per identificare tale casualità.
Ho implementato quanto segue finora:
- entropia di Shannon del campione (es. -Σ p (x i ) log 2 p (x i ) sopra l'esempio X )
- Bytewise sample variance (0.0 è un punteggio perfetto)
- Media bitwise (0,5 è un punteggio perfetto)
- Media bit a bit distribuita tra i bit da 0 a 7 di ciascun byte (cercando qualsiasi varianza significativa)
- Percentuale di byte compresi nell'intervallo 0x20 e leq; b & leq; 0x7E (il 37,11% è un punteggio perfetto)
- Conteggi di coppie di bit (vale a dire il controllo per conteggi uguali di 00, 01, 10, 11)
- Ripetute distanze di byte (vale a dire
xx
,x*x
,x**x
,x***x
, ... modelli)
Questi sembrano dare una misura ragionevole di "casualità" uniforme, in quanto 128 byte generati dalla concatenazione di due hash SHA512 possono essere facilmente distinti dal testo ASCII o da un file eseguibile semplicemente guardando le statistiche.
Tuttavia, mi piacerebbe sapere se ci sono altri forti indicatori che dovrei esaminare che potrebbero indicare che i dati di esempio sono stati generati da un PRNG crittografico.
Aggiornamento: per essere assolutamente chiaro, sono non cercando di testare la qualità di un PRNG come fonte di casualità crittografica. Sto cercando di distinguere tra file non casuali (ad es. File eseguibili, file JPEG, archivi, ecc.) E file casuali (ad esempio file chiave TrueCrypt). I miei test fino ad ora sono usati come modi per identificare dati ovviamente non casuali (ad esempio testo ASCII) e dati che non sono distribuiti in modo uniforme in qualche modo. Sto cercando altri modi per testarlo.