10
votes

Comment la base58 encoder une chaîne?

char (* text)[1][45+1];
text = calloc(5000,(130+1));
strcpy(0[*text],"sometext)");
Now I want to encode "sometext" to base58, however, I do not know how, and oddly enough, there isn't one example of BASE58 in C.The base58 encoding I'm interested in uses these symbols:
  123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ
It's been optimized to lessen the risk of mis-reading, so 0 and 'O' are both gone, for instance.P.S
Don't mind the weird allocation and declaration of the variables, I was experimenting.

6 commentaires

Voici un échantillon PHP que vous pourriez facilement porter.


flickr.com/groups/api/discuss/72157616713786392


Je ne souhaite pas être ingrat ou quoi que ce soit, mais ceux-ci sont en PHP.


Montrer une initiative. @Cicada a suggéré que vous puissiez port eux. Ou voulez-vous que cela soit fait pour vous?


BTW, pourquoi une telle syntaxe? rendre le code aussi opaque que possible?


@Linuskleen S'il vous plaît dites-nous comment vous faites une division d'un entier de chiffres infinis en C tel qu'il est fait en PHP. Vous verrez rapidement que ce n'est pas simple (bien que pas impossible et il y a des implémentations pour cela, mais certainement pas 1-doublures).


5 Réponses :


8
votes

Vous n'êtes pas censé encoder strings , vous êtes censé encoder entiers . .

Si vous commencez avec une chaîne, vous devez d'abord décider comment l'interpréter comme un entier (pourrait être base128, ou quelque chose), puis re-encode à la base58.


0 commentaires

7
votes

satoshi a la mise en œuvre de référence ( https://github.com/bitcoin/bitcoin/blob /master/src/base58.h )

Cependant, il utilise une classe d'utilitaire Bignum pour le faire, et c'est en C ++. Si vous avez accès à une bibliothèque Bignum, vous continuez simplement de diviser par 58 jusqu'à ce que le nombre soit rompu. Si vous n'avez pas de bibliothèque de Bignum, Afaik, vous êtes sorti de la chance.


0 commentaires

5
votes

Voici une implémentation en PHP pour les grands nombres que j'ai créés pour ampithings, au-delà des entiers (entier -> http://php.net/manual/fr/language.types.integer.php ).

Par exemple, essayez l'exemple ci-dessous (n'oubliez pas de transmettre votre identifiant à la fonction du format de chaîne. Utilisez la fonction PHP strval ()): p> xxx pré>

Important: Vous pouvez envisager de modifier cette routine en incluant une sorte de clé / mot de passe / cryptage S'assurer que d'autres ne peuvent pas décoder vos identifiants de base de données. P>

function base58_encode($input)
{
    $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
    $base_count = strval(strlen($alphabet));
    $encoded = '';
    while (floatval($input) >= floatval($base_count))
    {
        $div = bcdiv($input, $base_count);
        $mod = bcmod($input, $base_count);
        $encoded = substr($alphabet, intval($mod), 1) . $encoded;
        $input = $div;
    }
    if (floatval($input) > 0)
    {
        $encoded = substr($alphabet, intval($input), 1) . $encoded;
    }
    return($encoded);
}

function base58_decode($input)
{
    $alphabet = '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ';
    $base_count = strval(strlen($alphabet));
    $decoded = strval(0);
    $multi = strval(1);
    while (strlen($input) > 0)
    {
        $digit = substr($input, strlen($input) - 1);
        $decoded = bcadd($decoded, bcmul($multi, strval(strpos($alphabet, $digit))));
        $multi = bcmul($multi, $base_count);
        $input = substr($input, 0, strlen($input) - 1);
    }
    return($decoded);
}


0 commentaires

1
votes

Voici une implémentation qui semble être pure C . xxx


2 commentaires

Cela semble intéressant ("fortement optimisé pour les périphériques embarqués"), mais il n'a pas de documentation ni d'échantillons sur la manière de l'utiliser et de verser sur le code pendant 15 à 20 minutes ne l'a pas manifestée. (Newbie relatif, je comprends les bases mais peut encore être facilement jetée.: P)


Mes pensées exactement; En fait, vous êtes peut-être plus avancé que moi. Je ne fais que rapport sur ce qu'il prétend être, une réclamation non vérifiée par moi-même. Utilisez à vos risques et propres risques (et veuillez revenir à la poste de tout ce que vous apprenez, cela aidera les autres dans notre situation).



1
votes

Mon code simple avec la bibliothèque Crypto ++: xxx

C'est juste pour les portefeuilles de cryptocurrence. la chaîne peut être modifiée pour d'autres tâches.


2 commentaires

Juste hors de curiosité, pourquoi ne pas définir alphabet avec un littéral à chaîne à la place?


C'est c ++, pas c