Stai facendo alcune buone domande. La prima cosa che dovresti sapere è che le informazioni, l'entropia e le stringhe / array di byte sono correlate. L'entropia di un sistema è il registro (informazioni). In questo caso, l'informazione è una stringa (password, codificata base64 o altro). Tuttavia, per trovare il contenuto informativo di una stringa, non ne misuriamo una basata sulla sua lunghezza e su quali caratteri ci sono dentro. Invece, misuriamo le informazioni in base all'intervallo di valori che può contenere.
Quindi, un coin flip ha due stati: Heads o Tails. Pertanto, ha un bit di informazioni: Log2 (2) = 1.
Qual è il contenuto di entropia di un elenco di 100.000 parole univoche? Non è tutta la combinazione possibile di lettere alfabetiche (che sarebbero 26 ^ 6 per parole di lunghezza 6 o 28 bit). In realtà è meno di 17 bit. Perché? Perché non abbiamo più di 2 ^ 17 parole nell'elenco.
La chiave per capire l'entropia è capire l'intervallo di possibili scelte per qualcosa, quindi, prendi il Log (| RANGE |) per ottenere l'entropia.
Diamo un'occhiata ad alcuni esempi e supponiamo che tu stia usando SHA-512 (non hai selezionato una lunghezza per l'algoritmo SHA-2, quindi ho scelto 512 bit).
Questo significa che l'entropia massima per ogni hash risultante è limitata a 512 bit. Ciò non significa che l'hash contenga 512 bit di entropia, specialmente se si inizia con un input meno entropico. Inoltre, a rigor di termini, anche l'hash SHA-512 non contiene assolutamente 512 bit, sono abbastanza certo che ci siano alcune uscite hash che non sono possibili - non copre l'intera gamma di possibili numeri 2 ^ 512. Tuttavia, è un limite superiore ragionevole.
Ecco alcuni esempi. Tutte le uscite hash hanno una lunghezza di 512 bit, tuttavia:
- Hash (the_result_of_a_coin_flip) = 1 bit di entropia MAX.
- Hash (1_rnd_byte) = 8 bit di entropia MAX.
- Hash (64_bytes_from_a_true_random_num_gen) = 512 MAX.
- Hash (64_bytes_from_a_pseudo_RNG) = 512 MAX, tuttavia sarà (molto) inferiore se il seme PRNG è più piccolo.
- Hash (1024_bytes_from_a_true_RNG) = 512 bit di entropia MAX.
- Hash (32_rnd_bytes_base64_encoded) = 256 bit di entropia MAX.
- Hash (64_rnd_bytes_base64_encoded) = 512 bit di entropia MAX.
- Hash ('00000' + 64_rnd_bytes + '00000') = 512 bit di entropia MAX.
Se guardi quegli esempi, quello che troverai è che l'algoritmo di hash blocca l'entropia perché non puoi adattare più entropia (misurata in bit) nell'output dell'algoritmo. Inoltre, non puoi creare più entropia con un hash - esempi 1 & 2 mostra questo. Tuttavia, puoi perdere entropia in una funzione hash: l'esempio 5 mostra quella perdita (8192 bit fino a 512).
L'esempio n. 7 mostra ciò che stavi chiedendo, credo. Iniziamo con 512 bit di entropia (64 byte), la base 64 li codifica, quindi li cancelliamo. Una funzione di hash opportunamente costruita dovrebbe conservare la maggior parte dell'entropia dell'input fino alla sua dimensione massima di output.
L'esempio 8 mostra la risposta alla tua seconda domanda. La preimpostazione e / o l'aggiunta di un set fisso di byte all'ingresso non modifica l'entropia dell'output. La tua parte di input fissa ha un'entropia di ZERO perché non ci sono informazioni in essa - è fissa (| Range | = 1) e Log (1) = 0.
Spero che questo aiuti.