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
Ü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
#3
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
#4
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
#5
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.
Cevapla
#6
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
#7
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
#8
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:

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
#9
Herkese teşekkürler. Herhangi bir kayıp yokmuş sadece Image nesnesinin stretch özelliğinden öyle gözüküyor.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  AES Şifreleme Hakkında tmrksmt 18 1.528 14-02-2024, Saat: 10:42
Son Yorum: tmrksmt
  dxRichEditControl Resim Kaydı m_ekici 0 225 31-10-2023, Saat: 01:42
Son Yorum: m_ekici
  Formda acmadan resim dosyasi renk pixelleri almak sadikacar60 1 396 27-06-2023, Saat: 08:01
Son Yorum: delphiman
  Toplu Resim Kaydetme gonulali 2 684 26-09-2022, Saat: 22:51
Son Yorum: mustafaozpinar
  HMAC-SHA256 Şifreleme Hakkında Yardım glagher 8 2.859 23-08-2022, Saat: 14:13
Son Yorum: delphi.developer



Konuyu Okuyanlar: 1 Ziyaretçi