Author

Topic: bip39 domande sceme (Read 82 times)

legendary
Activity: 1910
Merit: 2065
December 27, 2022, 12:40:15 PM
#4
Incuriosito dai dubbi di babo, ho approfondito il punto accennato nell'EDIT 2,

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:

Code:
import hashlib
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':


Code:
00010001010  -> 139
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
Code:
mnemonica: arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese arnese
Bip 39 Seed: f92660b63f8f671d4afca69ffbb979dc1aaedb8b6764623a38234242cb025de2130a835435ca31747695733a0c51b6aefbef5f568bd44ef800b96441672614c3
primo address: 18x5P5xiGTPezm1vHa6LRd8ZYGbTQeLxAe

inglese: bacon -> https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Code:
mnemonica: bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon bacon
Bip 39 Seed: 241e86356db60a686bb8c30b1054eac70701493b6702ed5f4a0e54cd3d13f0ccfd6d8b37506dc5c65af5575e720196d6d81aca24f0f083a5c65597541ada0e32
primo address: 159ysWF6HKJHvzCFEkVvDnHNgBjkbqj6K4

spagnolo: archivio -> https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt
Code:
mnemonica: archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio archivio 
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 è :
Code:
0001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000100010100001000101000010001010000

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à  
legendary
Activity: 3528
Merit: 4042
December 26, 2022, 10:25:00 AM
#3
Grazie mi hai tolto un dubbio grande

Nulla di grave, mi sn chiuso un dito in auto ed è gonfio e fa male
Unghia nera

Vediamo se si è rotto
legendary
Activity: 1910
Merit: 2065
December 26, 2022, 10:22:02 AM
#2
sono dubbi che mi porto dietro da una vita, oggi sn al pronto soccorso e mi annoio, quindi studio

Spero non sia nulla di grave.

- si puo creare un seed con una sola parola? esempio (sobrio sobrio sobrio sobrio... x12)
- creare un seed con le parole inglesi numero:2, 5, 7, 10, 12... eqiuvale a creare un seed con le medesime parole del dizionario.. italiano?

Le tue domande non sono stupide, dopo un breve ripasso

https://learnmeabitcoin.com/technical/mnemonic

le risposte sono:

1) sì (quasi, a parte l'ultima**)
2) no

ho provato a inserire a mano una entropia banale qui:

https://bip32jp.github.io/english/

Code:
entropy : 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

mnemonic: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art



comparando con altre lingue si ottengono risultati diversi: (stessa entropia, stessa sequenza numerica delle parole, ma diversi dizionari e quindi diverso seed finale):


https://iancoleman.io/bip39/#italian
https://iancoleman.io/bip39/#english
https://iancoleman.io/bip39/#spanish

Code:
italiano:
mnemonica: abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco abaco angelo
Bip 39 Seed: cbda07ec2ff567c93b1777de30b468da16768d053d2fc1b9f206b10106bfa0744bfa469554ec40ead097f9ede9b77192562ce16ef89290b33de8971befe9053f

inglese:
mnemonica: abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art
Bip 39 Seed: 408b285c123836004f4b8842c89324c1f01382450c0d439af345ba7fc49acf705489c6fc77dbd4e3dc1dd8cc6bc9f043db8ada1e243c4a0eafb290d399480840

spagnolo:
mnemonica: ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ábaco ancla
Bip 39 Seed: 1e0de8aa97db3c7988f692d9c6151968be89debdbd71b1e34cab15d15ec10eed33412891129e1274fb84624565fd835f7e56df22a997439fca3da05c9c82a156

Quindi direi proprio che la funzione PBKDF2 fa l'hash della mnemonica intesa come stringa di parole, non fa direttamente l'hash delle 'posizioni' (cioè dell'entropia iniziale).

I risultati, partendo dalla stessa entropia ma utilizzando diversi dizionari, sono pertanto diversi.*

*EDIT 1:

nell'esempio che ho fatto, questi sono i primi 3 indirizzi btc rispettivamente derivati (bip 44) dai 3 seed per le 3 lingue:

italiano:  1Ad4nEriiHEHUDseZ2yVfUGS7fBZb1xkF5  -> https://www.blockchain.com/explorer/addresses/btc/1Ad4nEriiHEHUDseZ2yVfUGS7fBZb1xkF5

inglese :  1KBdbBJRVYffWHWWZ1moECfdVBSEnDpLHi  -> https://www.blockchain.com/explorer/addresses/btc/1KBdbBJRVYffWHWWZ1moECfdVBSEnDpLHi

spagnolo: 1EisMpzAj64HgFErbCoetANcZj4pQWoDxo -> https://www.blockchain.com/explorer/addresses/btc/1EisMpzAj64HgFErbCoetANcZj4pQWoDxo

come si può vedere dai link, solo nel caso dell'indirizzo 'inglese' è presente un'attività passata, non è così invece per quello 'italiano' e per quello 'spagnolo'.


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

**l'ultima parola dipende da un checksum aggiunto alla fine (sha256 dei bit dell'entropia, perciò l'ultima parola non è uguale alle altre e non puoi sceglierla nemmeno a caso; nell'esempio di sopra "angelo / art / ancla" corrispondono tutte e 3 alla posizione 103 dei rispettivi dizionari).

https://github.com/bitcoin/bips/blob/master/bip-0039/italian.txt
https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt


**EDIT 2:  visto che si ritagliano 11 bit dall'entropia iniziale per ogni parola, mentre per l'ultima parola si utilizzano solo 3 bit di entropia + 8 bit di cheksum, ogni volta che si prova a costruire una entropia 'artificiale' di soli 11 bit (tipo 00011100010 x 23 + 000) per costruire una sequenza di 24 termini utilizzando un'unica parola, c'è esattamente 1 sola possibilità su 256 (2^8) che anche l'ultima parola sia uguale alle precedenti;  quindi è probabile che esistano alcune parole nella lista di 2048 parole che consentono di generare una sequenza costituita solo da quella parola (ultima parola compresa).
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
legendary
Activity: 3528
Merit: 4042
December 26, 2022, 07:09:03 AM
#1
- si puo creare un seed con una sola parola? esempio (sobrio sobrio sobrio sobrio... x12)
- creare un seed con le parole inglesi numero:2, 5, 7, 10, 12... eqiuvale a creare un seed con le medesime parole del dizionario.. italiano?

sono dubbi che mi porto dietro da una vita, oggi sn al pronto soccorso e mi annoio, quindi studio
Jump to: