Mam napisany program, ktory szyfruje plik metoda XOR (tzn. konwertuje kazdy znak na ASCII, XORuje kluczem), i gdy probuje otworzyc rozszyfrowany plik (np. bitmape) program pokazuje "Podgląd niedostępny". Co mam robic?
0
0
pewnie masz błąd w funkcji szyfrującej :P
0
Oto funkcja szyfrująca:
var
znakow,i,ascii,ascii2,j: integer;
znak: char;
haslo: string;
begin
progressbar1.Position:=0;
znakow:=length(memo1.Text);
progressbar1.Max:=length(memo1.Text);
for i:=1 to znakow do begin
znak:=memo1.text[i];
ascii:=ord(znak);
ascii2:=ord(haslo[i]);
ascii:=ascii xor form2.i;
znak:=chr(ascii);
memo2.Text:=memo2.Text+znak;
progressbar1.Position:=progressbar1.Position+1;
sleep(1);
end;
memo2.Lines.SaveToFile(edit1.Text+'.rsa');
end;
0
nie wiem, nie znam, sie, ale jak na moje oko to nie powinienes uzywac memo.
nie jestem pewien ale memo chyba nie zapisze Ci niektorych znakow...
uzyj file of.
0
Nie można zapisywac tego jako tekst bo tekst gubi znaki nieliterowe tzn np nie zapisze bajtów 1,3,4 idd poczekaj napisze ci na memory stream
0
Jednak mi sie nie chce rozgryzać co porobiłeś masz inny przykład tu zrozzumesz o co mi chodzi
procedure Kodowanie(PlikPrzed,PlikPo:String ;KodowanyZnakiem:Shortint);
var
Buffer:Byte;
PlikOryginalny,PlikZaszyfrowany:TMemoryStream;
begin
PlikOryginalny:=TmemoryStream.Create; //tworze sobie zmienną memorystream
PlikOryginalny.LoadFromFile(PlikPrzed); // Wczytuje plik do niej
PlikOryginalny.Position:=0; // ustawiam wskaźnik na początek pliku
PlikZaszyFrowany:=TMemoryStream.Create; // tworze drugą zmienną
PlikZaszyfrowany.Size :=PlikOryginalny.Size; // Daje jej taki sam rozmiar jaki ma plik oryginalny
PlikZaszyfrowany.Position:=0; // Ustawiam na początek
Repeat // powtarzam dopóki nie osiągne końca pliku
PlikOryginalny.ReadBuffer(Buffer,1); // czytam sobie bajt pliku
Buffer:=Buffer+KodowanyZnakiem; // dodaje do niego jakąś wartość
PlikZaszyfrowany.Write(Buffer,1) ;// Zapisuje ten bajt W zmiennej reprezentującej zaszyfrowany plik
until PlikOryginalny.Position =PlikOryginalny.Size ;
PlikZaszyfrowany.SaveToFile(PlikPo) ; // Zapisuje zakodowany plik
PlikZaszyfrowany.Free; // zwalniam obie zmienne
PlikOryginalny.Free;
end;
procedure TForm1.KodujClick(Sender: TObject);
begin
if Open.Execute then Kodowanie(Open.FileName ,Open.FileName+'.cod' ,3); // przy kodowaniu dodaje 3 do każdego bajtu
end;
procedure TForm1.DekodujClick(Sender: TObject);
begin
Kodowanie(Open.FileName ,Saved.FileName ,-3);// przy dekodowaniu odejuje 3 od każdego bajtu
end;
end.
program trywialnie koduje ale chodziło mi o pokazanie w jaki sposób możesz zakodować każdy plik
0
procedure Szyfruj(FileIn, FileOut:TFileName; Key:Byte);
var Stream:TMemoryStream;
i:Int64;
begin
Stream:=TMemoryStream.Create;
try
Stream.LoadFromFile(FileIn);
i:=0;
while (i<Stream.Size) do
begin
PByte(Integer(Stream.Memory)+i)^:=PByte(Integer(Stream.Memory)+i)^ xor Key;
inc(i);
end;
Stream.SaveToFile(FileOut);
finally
Stream.Free;
end;
end;