Το **base64** είναι ομάδα ομοειδών κωδικοποιήσεων ψηφιακών δεδομένων σε κείμενο. Η κωδικοποίηση αυτή αντιστοιχεί τα μπάιτ ενός αρχείου σε ένα υποσύνολο του ASCII που αποτελείται μόνο από εκτυπώσιμους χαρακτήρες. Κάθε «ψηφίο» ενός κειμένου, κωδικοποιημένου με Base64, αντιστοιχεί σε 6 δυαδικά ψηφία των δυαδικών δεδομένων και επομένως η κωδικοποίηση ενός μπάιτ απαιτεί τουλάχιστον 2 «ψηφία». Πάντα κωδικοποιούνται τρία συνεχόμενα μπάιτ, δηλαδή τα τρία μπάιτ, που αποτελούνται από 8 μπιτ (σύνολο 24 μπιτ), μετατρέπονται σε 4 συνεχόμενα «ψηφία» του συστήματος Base64.

Χρήση
-----

Η μετατροπή σε κωδικοποίηση base64 χρησιμοποιείται ευρέως (αν και πολλές φορές αδιαφανώς) στην ηλεκτρονική αλληλογραφία. Τα επισυναπτόμενα κωδικοποιούνται ως base64 και το πρόγραμμα που τρέχει στον υπολογιστή σας ή στον πάροχο web mail που χρησιμοποιείτε (gmail, yahoo κλπ.) τα μετατρέπει σε ψηφιακά αρχεία. Μπορείτε να δείτε το κείμενο αν επιλέξετε *εμφάνιση πηγαίου μηνύματος* (ή κάποια αντίστοιχη επιλογή στο πρόγραμμα ηλεκτρονικής αλληλογραφίας που χρησιμοποιείτε).

Χρησιμοποιείται επίσης ευρέως στην αποθήκευση και μετάδοση πιστοποιητικών και δημόσιων κλειδιών

Το κωδικοποιημένο σε base64 αντικείμενο συνήθως περιλαμβάνεται ανάμεσα σε δύο γραμμές που διευκρινίζουν τη χρήση του.

Μετατροπή σε Base64
-------------------

Στοιχειώδης πίνακας αντιστοίχισης Base64:

|  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Τιμή | Χαρακτήρας |   | Τιμή | Χαρακτήρας |   | Τιμή | Χαρακτήρας |   | Τιμή | Χαρακτήρας |
| 0 | `A` | 16 | `Q` | 32 | `g` | 48 | `w` |
| 1 | `B` | 17 | `R` | 33 | `h` | 49 | `x` |
| 2 | `C` | 18 | `S` | 34 | `i` | 50 | `y` |
| 3 | `D` | 19 | `T` | 35 | `j` | 51 | `z` |
| 4 | `E` | 20 | `U` | 36 | `k` | 52 | `0` |
| 5 | `F` | 21 | `V` | 37 | `l` | 53 | `1` |
| 6 | `G` | 22 | `W` | 38 | `m` | 54 | `2` |
| 7 | `H` | 23 | `X` | 39 | `n` | 55 | `3` |
| 8 | `I` | 24 | `Y` | 40 | `o` | 56 | `4` |
| 9 | `J` | 25 | `Z` | 41 | `p` | 57 | `5` |
| 10 | `K` | 26 | `a` | 42 | `q` | 58 | `6` |
| 11 | `L` | 27 | `b` | 43 | `r` | 59 | `7` |
| 12 | `M` | 28 | `c` | 44 | `s` | 60 | `8` |
| 13 | `N` | 29 | `d` | 45 | `t` | 61 | `9` |
| 14 | `O` | 30 | `e` | 46 | `u` | 62 | `+` |
| 15 | `P` | 31 | `f` | 47 | `v` | 63 | `/` |

  

Για πρακτικούς λόγους η μετατροπή γίνεται πάντα με μετατροπή ομάδων τριών συνεχόμενων μπάιτ σε 4 «ψηφία» του συστήματος base64. 
Έτσι η μετατροπή ενός αρχείου τριών μπάιτ π.χ. 0x3e, 0x0b, 0x70 γίνεται παίρνοντας τα δυαδικά ψηφία των τριών μπάιτ σε ομάδες των 6 δυαδικών ψηφίων, που θα μας δώσουν 4 δυαδικούς αριθμούς, τους οποίους θα χρησιμοποιήσουμε σαν δείκτες για να βρούμε τα κωδικοποιημένα «ψηφία»:

|  |  |  |  |
| --- | --- | --- | --- |
| Μπάιτ (δεκαδική τιμή) | 3e16 (6210) | 0b16 (1110) | 7016 (11210) |
| δυαδικά ψηφία | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
| Δείκτης | 15 (0011112) | 32 (1000002) | 45 (1011012) | 48 (1100002) |
| Αντιστοίχιση | **P** | **g** | **t** | **w** |

Επομένως το κωδικοποιημένο πλέον κείμενο είναι το: Pgtw

Όπως είναι προφανές επιλέγοντας ομάδες των τριών μπάιτ στο τέλος μπορεί να περισσέψουν ένα ή δύο (ή κανένα) μπάιτ. Τότε υποδεικνύουμε αυτό το υπόλοιπο χρησιμοποιώντας τον χαρακτήρα = (ίσον) στο τελικό κωδικοποιημένο κείμενο. Αν στο τέλος έχει μείνει μόνο ένα μπάιτ προσθέτουμε στο κωδικωποιημένο κείμενο 2 ίσον (==) ενώ αν έχουν μείνει δύο προσθέτουμε (πάντα στο κωδικοποιήμενο ήδη κείμενο) ένα ίσον.

