Pybitcointools usa el siguiente código para calcular una clave privada maestra (BIP32) a partir de una semilla:
def bip32_master_key(seed, vbytes=MAINNET_PRIVATE):
I = hmac.new(from_string_to_bytes("Bitcoin seed"), seed, hashlib.sha512).digest()
return bip32_serialize((vbytes, 0, b'\x00'*4, 0, I[32:], I[:32]+b'\x01'))
¿Por qué, específicamente, se usa la cadena de bytes Bitcoin seed
en el algoritmo HMAC? Cuando uno considera que las cadenas de bytes Mnemonic
y Electrum
se usan en derivaciones HMAC (en BIP39/cuasi BIP39, respectivamente), las etiquetas parecen demasiado inespecíficas. Me pregunto por qué la cadena de bytes no aclara ni especifica una versión, por ejemplo, BIP32 V0.1 seed .
¡Nada de esto es una crítica, para ser claros! Estoy tratando de dilucidar cómo se eligieron e implementaron estas decisiones, lo que a menudo es muy difícil sin tener un conocimiento profundo de RFC, Github, etc.
¿Quizás esto podría explicarse en el contexto de cómo funciona HMAC también?
Se especifica en BIP32 ( https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki ). La función SHA512-HMAC se reutiliza porque ya forma parte del estándar en otro lugar, pero requiere una clave además de los datos que se codifican. Como la clave puede ser arbitraria, optamos por utilizarla para asegurarnos de que la derivación de la clave fuera específica de Bitcoin.
mago de ozzie