Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Resim şifreleme
#1
Merhaba arkadaşlar;

Delphi üzerinde resmi şifreleyerek yani resmin pixellerini karıştırarak SQL veritabanına kayıt edip sonra çağırıp düzgün şekilde ekranda göstermek istiyorum. Bunun için en uygun yöntem hangisidir. Bunu nasıl yapabilirim?
Cevapla
#2
(26-12-2016, Saat: 13:49)bozli54 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba arkadaşlar;

Delphi üzerinde resmi şifreleyerek yani resmin pixellerini karıştırarak SQL veritabanına kayıt edip sonra çağırıp düzgün şekilde ekranda göstermek istiyorum. Bunun için en uygun yöntem hangisidir. Bunu nasıl yapabilirim?

Bence Base64'e çevir elinde string veri oluşsun sonra istediğin gibi şifrele.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#3
Ücretsiz Turbo LockBox componentleri ile bu işi kolayca yapabilirsiniz. Ben bu yöntemi kullanıyorum. Ancak 'resmin pixellerini karıştırarak' değil, doğrudan resim dosyasını blobfield'e şifreleyerek kaydediyorum.
Forma 1er adet CryptographicLibrary ve Codec koyalım. Codec i CryptographicLibrary 'ye bağlayıp formun create olayına aşağıdaki ayarlamaları yapalım. [codec 'in cipher özelliğinde 8 adet şifreleme algoritması mevcuttur. (BlowFish, TwoFish, DES, RSA ..) AES-256'yı öneririm.]
interface bölümüne stream değişkenlerimizi deklare ediyoruz:
KaynakStream, HedefStream: TMemoryStream;

Codec1.StreamCipherId := 'native.StreamToBlock';
Codec1.BlockCipherId  := 'native.AES-256';
Codec1.ChainModeId    := 'native.CBC';

Bir opendialog ile resmimizi seçip şifreleyip veritabanına kaydediyoruz:

if OpenDialog1.Execute then
begin
Codec1.Reset;
Codec1.Password:= '123456789';
KaynakStream:= TMemoryStream.Create;
HedefStream:= TMemoryStream.Create;
KaynakStream.LoadFromFile(OpenDialog1.FileName);
KaynakStream.Seek(0, soFromBeginning);
Codec1.EncryptStream(KaynakStream, HedefStream);
HedefStream.Seek(0, soFromBeginning);
FDQuery1.SQL.Text:= 'Insert into IMAGES (DATA) Values(: DAT)';
FDQuery1.ParamByName('DAT').LoadFromStream(HedefStream, ftBlob);
FDQuery1.ExecSQL;
FreeAndNil(KaynakStream);
FreeAndNil(HedefStream);
end;

BlobField deki şifreli veriyi çözüp  Image nesnesinde gösteriyoruz...

var RsStream: TStream; Jpg: TJpegImage;

Codec1.Reset;
Codec1.Password := Inputbox(
'Resim Şifrele', 'Şifreyi Girin', '1 den 9 a şifeyi girin');

HedefStream:= TMemoryStream.Create;
jpg:=TJpegimage.Create;
FDQuery1.Open;
RsStream:= FDQuery1.CreateBlobStream(
TBlobField(FDQuery1.FieldByName('DATA')), bmRead);
RsStream.Seek(0, soFromBeginning);
Codec1.DecryptStream(HedefStream, RsStream);
HedefStream.Seek(0, soFromBeginning);
Jpg.LoadFromStream(HedefStream);
Image1.Picture.Assign(Jpg);
FreeAndNil(HedefStream);
FreeAndNil(jpg);
Cevapla
#4
Merhaba ;   öncelikle cevabınız için çok teşekkür ederim,  vermiş olduğunuz kodları ve   Turbo LockBox   bileşeni  kullanarak deneme amaçlı yapmış olduğum sql server tablomda   RESIM  adında    türü nvarbinary(max)   olan   bir alanım var.

kayıt işlemini   başarılı biçimde  yaptım. lakin   resmi  okuma yaptığımda   aldığım  mesaj   "JPEG error #53"   oluyor konu ile ilgili  sorun ne olabilir?  yardımlarınız için şimdiden teşekkürler.

unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uTPLb_CryptographicLibrary,
uTPLb_BaseNonVisualComponent, uTPLb_Codec, Vcl.StdCtrls, Vcl.ExtCtrls,
Data.DB, Data.Win.ADODB,JPEG;

