# Base64

Base64 és un sistema de numeració posicional que fa servir 64 com a base. És la major potència de dos que pot ser representada usant únicament els caràcters imprimibles del codi ASCII. Això ha propiciat el seu ús per a la codificació de correus electrònics, PGP i altres aplicacions. Totes les variants famoses que es coneixen amb el nom de Base64 usen el conjunt de caràcters A-Z, a-z i 0-9 en aquest ordre per als primers 62 (26+26+10) dígits, però els símbols escollits per als últims dos dígits varien considerablement de les unes a les altres. Altres mètodes de codificació, com UUENCODE i les últimes versions de binhex usen un conjunt diferent de 64 caràcters per a representar 6 dígits binaris, però aquests mai són anomenats Base64.

## Esquemes de codificació a base 64
### Protocol Privacy-Enhanced Electronic Mail (PEM)

La primera aplicació coneguda de la codificació Base64 per a transmissions electròniques de dades va ser el protocol Privacy-enhanced Electronic Mail (PEM), proposat pel RFC 989 el 1987. PEM defineix un esquema de caràcters imprimibles que utilitza Base64 per a transformar una seqüència arbitrària d'octets en un format que pot ser expressat en línies curtes de caràcters de 7 bits, com ara les necessàries en protocols de transmissió com SMTP.
La versió actual de PEM (especificada en el RFC 1421) fa servir un alfabet de 64 caràcters consistent en els caràcters en majúscula i minúscula de l'alfabet llatí (A-Z, a-z), els numerals (0-9) i els símbols '+' i '/'. El símbol '=' s'usa com un sufix especial. L'especificació original (RFC 989) fa servir a més el caràcter '*' per a delimitar la part codificada però no xifrada del flux de sortida.
Per transformar dades en una codificació PEM imprimible, el primer byte se situa en els 8 bits més significatius d'una memòria intermèdia de 24 bits, el següent en els 8 del mig i el tercer en els de menor pes. Si hi ha menys de 3 bytes per codificar, la resta de la memòria intermèdia s'omple amb zeros. En aquest punt, la memòria intermèdia s'usa de manera que es van extraient 6 bits des de la part més significativa per a ser usats com a índex dins de la cadena: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", de manera que el caràcter indicat serà la sortida.
Aquest procés es repeteix amb les dades restants fins que quedin menys de quatre octets. Si en queden tres, es processen de forma normal, mentre que si queden menys de 3 bytes (24 bits), l'entrada s'omplirà amb zeros per la dreta per formar un múltiple de 6 bits.
Després de codificar les dades, si en el pas anterior quedaven 2 octets per codificar, llavors s'afegeix el caràcter '=' al final de la sortida, si només quedava un octet, es concatenen dos caràcters '='. Això avisa el descodificador que els bits a 0 que s'hagin afegit de farciment no han de formar part de les dades reconstruïdes.
PEM necessita que totes les línies codificades estiguin formades exactament per 64 caràcters imprimibles, amb l'excepció de l'última, que en pot contenir menys. Les línies estaran delimitades per caràcters d'espai en blanc d'acord amb les convencions específiques de la plataforma.

### MIME

L'especificació MIME (Multipurpose Internet Mail Extensions) definida en el RFC 2045, descriu Base64 com un dels sistemes de codificació de binari a text. La Base64 de MIME es basa en la versió de PEM que es descriu en el RFC 1421: utilitza el mateix alfabet de 64 caràcters i el mateix mecanisme de codificació, igual que fa servir el símbol '=' per a assenyalar el farcit final, com es descriu en el RFC 1521.
MIME no especifica una mida fixa per a les línies codificades en Base64, però sí que cal una mida màxima de 76 caràcters. A més, concreta que qualsevol caràcter que no pertanyi a l'alfabet ha de ser ignorat pels descodificadors, encara que moltes implementacions fan servir els caràcters CR/LF (retorn de carro i salt de línia) per delimitar les línies codificades. D'aquesta manera la mida real de les dades codificades d'acord amb MIME sol ser d'un 140% de la mida original.

### UTF-7

UTF-7, descrit en el RFC 2152, va introduir un sistema anomenat Modified Base64 (Base64 Modificat). Aquest esquema de codificació s'usa per a codificar UTF-16 com a caràcters ASCII per a ser usats en transmissions de 7 bits com en SMTP. És una variant del Base64 usat en MIME.
L'alfabet de Base64 Modificat consisteix en l'alfabet de Base64 usat en MIME, però no fa servir el caràcter '='. UTF-7 es va pretendre fer servir per a les capçaleres dels correus (definit en RFC 2047), i el caràcter '=' es reserva en aquest context com a caràcter d'escapament per codificació Quoted-Printable. Base 64 Modificat simplement omet el farcit i acaba immediatament després de l'últim dígit Base64 que conté bits útils (deixant inútils els bits 0-4 de l'últim dígit Base64).

### OpenPGP

OpenPGP, descrit en el RFC 2440, utilitza la codificació Radix-64, també coneguda com a ASCII Armor. Radix-64 és idèntic a Base64 de MIME, excepte en el fet que afegeix una suma de verificació CRC de 24 bits. Aquesta suma es calcula sobre les dades d'entrada, abans de codificar, i posteriorment es codifica amb el mateix Base64 pera ser concatenada a la codificació resultant.

### IRCu

En el protocol P10 de servidor-servidor utilitzat pel dimoni IRC IRCu i programari compatible, s'usa una versió de Base64 per a codificar les dades numèriques de client/servidor i de les adreces IP binàries. Aquestes dades numèriques de la comunicació entre el client i el servidor tenen mides fixes, amb un nombre exacte de dígits Base64, de manera que no necessiten farciment final. Les adreces IP binàries tenen bits a 0 alcomençament per a fer-les encaixar. El símbol utilitzat és una mica diferent de l'usat en l'alfabet de MIME, utilitzant "" en lloc de "+/" a fi d'evitar conflictes amb altres parts del protocol que fan servir el caràcter '+' internament com a indicador d'establiment de maneres.

### RFC 3548

RFC 3548 (codificacions Base16, Base32 i Base64) és un document informal (no normatiu) que tracta d'unificar les especificacions RFC 1421 i RFC 2045 de Base64, amb alfabets alternatius i també les codificacions Base32 i Base16, usades molt rarament.
RFC 3548 prohibeix a les implementacions afegir caràcters no alfabètics i estableix que els descodificadors han de rebutjar dades que continguin caràcters no alfabètics, tot això si no estan previstos en una especificació que es refereixi a aquesta o que, en tot cas, la requereixi.

### RFC 4648

Aquest RFC fa obsolet al RFC 3548 i es refereix al mateix tema. Descriu les codificacions Base64, Base32 i Base16 usades comunament i tracta qüestions com l'ús de salts de línia, farcits, amb caràcters no alfabètics en les dades codificades i la utilització d'altres alfabets i codificacions canòniques.

## Exemple

Una cita de Joan Fuster pertanyent a l'obra Diccionari per a ociosos (1964):
    Morir-se massa jove és un error. Morir-se massa vell, també. En general, morir-se és sempre un error.
es codifica en Base64 de la manera següent:
A la cita de dalt el valor codificat de Mor és TW9y. S'obté pel procediment següent. Codificades en ASCII, les lletres M, o i r s'emmagatzemen com els bytes 77, 111 i 114, és a dir, 0100 1101, 0110 1111 i 0111 0010 en base 2. Ara, unint aquests tres bytes s'obté el buffer de 24 bits, que serà 010011010110111101110010. Aquesta corrua de bits es convertirà al seu valor Base64 agrupant-los de 6 en 6 (6 bits formen com a màxim 64 valors diferents en binari: 2$^6$). A continuació, agafant cada vegada 6 bits de la memòria intermèdia, s'obtenen 4 números (24 = 6 x 4), que llavors es converteixen al seu corresponent valor en Base64.
| Text d'entrada | M | M | M | M | M | M | M | M | o | o | o | o | o | o | o | o | r | r | r | r | r | r | r | r |
| ASCII | 77 | 77 | 77 | 77 | 77 | 77 | 77 | 77 | 111 | 111 | 111 | 111 | 111 | 111 | 111 | 111 | 114 | 114 | 114 | 114 | 114 | 114 | 114 | 114 |
| Bits | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 |
| Índex | 19 | 19 | 19 | 19 | 19 | 19 | 22 | 22 | 22 | 22 | 22 | 22 | 61 | 61 | 61 | 61 | 61 | 61 | 50 | 50 | 50 | 50 | 50 | 50 |
| Resultat en Base64 | T | T | T | T | T | T | W | W | W | W | W | W | 9 | 9 | 9 | 9 | 9 | 9 | y | y | y | y | y | y |
Per tant, com a entrada hi ha 3 bytes sense codificar (en aquest cas, caràcters ASCII) i com a resultat s'obtenen 4 caràcters ASCII codificats.
Il·lustració del marcat de farciment a mesura que escurcem l'entrada:

## Aplicacions en URL

La codificació Base64 pot ser útil quan la mida de la informació d'identificació usada en un entorn https és bastant gran. L'entorn de treball de base de dades per a objectes persistents anomenat Hibernate per al llenguatge de programació Java fa servir Base64 per a codificar una ID única relativament gran (generalment UUIDs de 128 bits) dins d'una cadena de text per a ser usada com a paràmetre http en els formularis o en la manera de transmissió GET. Igualment, gran quantitat d'aplicacions necessiten codificar dades binàries de manera que puguin ser introduïdes en les URL, així com en els camps ocults dels formularis. Base64 resulta adequat per a aquests propòsits, ja que a més de transformar-les en una cadena compacta, oculta la naturalesa de les dades davant possibles observadors.
L'ús d'un codificador d'URL sobre Base64 estàndard, però, no és adequat, ja que traduirà els caràcters '+' i '/' en les seqüències especials en hexadecimal% XX ('+' = '% 2B' i '/' = '% 2F'). Si posteriorment es fa servir per a emmagatzematge en base de dades o entre sistemes heterogenis, produiran un conflicte en el caràcter '%' generat pel codificador d'URL (pel fet que aquest caràcter és usat en ANSI SQL com a comodí).
Per això hi ha un Base64 Modificat per URL, onno s'usa el caràcter '=' de marcat de farciment, i els caràcters '+' i '/' del Base64 estàndard són substituïts per '*' i '- ' respectivament, de manera que ja no es necessita utilitzar codificadors d'URL. A més, no té impacte en la mida de la codificació, que deixa intacta per a ús en bases de dades relacionals, formularis web i identificadors d'objectes en general.
Una altra variant, anomenada Base64 Modificat per expressions regulars, usa "! -" en lloc de "*-" per a substituir el "+/" del Base64 estàndard, pel fet que tant '+' com '*' són caràcters reservats per les expressions regulars (cal remarcar que el "" usat en la variant IRCu descrita més amunt no funcionarà en aquest context).
També hi ha altres variants que usen "_-" o ". _" Quan la cadena codificada serà usada com a identificador vàlid per a programes, o ".-" quan s'usa per als tokens de XML (Nmtoken), o fins i tot "_:" per a ser usada en un els identificadors més restrictius de XML (Name).

## Altres aplicacions

Base64 s'usa també per a altres aplicacions, com ara:
* Thunderbird i Evolution fan servir Base64 per a ofuscar les contrasenyes de correu electrònic.
* Ofuscació insegura però ràpida d'informació privada sense la necessitat de la gestió de claus de la criptografia.
* Els spammers fan servir Base64 per a evitar algunes proteccions anti-spam, que no solen descodificar Base64, i, per tant, no poden detectar paraules prohibides en els missatges codificats.
* Codificació de cadenes de caràcters en fitxers LDIF.
* Incorporació de dades binàries en fitxers XML, usant una sintaxi similar a <Dades encoding="base64"> ....... Per exemple, els marcadors de Firefox emmagatzemats en bookmarks.html.
* En el llenguatge CSS es pot, literalment, escriure una imatge en Base64 en comptes de carregar una imatge des d'un servidor.

## Un exemple programàtic

A continuació es mostra un exemple de com codificar i descodificar un text usant Base64. L'exemple que es mostra està escrit en el llenguatge de programació Python
A php també es permet l'ús de Base64. En el següent exemple hom pot veure com es codifica/descodifica en Base64 amb PHP:

## Vegeu també

* UUENCODE
* MIME
* URL
* Base58 — Modificació utilitzada en aplicacions com Bitcoin

## Enllaços externs

* RFC 989 (Privacy Enhancement for Electronic Internet Mail) (obsolet)
* RFC 1421 (Privacy Enhancement for Electronic Internet Mail)
* RFC 2045 (Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies)
* RFC 3548 (The base16, Base32, and Base64 Data Encodings)
* RFC 4648 (The base16, Base32, and Base64 Data Encodings)