Base32 / Base58-konverter

Kod tekst eller dekod kodede strenger i syv ordninger: RFC 4648 Base32 (A-Z2-7), base32hex (0-9A-V), Crockford Base32, z-base-32, Bitcoin Base58, Flickr Base58 og Ripple Base58. Det finnes også en frittstående Base58Check-generator og -verifisering (versjonsbyte + dobbel SHA-256-kontrollsum) under konverteren. Tekst behandles som UTF-8-byte. Se også: Base64 | Ascii85 | Hex-tekst.
All behandling skjer lokalt i nettleseren — data lastes aldri opp til noen server.
Slik fungerer det: Hvert tegn konverteres til UTF-8-byte, og deretter pakker hvert alfabet disse bytene inn i sitt eget utskrivbare alfabet.
Ordning:
Slik fungerer det: Den kodede strengen dekodes tilbake til UTF-8-byte og vises som tekst. Mellomrom og etterfølgende = utfylling ignoreres; ugyldige tegn oppgis med posisjon.
Ordning:
Ctrl+Enter i inndataen kjører den aktive modusen.
Velg Kod eller Dekod, velg en ordning og klikk på handlingsknappen. All behandling skjer i nettleseren.

Base58Check-koder: Versjonsbyte (heks): Nyttelast (heks):
Base58Check-verifiserer: Adresse eller streng:
Base58Check er adresseformatet til Bitcoin: én versjonsbyte, nyttelasten, og deretter de fire første byte av SHA-256 brukt to ganger på versjonsbyten og nyttelasten sammen. Koding skriver ut denne strengen; verifisering leser en inn igjen og melder hvilken byte som er feil når kontrollsummen ikke stemmer.
Om hvert alfabet:
Base32 (RFC 4648) — det klassiske alfabetet som ikke skiller store og små bokstaver, A-Z 2-7; 8 byte blir til 13 tegn pluss utfylling. Mye brukt for HOTP/TOTP-hemmeligheter, DNSSEC og filsjekksummer. En valgfri =-utfylling legges til med mindre man slår den av.
Base32 Hex — det utvidede alfabetet 0-9 A-V som sorterer naturlig i leksikografisk rekkefølge og er praktisk når den kodede verdien også brukes som en heksliknende identifikator.
Base58 (Bitcoin) — Base64 uten 0 O I l + /, slik at utdataene aldri inneholder tvetydige tegn. Dette er alfabetet som brukes for Bitcoin-adresser. Ledende nullbyte blir sifferet 1.
Base58 (Flickr) — alfabetet for Flickrs korte URL-er, som skiller store og små bokstaver i motsatt rekkefølge: siffer, små bokstaver, deretter store.
Crockford Base32 — sifrene og de entydige bokstavene 0-9 A-Z, med I, L, O og U utelatt. Dekoding godtar også I og L som 1, O som 0, små bokstaver og bindestreker som pynt. Et valgfritt kontrollsymbol modulo 37 kan legges til.
z-base-32 — de samme femsbitgruppene som RFC 4648 Base32, med alfabetet omordnet slik at tegnene folk skriver oftest, er lettest å skrive. Ingen utfylling og ingen kontrollsymbol.
Base58 (Ripple / XRP) — en tredje rekkefølge av de samme femtiåtte tegnene, brukt av XRP Ledger. Det første tegnet er r, og derfor begynner Ripple-adresser med den bokstaven.
Base58Check — en Base58-streng der nyttelasten bærer fire byte kontrollsum, slik at en feilskrevet adresse kan avvises i stedet for å sende penger et annet sted i stillhet. Det finnes en frittstående generator og verifisering under konverteren.
Hva er Base32 og Base58?

Dette er to svar på ett spørsmål: en kanal som bærer tekst blir bedt om å bære bytes. Base32 og Base58 er verken kryptering eller hashing — de skjuler ikke noe og de forkorter ikke noe. De skriver om en bytesekvens med et fast sett lesbare tegn, og hvem som helst som kjenner settet som ble brukt, kan snu den rett tilbake. Den eneste grunnen til å foretrekke den ene framfor den andre er hva mottakerenden gjør med tegnene.

