sempre in risposta alla domanda "è possibile usare un seed utilizzando una sola parola?"
Ho cercato quali erano le parole (o meglio: le posizioni) che permettevano di costruire una frase mnemonica costituita da un'unica parola che si ripete 24 volte.
Ho costruito quindi un programmino python (con l'aiuto di ChatGPT)
che per ognuna della 2048 parole possibili calcola il checksum (sha256 della sequenza: parola x 23) e controlla così se anche l'ultima parola viene a coincidere (per puro caso) proprio con la parola scelta all'inizio:
import binascii
def compute_sha256_hash(input_number):
h = int(input_number, 2).to_bytes(32, byteorder='big')
a = binascii.hexlify(hashlib.sha256(h).digest()).decode()
return a
#Crea una lista di tutte le stringhe di 11 bit da 00000000000 a 11111111111
all_strings = [bin(i)[2:].zfill(11) for i in range(2048)]
# Per ogni stringa di 11 bit, costruisci una stringa di 253 bit ripetendo la stringa di 11 bit 23 volte + 3 bit iniziali
input_strings = [s*23+s[0:3] for s in all_strings]
# Cerca tra tutte le stringhe solo quelle che producono una parola finale uguale a quella iniziale
for s in input_strings:
# I primi 11 bit rappresentano la posizione dell'unica parola con cui si cerca di costruire la frase mnemonica
first_11_bit = s[0:11]
# Calcola l'hash SHA-256 della stringa di input
hash_value = compute_sha256_hash(s)
# Converte l'hash in formato esadecimale in una stringa di bit
hash_value_bin = bin(int(hash_value, 16))[2:]
# Aggiunge gli zero mancanti alla stringa di bit per renderla lunga 256 caratteri
hash_value_bin = hash_value_bin.zfill(256)
# Calcola il check_sum 8 bit
check_sum = hash_value_bin[0:8]
# Posizione dell'ultima parola
last_word_pos = s[0:3] + check_sum
# Stampa le posizioni relative alle parole che stiamo cercando
if s[3:11] == check_sum:
print(first_11_bit)
print(int(last_word_pos,base=2)+1)
Ho così verificato, in linea con la teoria, dopo aver effettuato tutti i 2048 tentativi possibili (ognuno con probabilità 1/256 di determinare gli ultimi 8 bit in modo tale da ottenere come ultima parola esattamente la stessa utilizzata per le prime 23)
esistono esattamente 11 parole che permettono una costruzione di una mnemonica 'monotona':
01011000001 -> 706
01100000000 -> 769
01100110001 -> 818
11001011011 -> 1628
11001110110 -> 1655
11011001001 -> 1738
11100000100 -> 1797
11100110101 -> 1846
11100111010 -> 1851
11111111100 -> 2045
La parola numero 139 corrisponde nel dizionario:
italiano: arnese -> https://github.com/bitcoin/bips/blob/master/bip-0039/italian.txt
Bip 39 Seed: f92660b63f8f671d4afca69ffbb979dc1aaedb8b6764623a38234242cb025de2130a835435ca31747695733a0c51b6aefbef5f568bd44ef800b96441672614c3
primo address: 18x5P5xiGTPezm1vHa6LRd8ZYGbTQeLxAe
inglese: bacon -> https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Bip 39 Seed: 241e86356db60a686bb8c30b1054eac70701493b6702ed5f4a0e54cd3d13f0ccfd6d8b37506dc5c65af5575e720196d6d81aca24f0f083a5c65597541ada0e32
primo address: 159ysWF6HKJHvzCFEkVvDnHNgBjkbqj6K4
spagnolo: archivio -> https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt
Bip 39 Seed: 7939cac0ec8f1bce6f0a131b97612733ef7bf2582fd339ef9cf270a971e60ca3e134ec5d3632fe801413f2956360044743dc0d5ae656e22aa063f175df7579fe
primo address: 1K7D5NwuL9xtiS9KMCz1HF7hy1ipwdX2RH
Al solito, solo l'address inglese: https://www.blockchain.com/explorer/addresses/btc/159ysWF6HKJHvzCFEkVvDnHNgBjkbqj6K4 mostra attività in passato.
L'entropia (139 -> 00010001010 per 23 volte + 000 = 256 bit) corrispondente è :
Per quanta riguarda le mnemoniche con 12 parole, poichè in quel caso si utilizzano solo 4 bit come check sum:
https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch05.asciidoc#table_4-5
una stima del numero di parole che permettono una sequenza ripetitiva è : 2048 * 1/16 = 128 parole (+ o meno, il dato reale non lo so, non ho fatto anche questa verifica).
Da notare che se una parola può consentire una frase 'monotona' di lunghezza 24 non è detto che la stessa consenta anche la formazione di una frase monotona di lunghezza 12 (e viceversa), in quanto il cheksum dipende dallo sha256 dell'entropia, e passando da 256 bit a 128 bit il risultato cambia.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
In generale, vedendo come si costruisce la mnemonica a partire da una stringa di 256 bit,si può dire:
1) fissate le prime 23 parole, ci sono solo 8 parole che possono completare la frase, non 2048; sono 8 perchè dopo aver fissato 11 bit * 23 = 253 bit, avanzano solo 3 bit per 'impostare' l'ultima parola
2) nel caso di 12 parole (128 bit di entropia), fissate le prime 11 parole , ci sono 128 parole che possono completare la frase, non 2048.
3) le prime 23 parole su 24 (o 11 su 12) possono essere qualsiasi, anche ripetute, per l'ultima parola invece ci sono meno possibilità