Parece que hay muchos "tipos" diferentes de entropía. Me he encontrado con dos conceptos diferentes:
A) El ejemplo XKCD de correcthorsebatterystaple
. Tiene 44 bits de entropía porque cuatro palabras elegidas al azar de una lista de 2048 palabras es 4 * log2 (2048) = 44 bits de entropía. Esto lo entiendo.
B) La entropía de Shannon de la cadena real, es decir, la entropía se calcula en función de las frecuencias de las letras / símbolos. Aplicando la fórmula de Shannon en correcthorsebatterystaple
, el resultado es 3.36 bits de entropía por carácter.
# from http://stackoverflow.com/a/2979208
import math
def entropy(string):
"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
print entropy('correcthorsebatterystaple')
# => 3.36385618977
Wikipedia solo aumenta mi confusión:
Es importante darse cuenta de la diferencia entre la entropía de un conjunto de resultados posibles y la entropía de un resultado particular. Un solo lanzamiento de una moneda justa tiene una entropía de un bit, pero un resultado particular (por ejemplo, "cara") tiene cero entropía, ya que es completamente "predecible". - Wikipedia: Entropy (teoría de la información)
No entiendo muy bien la distinción entre la entropía del lanzamiento (generación) y la entropía del resultado (la cadena).
- ¿Cuándo se usa B y con qué propósito?
- ¿Qué concepto refleja con precisión la entropía de la contraseña?
- ¿Hay terminología para diferenciar entre los dos?
- La verdadera aleatoriedad podría darnos
correctcorrectcorrectcorrect
. Utilizando A todavía tenemos 44 bits. Usando B la entropía sería lo mismo que la decorrect
. ¿Cuándo es importante la diferencia entre los dos? - Si un requisito especifica que una cadena debe tener 20 bits de entropía: ¿uso A o B para determinar la entropía?