Estoy trabajando en un código que intenta identificar archivos cuyo contenido parece ser "aleatorio". Como tal, estoy buscando medidas estadísticas que puedan usarse para identificar dicha aleatoriedad.
He implementado lo siguiente hasta ahora:
- entropía de Shannon de la muestra (es decir, -∑ p (x i ) log 2 p (x i ) sobre la muestra X )
- Varianza de la muestra de bytes (0.0 es una puntuación perfecta)
- media bitwise (0.5 es una puntuación perfecta)
- media bitwise distribuida entre los bits 0 a 7 de cada byte (en busca de cualquier variación significativa)
- Porcentaje de bytes dentro del rango 0x20 & leq; b & leq; 0x7E (37.11% es una puntuación perfecta)
- Recuentos de pares de bits (es decir, comprobación de recuentos iguales de 00, 01, 10, 11)
- Distancias de bytes repetidas (es decir, buscando
xx
,x*x
,x**x
,x***x
, ... patrones)
Estos parecen dar una medida razonable de "aleatoriedad" uniforme, ya que 128 bytes generados por la concatenación de dos hashes SHA512 se pueden distinguir fácilmente de un texto ASCII o un archivo ejecutable simplemente mirando las estadísticas.
Sin embargo, me gustaría saber si hay algún otro indicador sólido que deba examinar que pueda indicar que los datos de muestra fueron generados por un PRNG criptográfico.
Actualización: Para ser absolutamente claro, no estoy tratando de probar la calidad de un PRNG como fuente de aleatoriedad criptográfica. Estoy intentando distinguir entre archivos no aleatorios (por ejemplo, archivos ejecutables, JPEG, archivos, etc.) y archivos aleatorios (por ejemplo, archivos de claves TrueCrypt). Hasta ahora, mis pruebas se usan para identificar datos obviamente no aleatorios (por ejemplo, texto ASCII) y datos que no están distribuidos de manera uniforme de alguna manera. Estoy buscando otras formas de probar esto.