Arsip: Menyembunyikan File dengan Gambar Abstrak


by kifmesoft in Articles more 14 years ago 4032
Ada banyak teknik Enkripsi / Penyandian yang bisa kita gunakan untuk menyembunyikan data / file.
Ubahlah menjadi gambar abstrak supaya menjadi terlihat lebih indah... ;)
Bagaimana dengan gambar abstrak yang terlihat berikut ini, dan apa kira-kira yang ada dalam pikiran orang yang melihatnya ? HelloWorld Bagi kita... Gambarnya nggak penting, yang penting isinya.. :D sebab kita menyembunyikan sesuatu disitu.. (misalnya saja file hasil kompresi dengan WinZIP atau WinRAR) Prosesnya sederhana.. kita hanya menggambar pada Canvas dengan format pixel 24 bit warna, dan setiap nilai Red, Green, dan Blue dari masing-masing pixel kita isi dengan byte data dari file yang ingin kita sembunyikan dan terlebih dulu kita sandikan menggunakan operator XOR dengan byte yang diambil dari generator Random, tentu.. dengan memberikan nilai awal untuk variabel RandSeed Berikut ini adalah fungsi Encryption dan Decryption yang digunakan :
Const
  randseed_init = 5;
  magic_header: String = 'kifmesoft';
Function kifEncryptFile(const FileName: String;
       Bitmap: TBitmap; Key, Width: Integer): Integer;
Var
  hdr_len, total: Integer;
  i1, i2, i3, i4, i5: Integer;
  c, i, w: Integer;
  p, pm: PByteArray;
  sf_name: String;
  m_strm: TMemoryStream;
Begin
  m_strm:= TMemoryStream.Create;
  m_strm.LoadFromFile(FileName);
  Result:= m_strm.Size;
  If (Result < 1) Or (Bitmap = Nil) Or
   (Width < 1) Then
  Begin
    m_strm.Free;
    Exit;
  End;
  sf_name:= ExtractFileName(FileName);
  i1:= 0; i2:= SizeOf(Integer);
  i3:= i2 + Length(magic_header);
  i4:= i3 + SizeOf(Integer);
  i5:= i4 + Length(sf_name);
  hdr_len:= i5 + SizeOf(Integer);
  total:= hdr_len + m_strm.Size;
  Bitmap.PixelFormat:= pf24bit;
  Bitmap.Width:= Width;
  w:= Bitmap.Width  3;
  Bitmap.Height:= total Div w;
  If (total Mod w) > 0 Then
    Bitmap.Height:= Bitmap.Height + 1;
  c:= w   Bitmap.Height;
  RandSeed:= Key;
  pm:= m_strm.Memory;
  p:= Bitmap.ScanLine[0];
  Integer(Pointer(@p[i1])^):= Length(magic_header);
  //  simpan magic_header
  For i:= 1 To Length(magic_header) Do
  p[i2 + i - 1]:= Ord(magic_header[i]) Xor
          Random(256);
  Integer(Pointer(@p[i3])^):= Length(sf_name);
  //  simpan FileName
  For i:= 1 To Length(sf_name) Do
  p[i4 + i - 1]:= Ord(sf_name[i]) Xor
          Random(256);
  Integer(Pointer(@p[i5])^):= m_strm.Size;
  //  Encrypt Data File
  For i:= hdr_len To c - 1 Do
  Begin
    p:= Bitmap.ScanLine[i Div w];
    If (i - hdr_len) < m_strm.Size Then
      p[i Mod w]:= pm[i - hdr_len] Xor
             Random(256)
    Else P[i Mod w]:= Random(256);
  End;
  m_strm.Free;
End;
Function kifDecryptFile(var FileName: String;
           Stream: TMemoryStream; Bitmap: TBitmap;
           Key: Integer): Integer;
Var
  mh_length, sf_length, hdr_len: Integer;
  i1, i2, i3, i4, i5: Integer;
  c, i, w: Integer;
  p, pm: PByteArray;
  mh: String;
Begin
  Result:= 0;
  FileName:= '';
  If Bitmap = Nil Then Exit;
  Bitmap.PixelFormat:= pf24bit;
  If Bitmap.Empty Or
   ((Bitmap.Width  3) < Length(magic_header)) Then
    Exit;
  RandSeed:= Key;
  p:= Bitmap.ScanLine[0];
  i1:= 0;
  mh_length:= Integer(Pointer(@p[i1])^);
  If mh_length <> Length(magic_header) Then
  Begin
    ShowMessage('Invalid Magic Header..!!');
    Exit;
  End;
  i2:= SizeOf(Integer);
  i3:= i2 + mh_length;
  sf_length:= Integer(Pointer(@p[i3])^);
  i4:= i3 + SizeOf(Integer);
  i5:= i4 + sf_length;
  hdr_len:= i5 + SizeOf(Integer);
  If (Bitmap.Width   3) < hdr_len Then
  Exit;
  mh:= '';
  For i:= 1 To mh_length Do
    mh:= mh + Chr(p[i2 + i - 1] Xor Random(256));
  //  cek magic_header
  If mh <> magic_header Then
  Begin
    ShowMessage('Invalid Header..!!');
    Exit;
  End;
  //  ambil FileName
  For i:= 1 To sf_length Do
    FileName:= FileName + Chr(p[i4 + i - 1] Xor
                Random(256));
  Stream.Size:= Integer(Pointer(@p[i5])^);
  pm:= Stream.Memory;
  w:= Bitmap.Width  3;
  c:= w   Bitmap.Height;
  If c < (hdr_len + Stream.Size) Then
    Exit;
  //  Decrypt Data File
  For i:= hdr_len To c - 1 Do
  Begin
    p:= Bitmap.ScanLine[i Div w];
    If (i - hdr_len) < Stream.Size Then
      pm[i - hdr_len]:= p[i Mod w] Xor Random(256)
    Else Break;
  End;
  Result:= Stream.Size;
End;
Syntax Highlighted with https://pascal-id.org/syntax
Berikut ini adalah contoh program encryption dan decryption dengan Gambar Abstrak : AbstractEncryption Ref: http://kifmesoft.info/?p=30
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com