type
TForm1 = class(TForm)
  Codec1: TCodec;
  CryptographicLibrary1: TCryptographicLibrary;
  ADOConnection1: TADOConnection;
  ADOQuery1: TADOQuery;
  ADOQuery1ID: TAutoIncField;
  ADOQuery1RESIM: TBlobField;
  OpenDialog1: TOpenDialog;
  Image1: TImage;
  Button1: TButton;
  Button2: TButton;
  procedure FormCreate(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
private
  { Private declarations }
public
  { Public declarations }
end;

var
Form1: TForm1;
KaynakStream, HedefStream: TMemoryStream;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
  Codec1.Reset;
  Codec1.Password:= '123456789';
  KaynakStream:= TMemoryStream.Create;
  HedefStream:= TMemoryStream.Create;
  KaynakStream.LoadFromFile(OpenDialog1.FileName);
  KaynakStream.Seek(0, soFromBeginning);
  Codec1.EncryptStream(KaynakStream, HedefStream);
  HedefStream.Seek(0, soFromBeginning);
  ADOQuery1.SQL.Text:= 'Insert into DENEME (RESIM) Values(: DAT)';
  ADOQuery1.Parameters.ParamByName('DAT').LoadFromStream(HedefStream, ftBlob);
  ADOQuery1.ExecSQL;
  FreeAndNil(KaynakStream);
  FreeAndNil(HedefStream);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
RsStream: TStream;
Jpg: TJpegImage;
begin
Codec1.Reset;
Codec1.Password := Inputbox('Resim Şifrele', 'Şifreyi Girin', '1 den 9 a şifeyi girin');

HedefStream:= TMemoryStream.Create;
jpg:=TJpegimage.Create;
ADOQuery1.Open;
RsStream:= ADOQuery1.CreateBlobStream(
TBlobField(ADOQuery1RESIM), bmRead);
RsStream.Seek(0, soFromBeginning);
Codec1.DecryptStream(HedefStream, RsStream);
HedefStream.Seek(0, soFromBeginning);
Jpg.LoadFromStream(HedefStream);
Image1.Picture.Assign(Jpg);
FreeAndNil(HedefStream);
FreeAndNil(jpg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Codec1.StreamCipherId := 'native.StreamToBlock';
Codec1.BlockCipherId  := 'native.AES-256';
Codec1.ChainModeId    := 'native.CBC';
end;

end.
Cevapla
#5
SQL Server 2008 ile yaptığım denemede sorunsuz çalıştı.. bende varbinary(MAX) tipi vardı onu seçtim. nvarbinary(MAX) göremedim.
'JPEG error #53' hatası verinin bozuk olduğuna işaret eder. Muhtemelen veriyi ya hiç kaydetmiyor ya da bozuk kaydediyor. Bu da veritipinin yanlış olarak tanımlanmış olmasından ötürü olabilir.
Cevapla
#6
Veritabanından okuduğun veriyi diske kaydedip hex editör yada en azından not defteri ile açıp içeriğine bakıp basitçe verinin düzgün gelip gelmediğini kontrol edebilirsin.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#7
Ben olsam basitçe, resim 32 bit Alpha kanallı olacak ise; resmin R/G/B pixellerini A(Alpha) kanalı ile XOR işlemine tabi tutardım şifrelemek için. Tekrar açmak için aynı işlemi yapar orjinal resmi elde ederdim. Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
Delphi-x çalıştırdım. Çalıştıramamın sebebi benim seçmiş olduğum resimlerin png formatında olmasıydı. jpg formatında resmi saklayarak tekrar geri çağırabiliyorum. Yalnız şöyle bir sıkıntı var siz farkettiniz mi bilmiyorum veritabanından resmi çağırdığım da kalite düşüyor bunun için ne yapabilirim yada yanlış yaptığım bir şey mi var?

Herkese verdiği bilgiler için teşekkür ederim.
Cevapla
#9
Merhaba,

Projedeki kodları tam bilmiyoruz, ama delphi-x'in kodları ile kalite kaybı olmaz. Kalite kaybının olması için resmin JPEG formatında tekrar kaydedilmesi gerekir. Çok kabaca yazarsak:

Kod:
var
 Jpeg: TJpegImage;
 Stream: TMemoryStream;
begin
 Jpeg := TJpegImage.Create;
 Stream := TMemoryStream.Create;
 try  
   Jpeg.Assign(Image.Picture);
   Jpeg.SaveToStr(Stream);
   Stream.Position := 0;
   SaveStreamToDataBase(Stream);
  finally
    Jpeg.Free;
  end;
end;

Bu şekilde resim her seferinde tekrar JPEG olarak kaydediliyor. JPEG formatı da her seferinde resmi sıkıştırıyor ve kalite kaybı oluyor.

Alıntı:Tuğrul HELVACI
Ben olsam basitçe, resim 32 bit Alpha kanallı olacak ise; resmin R/G/B pixellerini A(Alpha) kanalı ile XOR işlemine tabi tutardım şifrelemek için. Tekrar açmak için aynı işlemi yapar orjinal resmi elde ederdim. Wink

Eğer resim 32 bit Bitmap (bmp veya PNG) olsaydı dediğiniz olabilirdi, ama JPEG resimlerde olmaz. JPEG resimlerde, BMP resimlerinde olduğu gibi Scanline ile işlem yapamazsınız. Canvas.Pixels ile de bu iş çok daha uzun sürer. Bu yüzden resmi önce BMP'ye çevirmek ve XOR işlemi uygulamak gerekiyor. Tekrar JPEG yapmak için de tam ters işlem uygulanacak. Dikkat ederseniz hem işlem olarak uzun sürüyor, hem de JPEG tekrar oluşturulacağı için kalite kaybı var. Bence bu tavsiye pratik sonuçlarından ziyade, farklı/yaratıcı düşünmeye örnek olmuş Smile

İyi çalışmalar
Cevapla
#10
Herkese teşekkürler. Herhangi bir kayıp yokmuş sadece Image nesnesinin stretch özelliğinden öyle gözüküyor.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Cxgrid Resim esrehmaan 4 265 28-10-2017, Saat: 22:57
Son Yorum: esrehmaan
  Varbinary(MAX) Tipindeki Resim Dosyalarını Timage Kolay Gösterim pro_imaj 4 290 19-10-2017, Saat: 15:02
Son Yorum: pro_imaj
  Resim ekleme hattası(Çözüldü Çözümü Paylaşıldı) admin02 15 513 22-09-2017, Saat: 17:55
Son Yorum: admin02
  Acess Veribanına resim ekleme(Çözüldü ve çözüm kodları paylaşıldı) admin02 11 422 19-09-2017, Saat: 17:32
Son Yorum: admin02
  Resim listeleme Dostk 9 391 31-07-2017, Saat: 10:16
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi