BASE-64

        Algorytm Base64 służy do konwersji ciągu bajtów binarnych do postaci znaków z kodu ASCII. Kod wynikowy przekształcenia, można zamieścić w treści wysyłanej poczty elektronicznej lub na własnej stronie internetowej. Konwersji możemy poddać każdy plik, jak na przykład pliki muzyczne, filmy i wiele innych. Wadą zastosowaniatego algorytmu jest przyrost informacji w jego wyniku o około 1/4. Ciąg znaków ASCII Base64 jest poddawany dekodowaniu przez osobę odbierającą informację, otrzymując pierwotną postać zmienionego pliku lub tekstu. Stosowanie tego algorytmu praktykuje się przede wszystkim w plikach certyfikacyjnych zawierające klucz publiczny itp.

1. Opis algorytmu BASE-64


        Base64 w jednym kroku przekształca 3 bajtowy blok danych wejściowych i zwraca 4 bajty po przekształceniu. Otrzymany ciąg składa się ze zbioru 65-u możliwych znaków drukowalnych. Jeden znak z tego zbioru używany jest jako dopełnienie, więc w dyspozycji jest 64 znaków. Alfabet dostępnych znaków znajduje się w tabeli 1.1. Ponieważ każdy znak reprezentowany jest przez 6 bitów, 24 bity danych wejściowych (3 * 8 bitów) przekształcone zostają w 4, 6 bitowe ciągi wyjściowe (najstarsze bity są zerami więc otrzymujemy 4 * 8). Na rysunku 1.1 widzimy ogólny schemat przekształcenia.



Rys 1.1.  Schemat ogólny kodowania danych binarnych do formatu Base64


        Poniższa tabela zawiera zbiór dostępnych znaków stosowanych w Base64. Nie został w niej ujęty tylko jeden znak będący dopełnieniem (=) o czym już była mowa. Znak ten może wystąpić 1 raz, 2 lub w ogóle, jednak pojawienie się jego możliwe jest jedynie na końcu przetworzonego komunikatu.


Tabela 1.1.  Alfabet algorytmu Base64

Indeks

Znak

Indeks

Znak

Indeks

Znak

0

A

22

W

44

s

1

B

23

X

45

t

2

C

24

Y

46

u

3

D

25

Z

47

v

4

E

26

a

48

w

5

F

27

b

49

x

6

G

28

c

50

y

7

H

29

d

51

z

8

I

30

e

52

0

9

J

31

f

53

1

10

K

32

g

54

2

11

L

33

h

55

3

12

M

34

i

56

4

13

N

35

j

57

5

14

O

36

k

58

6

15

P

37

l

59

7

16

Q

38

m

60

8

17

R

39

n

61

9

18

S

40

o

62

+

19

T

41

p

63

/

20

U

42

q

 

 

21

V

43

r

 

 

2. Wykonywane operacje arytmetyczno-logiczne


        W algorytmie zastosowano podstawowe operacje logiczne, które są bardzo proste w implementacji. Bloki danych wejściowych zostają poddane:

  • przesunięcie binarne w lewo (shl - shift left),
  • przesunięcie binarne w prawo (shr - shift right),
  • iloczyn logiczny and,
  • suma logiczna or.


        Niech zmienne x, y i z będą kolejnymi oktetami na wejściu. Niech zbiór znaków alfabetu Base64 będzie zawierać zmienna tablicowa Alfabet = {ABC..., abc..., 123..., +/}. Aby otrzymać 4-ro bajtowy wyciąg końcowy, należy przeprowadzić następujące operacje:
  • x' = Alfabet[x shr 2]
  • y' = Alfabet[((x and 3) shl 4) or ((y and 240) shr 4)]
  • z' = Alfabet[((y and 15) shl 2) or ((z and 192) shr 6)]
  • w  = Alfabet[z and 63]


        Wynik operacji logicznych (wewnątrz nawiasów kwadratowych) wyznacza numer indeksu tablicy Alfabet (Tabela 1.1), któremu odpowiada określony znak będący efektem końcowym algorytmu.

        W przypadku gdy na wejście nie możemy podać pełnego oktetu ale 1 lub 2 bajty (np. gdy długość pliku ), należy przyjąć odpowiednie postępowanie. Przypadek ten zmusza do wykorzystania dopełnienia w postaci znaku = (jak najbardziej znak ten jest dopuszczalny i stosowany jedynie w celu dopełnienia). Jeżeli podamy tylko jeden bajt, otrzymamy x' i y' w postaci wartości z alfabetu, a z' i w będzie dopełnieniem (z' = w = '='). Analogiczne postępowanie gdy na wejście podamy 16 bitów (4 bajt - w, jest dopełnieniem).

        Po zakończeniu przetwarzania danych, na końcu pliku powinien się znajdować znacznik końca linii i powrotu karetki do początku wiersza. Po 48 bajtach poddanych kodowaniu, czyli 64 bajtach kodu wynikowego, następną porcję kodu piszemy do pliku w nowym wierszu co oznacza, że wiersz jest kończony znacznikiem CRLF.

3. Przykład kodowania


Rys 3.1.  Przykład kodowania informacji

4. Wykonywane operacje przy dekodowaniu


        Ponieważ wykonując proces kodowania w 3 bajtowym bloku, dostajemy wyciąg równy 4 bajty, dlatego operacja odwrócenia potrzebuje otrzymać na wejście 32 bity. Operacje arytmetyczno-logiczne zastosowane tutaj są identyczne.

        Niech zmienne x, y, z i w będą sekwencją na wejściu. Niech zbiór znaków alfabetu Base64 będzie zawierać zmienna tablicowa Alfabet = {ABC..., abc..., 123..., +/}. Cztery wymienione zmienne (x, y, z i w) otrzymują nowe wartości na podstawie tablicy alfabetu. Wyszukujemy w tablicy alfabet, znaku jaki został podany na wejście i zwracamy pod tą zmienną numer indeksu dla tej tablicy. Postępujemy w ten sposób dla wszystkich 4 bajtów reprezentowanych przez x, y, z i w. Aby otrzymać 24 bitowy wyciąg końcowy będący wynikiem dekodowania, należy przeprowadzić następujące operacje:

  • x' = (x shl 2) or (y shr 4)
  • y' = (y shl 4) or ((z shr 2) and 15)
  • z' = ((z shl 6) and 192) or (w and 63)


        Czytając plik, napotkamy na znaki sterujące takie jak CRLF (0D i 0A) , które należy ignorować. Wystąpienie znaków dopełniających (=) traktujemy jak 0.

5. Przykład dekodowania


Rys 5.1.  Przykład dekodowania

Mój adres e-mail: szyfrantd@poczta.onet.pl


------------ zobacz m.in. --------------------------------------------------------------------
blowfish