[Delphi] dziwny błąd z brakiem pamięci

0

Cześć.
Kawałek kodu, który prezentuje ma za zadanie odszyfrować stringa za pomocą bibliotek DCrypt:

var
 actualPass: string;
begin
keyStr:='inny_klucz'; //max długość klucza dla 3DES - 24 znaki
      try
       Cipher:= TDCP_3DES.Create(nil);
       Cipher.InitStr(KeyStr,TDCP_sha1);
       actualPass:=Cipher.DecryptString(actualPass);
       Cipher.Burn;
       Cipher.Free;
      except
       on EOutOfMemory do
         begin
          application.MessageBox('Zbyt mało dostępnej pamięci, aby odszyfrować hasło', PChar(tyt), mb_OK+mb_IconExclamation);
          if cipher<>nil then cipher.Free;
          result:=false;
          exit;
         end;
      end;
end;

Gdy uruchamiam to z execa, generuje się wyjątek: Out of memory(pomimo, że dostępnej pamięci przed wykonaniem operacji mam ponad 40 MB).
O dziwo, gdy uruchamiam to poprzez run(krok po kroku) to wszystko jest ok.

O co chodzi? Jak tego uniknąć?

Wcześniej tworzę jeszcze TFileStream, ale zwalnianie go przed tym kodem też nic nie daje.

W innych miejscach kod działa.

0

Używam tych samych komponentów i niegdy nie miałem takich problemów :) Wydaję mi się, że błąd jest w linijce

actualPass:=Cipher.DecryptString(actualPass);

. Zapytasz pewnie dlaczego - no więc jak możesz zaszyfrować pusty String ?? Wcześniej w Twoim kodzie nie przypisujesz żadnej wartości dla actualPass więc możę dlatego jest błąd.

A tak na marginesie w linijce:

Cipher:= TDCP_3DES.Create(nil);

powinno być Self zamiast nil ;)

// dopisane
Sprawdziłem ten kod u siebie - u mie działa on całkowicie poprawnie.
Aha jak masz używać jakiegoś hash'a to nie SHA-1, bo wczoraj został złamany (MD5 też się nie nadaje - też złamany ;)

0

OK, już se poradziłem po dwóch dniach zmagań.

Ogólnie chodzi o to, że nie jest za dobrze zapisywać poprzez TFileStream stringów, czy też tablicy znaków. Lepiej jest pozamieniać każdy znak na bajty i zapisać strumień bajtowy :)
No i odczyt to samo ;)

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