Αν το προηγούμενο αρχείο αποτελούνταν από 4 μπάιτ π.χ. 0x3e, 0x0b, 0x70, 0x2d 

|  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- |
| Μπάιτ (στο δεκαδικό) | 3e16 (6210) | 0b16 (1110) | 7016 (11210) | 2d16 (4510) |  |  |
| δυαδικά ψηφία | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Δείκτης | 15 (0011112) | 32 (1000002) | 45 (1011012) | 48 (1100002) | 11 (0010112) | 16 (0100002) |  |  |
| Αντιστοίχιση | **P** | **g** | **t** | **w** | **L** | **Q** |  |

Επομένως η κωδικοποίηση μας δίνει: PgtwLQ

Για να υποδείξουμε στον αποκωδικοποιητή ότι στο τέλος δεν υπήρχε τριάδα, αλλά μόνο ένα μπάιτ, προσθέτουμε δύο ίσον (==) δημιουργώντας έτσι το κωδικοποιημένο κείμενο: PgtwLQ==.

Διαφορές στην υλοποίηση
-----------------------

| Παραλλαγή | Χαρακτήρας 62 | Χαρακτήρας 63 | *συμπληρωματικός* χαρακτήρας | Σταθερό μήκος γραμμής | Μέγιστο μήκος γραμμής | Διαχωριστικά γραμμής | Χαρακτήρες εκτός πίνακα αντιστοίχισης | άθροισμα ελέγχου |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| RFC 1421 (παρωχημένο) | `+` | `/` | `=` *(υποχρεωτικό)* | Ναι (πλην της τελευταίας) | 64 | CR+LF | Απαγορεύονται | Κανένα |
| RFC 2045 | `+` | `/` | `=` *(υποχρεωτικό)* | Όχι (μεταβλητό) | 76 | CR+LF | Επιτρέπονται (αλλά αγνοούνται) | Κανένα |
| RFC 3548, RFC 4648 | `+` | `/` | `=` *(υποχρεωτικό, εκτός αν ορίζεται αλλιώς στο αναφερόμενο έγγραφο)* | Όχι *(εκτός αν ορίζεται αλλιώς στο αναφερόμενο έγγραφο)* | Όχι *(εκτός αν ορίζεται αλλιώς στο αναφερόμενο έγγραφο)* | Κανένα *(εκτός αν ορίζεται αλλιώς στο αναφερόμενο έγγραφο)* | Απαγορεύονται *(εκτός αν ορίζεται αλλιώς στο αναφερόμενο έγγραφο)* | Κανένα |
| RFC 4880 | `+` | `/` | `=` *(υποχρεωτικό)* | Όχι (μεταβλητό) | 76 | CR+LF | Απαγορεύονται | 24-bit CRC |
| RFC 1642 (παρωχημένο) | `+` | `/` | Κανένας | Όχι (μεταβλητό) | Κανένα | Κανένα | Απαγορεύονται | Κανένα |
| RFC 3501 | `+` | `,` | Κανένας | Όχι (μεταβλητό) | Κανένα | Κανένα | Απαγορεύονται | Κανένα |
| RFC 4648, §5 'Table 2: The "URL and Filename safe" Base 64 Alphabet' | `-` | `_` | Προαιρετικό `=` *(προαιρετικό αν το μήκος των δεδομένων είναι γνωστό, αλλιώς κωδικοποιημένο σε μορφή αποδεκτή για URL)* | Όχι (μεταβλητό) | *εξαρτάται από την εφαρμογή που θα το χρησιμοποιήσει* | Κανένα | Απαγορεύονται | Κανένα |
| RFC 7515 | `-` | `_` | Κανένας | Όχι (μεταβλητό) | *εξαρτάται από την εφαρμογή που θα το χρησιμοποιήσει* | Κανένα | Απαγορεύονται | Κανένα |

Παραπομπές
----------

1. ↑  «Κωδικοποίηση ή αποκωδικοποίηση σε base64 | Linux Inside». 23 Ιουλίου 2013. Ανακτήθηκε στις 20 Μαρτίου 2018.
2. ↑  «When embedding base64 encoded images to Html content of Send Email component, recipient email client does not display image» (στα Αγγλικά). Ανακτήθηκε στις 20 Μαρτίου 2018.
3. ↑  «DER vs. CRT vs. CER vs. PEM Certificates and How To Convert Them» (στα Αγγλικά). Αρχειοθετήθηκε από το πρωτότυπο στις 14 Ιουλίου 2017. Ανακτήθηκε στις 20 Μαρτίου 2018.
4. ↑  «HTTP Public Key Pinning (HPKP)». *MDN Web Docs* (στα Αγγλικά). Ανακτήθηκε στις 20 Μαρτίου 2018.
5. ↑  «IBM Knowledge Center - Base64-encoded certificates» (στα Αγγλικά). Ανακτήθηκε στις 20 Μαρτίου 2018.
6. ↑  Tschabitscher, Heinz. «How 'Base64' Encoding Works (Email)». *Lifewire* (στα Αγγλικά). Ανακτήθηκε στις 20 Μαρτίου 2018.