Dosya Base64+GZip sorun

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

İyi geceler. Dosya şifreleme çalışıyorum olmuyor.

Misal bir txt dosyasını base64 çeviriyorum. Çevirdiğim dosyanı GZip yapıp test.txt kayıt yapıyorum. Buraya kadar sorun yok.
test.txt dosyansını eski haline çevirmek istediğimde data error hatası alıyorum. Sorun nedir anlamıyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen mrmarman »

Hata nedir bildirmemişsiniz. Bunu da ben anlayamadım :D
Çözüm üretmişsen de cevaplanmamış mesaj olarak görünüyor, listeden düşsün diye yazıyorum.

önce hata base64 dönüşümünde olmadığını test et. sonra da bağımsız olatak gzip hata testibyap. Her iki yakada hatasız işlem yapabildiğinde birleştirirsin.
Şöyle düşün hem nezle olabilirsin hem de migrenin vardır. Başım neden ağrıyor sorusunun cevabını ararken her iki sorunu da bağımsız irdelemelisin. Belki nezlen geçmiş sadece migren ağrısıdır ya da tersi. :wink:
Resim
Resim ....Resim
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

İyi akşamlar Muharrem abi. Base64 sorun yok enkod dekod çalışıyo. Sorun GZip fonksiyonu. Kütüphanem bu. Ben txt base64 yapıyom sorun yok. GZip sıkıştırmak istiyom işi bozuyo.

Kod: Tümünü seç

unit AppLib;

interface

uses
  System.Classes,
  ZLib,
  Soap.EncdDecd,
  System.NetEncoding;

type
  TApp = class(TObject)
  private
    function StrToGZip(const Text: string): string;
    function GZipToStr(const Text: string): string;
  public
    procedure CryptoFile(A, B: string);
    procedure DecryptoFile(A, B: string);
  end;

implementation

{ TApp }

function TApp.StrToGZip(const Text: string): string;
var
  strInput,
  strOutput: TStringStream;
  Zipper: TZCompressionStream;
begin
  Result:= '';
  strInput:= TStringStream.Create(Text);
  strOutput:= TStringStream.Create;
  try
    Zipper:= TZCompressionStream.Create(strOutput);
    try
      Zipper.CopyFrom(strInput, strInput.Size);
    finally
      Zipper.Free;
    end;
    Result:= strOutput.DataString;
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

function TApp.GZipToStr(const Text: string): string;
var
  strInput,
  strOutput: TStringStream;
  Unzipper: TZDecompressionStream;
begin
  Result:= '';
  strInput:= TStringStream.Create(Text);
  strOutput:= TStringStream.Create;
  try
    Unzipper:= TZDecompressionStream.Create(strInput);
    try
      strOutput.CopyFrom(Unzipper, Unzipper.Size);
    finally
      Unzipper.Free;
    end;
    Result:= strOutput.DataString;
  finally
    strInput.Free;
    strOutput.Free;
  end;
end;

procedure TApp.CryptoFile(A, B: string);
var
  MS: TMemoryStream;
  SL: TStringList;
  B64: WideString;
begin
  MS := TMemoryStream.Create;
  SL := TStringList.Create;
  MS.LoadFromFile(A);
  try
    B64 := EncodeBase64(MS.Memory, MS.Size);
    //SL.Text := StrToGZip(B64); // GZip
    SL.Text := B64; // Base64
    SL.SaveToFile(B);
  finally
    MS.Free;
    SL.Free;
  end;
end;

procedure TApp.DecryptoFile(A, B: string);
var
  SS: TStringStream;
  B64: WideString;
  BS: TBytesStream;
begin
  SS := TStringStream.Create;
  SS.LoadFromFile(A);
  B64 := SS.DataString;
  //BS := TBytesStream.Create(DecodeBase64(GZipToStr(B64))); // GZip
  BS := TBytesStream.Create(DecodeBase64(B64)); // Base64
  try
    BS.SaveToFile(B);
  finally
    SS.Free;
    BS.Free;
  end;
end;

end.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen mrmarman »

