Szyfr ten jest stosowany do kodowania wiadomości e-mail. Jego cechą charakterystyczną jest występowanie w tekście zaszyfrowanym tylko znaków drukowalnych, oraz to, że tekst zaszyfrowany ma o 33% większą objętość niż tekst jawny.
Do szyfrowania za pomocą tego algorytmu potrzebny jest ściśle określony zbiór sześćdziesięciu pięciu znaków drukowalnych, przedstawiony w poniższej tabelce :
| 0 A |
17 R |
34 i |
51 z |
| 1 B |
18 S |
35 j |
52 0 |
| 2 C |
19 T |
36 k |
53 1 |
| 3 D |
20 U |
37 l |
54 2 |
| 4 E |
21 V |
38 m |
55 3 |
| 5 F |
22 W |
39 n |
56 4 |
| 6 G |
23 X |
40 o |
57 5 |
| 7 H |
24 Y |
41 p |
58 6 |
| 8 I |
25 Z |
42 q |
59 7 |
| 9 J |
26 a |
43 r |
60 8 |
| 10 K |
27 b |
44 s |
61 9 |
| 11 L |
28 c |
45 t |
62 + |
| 12 M |
29 d |
46 u |
63 / |
| 13 N |
30 e |
47 v |
|
| 14 O |
31 f |
48 w |
= |
| 15 P |
32 g/td>
| 49 x |
|
| 16 Q |
33 h |
50 y |
|
Dane przeznaczone do zakodowania dzielone są najpierw na 3-bajtowe grupy, po czym każda z takich trójek dzielona jest na cztery 6-bitowe liczby. Każda liczba otrzymuje następnie odpowiednik w postaci jednego znaku z powyższej tabeli.
Przykład :
program Base64;
{$APPTYPE CONSOLE}
uses SysUtils, Math;
function BinNaDec(Bin: String): Cardinal;
var
n, Suma: Integer;
begin
Suma:=0;
for n:=1 to Length(Bin) do
begin
if Bin[n]='1' then Suma:=Suma+Round(IntPower(2,Length(Bin)-n));
end;
Result:=Suma;
end;
function DecKonwert(Dec: Cardinal; System: Byte): String;
var
R: Byte;
S: String;
begin
S:='';
repeat
R:=Dec mod System;
Dec:=Dec div System;
case R of
0..9: Insert(IntToStr(R),S,0);
10..15: Insert(Chr(55+R),S,0);
end;
until Dec=0;
Result:=S;
end;
function DecNaBin(Dec: Cardinal): String;
begin
Result:=DecKonwert(Dec,2);
end;
function NaBase64(Ciag : string) : string;
var
i, j : integer;
CiagBinarny, CiagBinarny1 : String;
MaleCiagi : array[1..4] of string;
Stala : byte;
B64Table : string;
begin
B64Table := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
Result := '';
if (Length(Ciag) mod 3) = 0 then Stala := 0
else Stala := 1;
for i := 1 to (Length(Ciag) div 3)+Stala do begin
CiagBinarny := '';
for j := 1 to 3 do begin
CiagBinarny1 := DecNaBin(Ord(Ciag[j+((i-1)*3)]));
if Length(CiagBinarny1) = 1 then CiagBinarny1 := '0000000' + CiagBinarny1;
if Length(CiagBinarny1) = 2 then CiagBinarny1 := '000000' + CiagBinarny1;
if Length(CiagBinarny1) = 3 then CiagBinarny1 := '00000' + CiagBinarny1;
if Length(CiagBinarny1) = 4 then CiagBinarny1 := '0000' + CiagBinarny1;
if Length(CiagBinarny1) = 5 then CiagBinarny1 := '000' + CiagBinarny1;
if Length(CiagBinarny1) = 6 then CiagBinarny1 := '00' + CiagBinarny1;
if Length(CiagBinarny1) = 7 then CiagBinarny1 := '0' + CiagBinarny1;
CiagBinarny := CiagBinarny + CiagBinarny1;
end;
MaleCiagi[1] := Copy(CiagBinarny, 1, 6);
MaleCiagi[2] := Copy(CiagBinarny, 7, 6);
MaleCiagi[3] := Copy(CiagBinarny, 13, 6);
MaleCiagi[4] := Copy(CiagBinarny, 19, 6);
MaleCiagi[1] := '00' + MaleCiagi[1];
MaleCiagi[2] := '00' + MaleCiagi[2];
MaleCiagi[3] := '00' + MaleCiagi[3];
MaleCiagi[4] := '00' + MaleCiagi[4];
Result := Result + B64Table[BinNaDec(MaleCiagi[1])+1];
Result := Result + B64Table[BinNaDec(MaleCiagi[2])+1];
Result := Result + B64Table[BinNaDec(MaleCiagi[3])+1];
Result := Result + B64Table[BinNaDec(MaleCiagi[4])+1];
end;
if Length(Ciag) mod 3 = 1 then begin
Delete(Result, Length(Result) - 1, 2);
Result := Result + '==';
end;
if Length(Ciag) mod 3 = 2 then begin
Delete(Result, Length(Result), 1);
Result := Result + '=';
end;
end;
var
Tekst : string;
begin
WriteLn('Podaj tekst do zaszyfrowania : ');
ReadLn(Tekst);
WriteLn('Tekst zaszyfrowany : ');
WriteLn(NaBase64(Tekst));
ReadLn;
end.
Dekodowanie polega na wykonaniu powyższych operacji w odwrotnej kolejności, gdyż jest to szyfr symetryczny. Zainteresowanych odsyłam do RFC 1521, gdzie kodowanie tym algorytmem opisane jest dokładniej.
Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.