présentation

Les adresses Bitcoin sont sensibles à la casse, ce qui peut entraîner des erreurs lors de leur saisie. Une adresse Bitcoin est une chaîne de caractères qui encode un hachage de clé publique et une somme de contrôle. L'objectif est de récupérer l'adresse originale à partir de sa version en minuscules.

fondements techniques

Une adresse Bitcoin est encodée en base58, qui exclut les caractères 0, O, I, l, +, / et = pour éviter les confusions. La somme de contrôle est calculée en prenant les quatre premiers octets du hachage SHA256 du hachage de la clé publique. Cela permet de détecter les erreurs de saisie.

implémentation et optimisation

Une approche possible pour récupérer l'adresse originale consiste à essayer toutes les combinaisons possibles de minuscules et de majuscules. Cependant, cette approche est inefficace en Python en raison de la lenteur de l'exécution. Une implémentation en Rust est plus efficace et permet de récupérer l'adresse originale en environ 34 secondes.

analyse et limites

La récupération d'adresses Bitcoin corrompues nécessite une approche efficace pour éviter les faux négatifs. L'algorithme de récupération doit être capable de gérer des entrées non valides et de détecter les adresses valides. La compréhension de l'encodage base58 et de la somme de contrôle est essentielle pour développer un algorithme efficace.

import base58
import itertools
address_lowercase = "1lbcfr7sahtd9cgdqo3htmtkv8lk4znx71"
def try_both_cases(c):
    yield c
    if c.upper() != c:
        yield c.upper()
for address in itertools.product(*map(try_both_cases, address_lowercase)):
    address = "".join(address)
    try:
        base58.b58decode_check(address)
    except ValueError:
        pass
    else:
        print("Found valid address:", address)