www.mamboteam.com
Project1.pl Advertisement
Start arrow Artykuły arrow Kryptografia arrow Szyfr BASE64
piątek, 30 lipiec 2010
 
 
Menu główne
Start
Artykuły
FAQ
Download
Kontakt
Ciekawe linki
Mapa serwisu
Logowanie





Zapomniałeś hasła?
Nie masz konta? Załóż sobie
Szyfr BASE64 Drukuj E-mail
Oceny: / 0
KiepskiBardzo dobry 
Napisał: Berl   
niedziela, 26 marzec 2006
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.
Komentarze

Aby dodać komentarz zaloguj się. Jeśli nie masz konta, załóż je sobie.
Tylko zarejestrowani użytkownicy mogą pisać komentarze.

 
wstecz   dalej »
LINKUJ PRO
Gościmy
Odwiedza nas 4 gości
Licznik odwiedzin
112119
 
Góra Góra