Kodowanie przesyłanych pakietów (RC5)

0

Witam :)
Mam prośbę do wszystkich otóż piszę aplikację klient/serwer, która ma przesyłać dane ( i tu w sumie nie ma żadnego problemu) korzystając z jakiegos alg. kryptograficznego. na razie jedynym typem kodowania jest u mnie XOR no ale niestety nie o takie kodowanie chodzi. Oto część kodu po stronie serwera odpowiedzialna za przesyłanie danych:

if comm = 'copy' then
      begin
        MainForm.LogList.Items.Add(DateTimeToStr(Now) + ': COPY command');
        Wyslij(Klienci[PInt^], 'ok' + EOL); // potwierdza otrzymanie polecenia 'kopiuj'
        comm := Pobierz(Klienci[PInt^], Size);  // odczytuje nazwę pliku do kopiowania
        pozycja := 0;
        AssignFile(plik, RootDir + '\' + comm);
        Reset(plik, 1);
        Wyslij(Klienci[PInt^], IntToStr(FileSize(plik)) + EOL);
        repeat
          Seek(plik, pozycja);
          BlockRead(plik, pakiet, sizeof(pakiet), odczytane);
          if odczytane > 0 then
            begin
              Wyslij(Klienci[PInt^], 'cont' + EOL);
              comm := Pobierz(Klienci[PInt^], Size);
              Paczka.toSave := odczytane;
              for i := 0 to buffer do
                begin
                  // Tutaj następuje kodowanie zo zmiennej Paczka.data
                  // Wykorzystałem tutaj naprostrze , czyli xor
                  code := ord(pakiet[i]);
                  code := code xor 1;
                  Paczka.data[i] := chr(code); 
                  //Paczka.data[i] := pakiet[i];
                end;
              send(Klienci[PInt^], Paczka, SizeOf(Paczka), 0); // wysyła 'porcje' pliku
              pozycja := pozycja + odczytane;
              comm := Pobierz(Klienci[PInt^], Size); // czeka na potwierdzenie zapisania otrzymanych danych
            end;
        until odczytane = 0;
        CloseFile(plik);
        Wyslij(Klienci[PInt^], 'end' + EOL); // zakończenie operacji
        comm := Pobierz(Klienci[PInt^], Size); // czeka na potwierdzenie
      end;

Chciałbym żeby zamiast XOR-a przesyłane dane były kodowane np. algorytmem RC5. Będę bardzo wdzięczny za pomoc i wszelkie podpowiedzi jak tego RC5 zaimplementować w programie żeby to działało :)

// pisz tematy, które coś mówią, i formatuj kod - Ł

0

Witam. Pojęcia nie mam jak zaimplementować RC5 w pascalu. Fakt, XORowanie jest dość trywialne. Poniżej podaję źródło mojego programiku szyfrującego stringi metodą Vigenera. Jest to prosty algorytm, na tyle trudny do złamania (zależnie od długości klucza), że jeżeli nie korzystasz z łącz Pentagonu to powinien wystarczyć.


Żeby, nie było, owy program jest napisany w zwykłym Pascalu i musisz go dopasować do potrzeb.

PROGRAM Szyfr_Vigenera;

USES Crt, Strings;

VAR
 FIn, FOut     :FILE;
 P             :PChar;
 BRead, BWrite :Word;

FUNCTION KodujZnak(C, Klucz :Char) :Char;
VAR I, J :Word;
BEGIN
 J := Ord(C);
 I := J + Ord(Klucz);
 IF (J + Ord(Klucz) > 255) THEN Dec(I, 255);
 KodujZnak := Chr(i);
END;

FUNCTION DekodujZnak(C, Klucz :Char) :Char;
VAR I, J :Word;
BEGIN
 J := Ord(C);
 I := J - Ord(Klucz);
 IF (J - Ord(Klucz) < 0) THEN Inc(I, 255);
 DekodujZnak := Chr(i);
END;

PROCEDURE Szyfruj(PC :PChar; Klucz :STRING);
VAR
 i :LongInt;
 B :Byte;
BEGIN
 B := 1;
 FOR i := 0 TO StrLen(PC) - 1 DO
  BEGIN
   PC[i] := KodujZnak(PC[i], Klucz[B]);
   Inc(B);
   IF B > Length(Klucz) THEN B := 1;
  END;
END;

PROCEDURE Deszyfruj(PC :PChar; Klucz :STRING);
VAR
 i :LongInt;
 B :Byte;
BEGIN
 B := 1;
 FOR i := 0 TO StrLen(PC) - 1 DO
  BEGIN
   PC[i] := DekodujZnak(PC[i], Klucz[B]);
   Inc(B);
   IF B > Length(Klucz) THEN B := 1;
  END;
END;

BEGIN
 ClrScr;
 Assign(FIn, ParamStr(1));
 Reset(FIn, 1);
 Assign(FOut, ParamStr(2));
 Rewrite(FOut, 1);
 GetMem(P, 4096);
 REPEAT
  BlockRead(FIn, P^, 4096, BRead);
  Szyfruj(P, ParamStr(3));{}
{  Deszyfruj(P, ParamStr(3));{}
  BlockWrite(FOut, P^, BRead, BWrite);
 UNTIL (BRead = 0) OR (BRead <> BWrite);
 IF Assigned(P) THEN FreeMem(P, 4096);
 Close(FIn);
 Close(FOut);
END.

1 użytkowników online, w tym zalogowanych: 0, gości: 1