Una pregunta simple sobre entropía y datos aleatorios

0

Digamos que lanzo un dado de 6 caras 100 veces y registro los resultados en una cadena de 100 caracteres, por ejemplo:

//this is obviously an example (and very unlikely) outcome
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"

Estoy bastante seguro de que esta cadena de 100 bytes tiene una entropía de más de 256 bits, lo que hace casi imposible que alguien pueda encontrar la misma cadena. (Llego a ese número de entropía porque 6 ^ 99 < 2 ^ 256 < 6 ^ 100.)

¿Esto es correcto?

Si es así, tengo más preguntas:

De esto se deduce que si repito la secuencia que generé más de 10 veces,

"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
"1234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234561234"
¿

que ahora he generado 1000 bytes de datos aleatorios con entropía de 256 bits?

Vamos a llevar esto más lejos. ¿Puedo tomar mi cadena inicial y repetirla 10,000,000,000 veces y decir que he generado 1 terabyte de datos aleatorios con entropía de 256 bits?

Básicamente me pregunto si pierdo la entropía al repetir los mismos datos iniciales "semilla".

    
pregunta cryptonamus 09.08.2015 - 19:34
fuente

1 respuesta

1

Definitivamente no es imposible, y no perderá la entropía al repetir los datos semilla, pero tampoco ganará ninguno.

Por "ellos", me refiero a una persona ficticia que está tratando de averiguar cómo se genera su entropía.

Si saben que estás tirando un dado, saben que cada dígito será 1-6. Si saben cuántas veces estás tirando los dados, saben la longitud de la cuerda. Si saben que el número se repite otras 9 veces, solo necesitan 100/1000 dígitos para calcular la cadena completa.

Un atacante ya podría haber deducido varias posibilidades al tener este conocimiento.

Técnicamente, tampoco es completamente aleatorio.

Código de ejemplo de Python:

# Generating dice rolls

import random

finalResult = ''

for i in range(0, 99):
    finalResult += str(random.randint(1, 6))

finalResult = finalResult * 10

print finalResult

Nuestra cadena de resultados es

"445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263445656152532321321544533156515514562441512263431326526522641111345452422363416326462451246641163263"

La cadena produce 2.5806473 bits de entropía.

Si tuviéramos que repetir esta cadena 100 veces, los bits de entropía producen 2.5806473, por lo que no obtienes más entropía repitiendo la misma cadena. Tiene la misma cantidad exacta de bits de entropía.

Podrías usar un método mucho mejor para calcular esos tipos de cadenas.

Por ejemplo, usemos el siguiente conjunto de caracteres:

  • (abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ~ '! @ # $% ^ & * () -_ = + [{]} \ |:', <. >? / ")

Podríamos hacer que cada carácter corresponda a un número aleatorio (0-9).

Generaremos una cadena de 100 caracteres al azar 10 veces, cada resultado se agregará al final de la otra.

Código de ejemplo de Python:

import random

finalResult = ''

for i in range(0, 9):
    charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~'!@#$%^&*()-_=+[{]}\|;:',<.>?/"

    charDict = {}

    for char in charSet:
        charDict[char] = random.randint(0, 9)

    resultNum = ''

    for c in range(0, 99):
        resultNum += str(charDict[random.choice(charSet)])

    finalResult += resultNum

print finalResult

Nuestro resultado final es

"989399239097499389189022059092089492027501842251063182295989039209500981690709174339560500718099187606453339255549850346696565025042504925549332139224650652008702541994436538038618150315533023690953265748197684554400738548471882056153703865878585568168785067956510245109630478032252017568653870833894188388554461614037175856595140494136416835954432291428646093513565418053453659690464509631548126684471012603870043241726762620992001266264567652958725540078190802887737716846137398760778230100671898578274611212550507493363271408738936020202251709524912326332192065460961427192491397953337291818408796519672933031867956012894824302218099239929701290857804033886980677310953734098050027009200344729070097168472819000050821260058120486772283080610287066869211061373297557455864016702744529267151023698266001761202821747262141933039130063624472814012939225414242779000144228077687272549297604021".

La cadena produce 3.3067561 bits de entropía.

Incluso si tuviera que repetir esta cadena 100 veces, los bits de entropía seguirían siendo 3.3067561.

Para generar 1 TB de entropía aleatoria, esto haría el trabajo, sin embargo, no sugiero que ejecutes el código, ya que bloqueará tu computadora.

import random

finalResult = ''

for i in range(0, 999999999999):
    charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~'!@#$%^&*()-_=+[{]}\|;:',<.>?/"

    charDict = {}

    for char in charSet:
        charDict[char] = random.randint(0, 9)

    resultNum = ''

    for c in range(0, 99):
        resultNum += str(charDict[random.choice(charSet)])

    finalResult += resultNum

print finalResult
    
respondido por el Sakamaki Izayoi 09.08.2015 - 20:23
fuente

Lea otras preguntas en las etiquetas