|
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
|
|