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 ?
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;
|
|
Berikut ini adalah contoh program encryption dan decryption dengan Gambar Abstrak :
Ref:
http://kifmesoft.info/?p=30