Bunu telefondan deneme fırsatım yok, her bir fonksiyon ikilisi doğru çalışıyor mu? test ettin mi?

Crypt / Decrypt
Zip / UnZip

eğer sağlamlarsa sıralama hatası yapıyorsundur derim.

Paketlerken: Zip - Crypt
Açarken : DeCrypt - Unzip

sıralamasını kontrol etmelisin, tabi dediğim gibi fonksiyonların sağlıklıysa.
Resim
Resim ....Resim
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

İyi geceler. Evet ayrılıkta sorun yok bir arada sorun var.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen mrmarman »

Kodlarını inceledim.

Kod: Tümünü seç

procedure TApp.DecryptoFile(A, B: string);
var
  SS : TStringStream;
  B64: WideString;
  BS : TBytesStream;
begin
  SS  := TStringStream.Create;
  SS.LoadFromFile(A);
  B64 := GZipToStr( SS.DataString );
  BS  := TBytesStream.Create(DecodeBase64(B64));
  try
    BS.SaveToFile(B);
  finally
    SS.Free;
    BS.Free;
  end;
end;
şeklinde kurarsan çalışıyor ancak senin GZIP olayında sorun var.

Kod: Tümünü seç

Muharrem ARMAN
içeren bir a.txt dosyasını Encrypt / Decrypt ettiğine sonuç

Kod: Tümünü seç

MuharrEm ARMAN
oluyor. İçinde unicode harf bile yok.. Çok güvenilir değil bilgine...

NOT: Base64 kısmı doğru çalışıyor.

Kod: Tümünü seç

Muharrem ARMAN için ürettiği kod TXVoYXJyZW0gQVJNQU4=
Resim
Resim ....Resim
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

Merhaba. GZip sıkıştıra için istiyordum. Amma nedense sorun çıkarıyo. Ben aslında Muharrem abi bu bileşenim için istiyorum. Güvenliğe kafam takıldı. Dedim biraz sıkıştırma yaparsam post yakalasa bile uğraşır çözmeye. SSL baktım her kullanıcı kendi serverinde para ile alıp kurlamlı. SSH ise oda 2 taraflı kurulmalı. Bu indy destek vermediğinden işimi zorlaştırdı. Bende bi yol arıyom acaba nasıl bi istem olsa güvenlik için.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen mrmarman »

Sana istediğin Class'ı çalışır şekilde iki opsiyonlu olarak yazdım.

Veriyi diske fiziksel olarak yazmak istemezsen, bunu MemoryStream üzerinden yürüteceğin EncryptStream/DecryptStream ikilisi ile herhangi bir fiziksel dosya üzerinden yürütebileceğin EncryptFile/ DecryptFile ikilisini hazırladım.

Fiziksel bir dosyadan Kullanımı :

Kod: Tümünü seç

procedure TForm1.BitBtn3Click(Sender: TObject);
Var
  a : TApp;
  strKaynak, strHedef : TFileName;
begin
  strKaynak := ExtractFilePath(Application.Exename) + 'a.txt';
  strHedef  := ExtractFilePath(Application.Exename) + 'a.enc';
  a := TApp.Create;
  Try
    a.EncryptFile( strKaynak, strHedef );
  Finally
    a.Free;
  End;
end;

procedure TForm1.BitBtn4Click(Sender: TObject);
Var
  a : TApp;
  strKaynak, strHedef : TFileName;
begin
  strKaynak := ExtractFilePath(Application.Exename) + 'a.enc';
  strHedef  := ExtractFilePath(Application.Exename) + 'b.txt';
  a := TApp.Create;
  Try
    a.DecryptFile( strKaynak, strHedef );
  Finally
    a.Free;
  End;
end;
MemoryStream üzerinden kullanımı zaten Class içinde de yer alıyor.

Kod: Tümünü seç

Var
  MSKaynak,  MSHedef   : TMemoryStream;
begin
  MSKaynak := TMemoryStream.Create;
  MSHedef  := TMemoryStream.Create;
  MSKaynak.LoadFromFile( strKaynak );
    EncryptStream( MSKaynak, MSHedef );
  MSHedef.SaveToFile( strHedef );