To familier gjør den omskrivingen på helt ulike måter, og forskjellen forklarer nesten alle overraskelsene på denne siden:

  • Bitpakking — Base32, Base32 Hex, Crockford Base32, z-base-32. Bytene deles i faste grupper, og hver fem bit blir ett tegn. Utdatalengden kan forutsies ut fra inndatalengden, og den siste, delvis fylte gruppen merkes enten med utfyllingstegn eller lar være kort.
  • Konvertering av store tall — alle Base58-tabeller. Hele bytesekvensen leses som ett enormt tall i base 256 og skrives ut igjen i base 58. Det finnes ingen grupper og ingen utfylling; lengden deler seg ikke på noe, og hver ledende nullbyte blir ett ledende nulltegn.
Hvor de seks databærende bitene havner: Base32 bruker fem bit per tegn, så det trenger åtte tegn for hver fem inndatabyte — omtrent 60% større. Base58 bruker omtrent 5,86 bit per tegn, så det havner nær 37% større. Base64 passer seks bit per tegn og havner på 33%. Større alfabeter er kortere, men vanskeligere å lese høyt, og det er nettopp den avveiningen hvert av dem gjør.
De syv alfabetene på denne siden

Hvert alfabet er skrevet ut i sin helhet i stedet for å beskrives, fordi to verktøy som skriver ut ulike tegn under samme navn ikke vil være enige, uansett hva etiketten sier. RFC 4648-radene er normative; Crockford- og z-base-32-radene følger det formatets forfatter har publisert; de tre Base58-radene er utbredte konvensjoner snarere enn standarder, og det er grunnen til at de er listet hver for seg.

Crockford Base32 og kontrollsymbolet modulo 37

Alfabetet dropper I, L, O og U, slik at ingen symbol kan leses som et annet. Det som er igjen, er ufølsomt for store og små bokstaver ved inndata: i og l leses som sifferet 1, o leses som sifferet 0, og bindestreker finnes bare for å gjøre en lang streng lettere å lese. Dessuten definerer formatet et valgfritt kontrollsymbol, som er verdien av symbolstrengen lest som et base 32-tall, tatt modulo 37, og skrevet med fem ekstra symboler for verdiene 32 til 36.

Kontrollsymbolet beregnes over symbolstrengen, ikke over bytene: fordi koderen fyller ut den siste gruppen med nuller, gir dekoding av de samme tegnene alltid tilbake den samme verdien. Derfor kan kontrollverdien i tabellen reproduseres for hånd fra den kodede kolonnen alene. De fem ekstra symbolene er *, ~, $, = og U for verdiene 32, 33, 34, 35 og 36, så et kontrollsymbol er ikke alltid et siffer eller en bokstav.

z-base-32

z-base-32 beholder femsbitspakkingen fra RFC 4648 Base32 og endrer bare rekkefølgen på de trettito tegnene. Rekkefølgen er valgt slik at tegnene en person mest sannsynlig må skrive ned, er de lettest å skrive og vanskeligst å forveksle. Den har ingen utfylling, så leseren må vite hvor mange symboler en verdi forventes å ha; det er prisen for et format som er laget for å leses for hånd først.

Base58Check: én versjonsbyte, nyttelasten, fire byte kontrollsum

Base58 alene har ingen måte å skille en feilskrevet streng fra en korrekt en, fordi nesten enhver kombinasjon av de femtiåtte tegnene er et gyldig tall. Base58Check løser det ved å pakke dataene inn i en ramme: én versjonsbyte, deretter nyttelasten, og så de fire første bytene av SHA-256 brukt to ganger på de to første delene. Et mottakerprogram beregner de fire bytene på nytt og avviser strengen når de ikke stemmer. Versjonsbyten er det som forteller en lommebok om den ser på en betalingsadresse, en skriptadresse eller en privat nøkkel.

Generatoren under konverteren tar versjonsbyten og nyttelasten som heksadesimal og skriver Base58Check-strengen; verifisereren leser en inn igjen, deler av de fire kontrollsumbytene, beregner dem på nytt og oppgir både den den fant og den den forventet. En feil kontrollsum betyr at strengen er skrevet feil eller endret — den betyr aldri at nyttelasten i seg selv er feil, siden nyttelasten aldri tolkes.

Vanlige misforståelser
  • «Base64 er kryptering.» Nei. Det finnes ingen nøkkel og ingen hemmelighet; utdataene kan reverseres av hvem som helst. Base32 og Base58 står i samme stilling, og å dra en verdi gjennom alle tre gir heller ingen beskyttelse.
  • «En Base58-streng er en Bitcoin-adresse.» Bare når den også består Base58Check-kontrollsummen og bærer en versjonsbyte som mottakerprogrammet kjenner igjen. Base58-strenger dukker opp mange andre steder, også som enkle identifikatorer uten noen kontrollsum i det hele tatt.
  • «De tre Base58-alfabetene kan byttes om.» De bruker de samme femtiåtte tegnene i tre ulike rekkefølger, så de samme bytene gir tre ulike strenger. Et verktøy må få vite hvilket alfabet som skal brukes, og denne siden sier alltid hvilket den brukte.
  • «Utfylling er en del av verdien.» Tegnene = markerer bare den siste gruppen. To Base32-strenger som bare skiller seg i utfylling beskriver de samme bytene, og derfor godtar dekoderen en streng der utfyllingen er kuttet av.
  • «Alle tegn fungerer.» Hvert alfabet er et fast sett. Et tegn utenfor det har ingen verdi, så dekoderen stopper og oppgir tegnet og posisjonen i stedet for å gjette.
Spørsmål som ofte dukker opp

Hvorfor bruker Base32 2-7 og ikke 0-9? Fordi RFC 4648 valgte alfabetet slik at det holder seg innenfor tegnene et domenenavn kan inneholde, og slik at det er lett å lese høyt. Base32 Hex bruker 0-9 A-V i stedet når naturlig sortering betyr mer.

Hvorfor begynner en Base58-streng så ofte med 1? Hver ledende nullbyte i inndataene blir ett ledende 1 (det første tegnet i Bitcoin- og Flickr-alfabetene). En versjonsbyte på 0x00 er én nullbyte, så de fleste Bitcoin-adresser på hovednettet begynner med nøyaktig én 1.

Hva laster Eksempel-knappen? Eksempelet som hører til ordningen og retningen som vises på skjermen, aldri en fast tekst. Koderen får teksten i ordningens eget eksempel — RFC 4648 seksjon 10-vektorene for Base32 og Base32 Hex, Crockfords 12345, z-base-32-radene skrevet ut over — og dekoderen får den kodede strengen for det valgte alfabetet. Det er det som gjør eksempelet brukbart i begge retninger. De tre Base58-radene har bevisst samme tekst, slik at man ved å bytte ordning og trykke Eksempel på nytt ser de tre rekkefølgene av de samme femtiåtte tegnene side om side. Med Crockford-kontrollsymbolet avkrysset får dekoderen verdien med symbolet på slutten, som er den eneste måten å se verifisereren godta ett.

Sender denne siden data noe sted? Nei. Alle konverteringer skjer i denne nettleserfanen, og siden inneholder ingen nettverkskall av noe slag. Det er også derfor den fungerer når filen åpnes direkte fra disken.

Hvilken bør man bruke for en hemmelighet? TOTP- og HOTP-hemmeligheter for autentiserings-apper er vanligvis Base32 i RFC 4648-alfabetet, fordi hemmeligheten må skrives inn for hånd. Bruk den som mottakerprogrammet ber om, og stol aldri på kodingen selv for hemmelighold.