Kod: Tümünü seç

unit AppLib;

interface

uses
  Classes,
  SysUtils,
  ZLib,
  EncdDecd;

type
  TApp = class(TObject)
  private
  public
    procedure EncryptStream(MSKaynak, MSHedef: TMemoryStream);
    procedure DecryptStream(MSKaynak, MSHedef: TMemoryStream);
    procedure EncryptFile(strKaynak, strHedef: TFileName);
    procedure DecryptFile(strKaynak, strHedef: TFileName);
  end;

implementation

{ TApp }

procedure TApp.EncryptStream( MSKaynak, MSHedef : TMemoryStream );
Var
  SS     : TStringStream;
  MS     : TMemoryStream;
  CS     : TCompressionStream;
begin
  SS := TStringStream.Create('');
  try
    EncdDecd.EncodeStream(MSKaynak, SS);   // Uses EncdDecd eklenecek...
    MS := TMemoryStream.Create;
    try
      MS.Position := 0;
      MS.LoadFromStream( SS );
      CS := TCompressionStream.Create( clDefault, MSHedef );
      try
        CS.CopyFrom( MS, 0 );
      finally
        CS.Free;
      end;
    finally
      MS.Free;
    end;
  finally
    SS.Free;
  end;
end;

procedure TApp.DecryptStream( MSKaynak, MSHedef : TMemoryStream );
Var
  SS     : TStringStream;
  MS     : TMemoryStream;
  DS     : TDecompressionStream;
  Buffer : Array[0..4095] of Char;
  BufLen : Integer;
begin
  DS     := TDecompressionStream.Create( MSKaynak );
  Try
    MS   := TMemoryStream.Create;
    MS.Position := 0;
    BufLen := DS.Read(Buffer,SizeOf(Buffer));
    while BufLen > 0 do
    begin
      MS.Write(Buffer, BufLen);
      BufLen := DS.Read(Buffer,SizeOf(Buffer));
    end;
  Finally
    DS.Free;
  End;

  SS := TStringStream.Create('');
  try
    MS.Position := 0;
    EncdDecd.DecodeStream(MS, SS);   // Uses EncdDecd eklenecek...
    MSHedef.LoadFromStream( SS );
  finally
    SS.Free;
  end;
end;

procedure TApp.EncryptFile(strKaynak, strHedef: TFileName);
Var
  MSKaynak,  MSHedef   : TMemoryStream;
begin
  MSKaynak := TMemoryStream.Create;
  MSHedef  := TMemoryStream.Create;
  MSKaynak.LoadFromFile( strKaynak );
    EncryptStream( MSKaynak, MSHedef );
  MSHedef.SaveToFile( strHedef );
end;

procedure TApp.DecryptFile(strKaynak, strHedef: TFileName);
Var
  MSKaynak,  MSHedef   : TMemoryStream;
begin
  MSKaynak := TMemoryStream.Create;
  MSHedef  := TMemoryStream.Create;
  MSKaynak.LoadFromFile( strKaynak );
    DecryptStream( MSKaynak, MSHedef );
  MSHedef.SaveToFile( strHedef );
end;


end.
Resim
Resim ....Resim
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

Merhaba Muharrem abi. Peki bu php tarafı nasıl enkod dekod edecek? Asıl amacım güvenlik ve bilgi sıkıştırlıması ki çok az traffik yesin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen mrmarman »

Hocam PHP yakasını biliyor olman lazım. Bunu bize sormasan... Delphi forumu ya o bakımdan...
Ben biliyorum da buradan yazmak foruma uygun olur mu ? Bu linkten incele sorunu cevabı var...
Resim
Resim ....Resim
Kullanıcı avatarı
AliZairov
Üye
Mesajlar: 341
Kayıt: 06 Nis 2012 03:09
Konum: Azerbaycan, Bakü
İletişim:

Re: Dosya Base64+GZip sorun

Mesaj gönderen AliZairov »

Anladım. Teşekkürler abi. Bir inceleyim onu.
Cevapla