Bab 5 Kesimpulan dan Saran
5.2 Saran
Untuk pengembangan lebih lanjut dari perangkat lunak ini maka penulis memberikan saran-saran sebagai berikut :
1. Proses penyisipan pesan pada aplikasi ini membutuhkan waktu yang cukup lama. Penulis menyarankan untuk mengembangkan algoritma yang lebih efisien dalam proses penyisipan pesan, karena algoritma yang digunakan pada aplikasi ini masih sederhana.
2. Untuk kedepannya diharapkan agar pesan yang disisipkan dapat dalam bentuk media digital lainnya, tidak hanya pada teks saja.
3. Perlu adanya perbaikan pada antarmuka aplikasi agar lebih bersahabat dengan pengguna. Khususnya perlu ditambahkan progress bar untuk memberitahukan waktu respon yang dibutuhkan pengguna.
DAFTAR PUSTAKA
Ariyus, Dony. 2007. Keamanan Multimedia. Yogyakarta : Penerbit Andi.
Ariyus, Dony. 2008. Pengantar Ilmu Kriptografi, Teori, Analisis dan Implementasi. Yogyakarta : Penerbit Andi.
Bender, W., Gruhl, D., Morimoto, N. et al. 1996. Techniques For Data Hiding, IBM
Systems Journal, Vol. 35, Nos 3&4, 1996. http://www.almaden.ibm.com
/cs/people/dgruhl/313.pdf. Diakses tanggal 16 Mei 2009.
Cvejic, Nedeljko. 2004. Algorithms for Audio Watermarking and Steganography. Oulu : Oulu University Press.
Daemen, J. dan Rijmen, V. 1999. AES Proposal: Rijndael. http://csrc.nist.gov/ archive/aes/ rijndael/Rijndael-ammended.pdf. Diakses tanggal 15 Mei 2009
Forouzan, Behrouz A. 2008. Cryptography and Network Security. Singapura : Mc Graw Hill.
Hartono, Jogiyanto. 2005. Analisis dan Desain Sistem Informasi : Pendekatan
Terstruktur Teori dan Praktik Aplikasi Bisnis. Yogyakarta : Penerbit Andi
Kurniawan, Yusuf. 2004. Kriptografi, Keamanan Internet dan Jaringan Komunikasi. Bandung : Informatika.
Krenn, J.R. 2004. Steganography and Steganalysis. http://www.krenn.nl/univ/ cry/steg/ article.pdf. Diakses tanggal 16 Mei 2009.
Madcoms. 2002. Pemrograman Borland Delphi 7. Madiun : Penerbit Andi.
Rassol, Raissi. 2002. The Theory Behind MP3. http://www.mp3-tech.org/ programmer/docs/ mp3_theory.pdf. Diakses tanggal 16 Mei 2009.
Vembrina, Yus Gias. Spread Spectrum Steganography. http://www.informatika.org/ ~rinaldi/Kriptografi/2006-2007/Makalah2/Makalah-007.pdf. Diakses tanggal
Wahana Komputer. 2003. Pemrograman Borland Delphi 7.0. Yogyakarta : Penerbit Andi.
http://achmadz.blogspot.com Diakses tanggal 17 Oktober 2009 http://id.wikipedia.org/wiki/CRC Diakses tanggal 30 Desember 2009
LAMPIRAN A: LISTING PROGRAM
unit uMP3; interface uses
SysUtils, Windows, Messages, Classes; //mp3 header frame type TRawMP3Header = record AudioVersion, LayerIdx, Protection, BitrateIdx, SamplingRateIdx, Padding, PrivateBit, ChannelMode, ModeExt, Copyright, Original, Emphasis: Integer; end;
//array untuk frame header MP3 type
TMP3HeaderArray = array[0..3] of byte; //Tabel bitrate (bps)
const
bmpeg1: array[1..14, 1..3] of Word = ( (32, 32, 32), (40, 48, 64), (48, 56, 96), (56, 64, 128), (64, 80, 160), (80, 96, 192), (96, 112, 224), (112, 128, 256), (128, 160, 288), (160, 192, 320), (192, 224, 352), (224, 256, 384), (256, 320, 416), (320, 384, 448));
//Tabel Sampling Rate (Hz) const
samplingRate: array[0..3] of integer = ( 44100, 48000, 32000, 0);
//Tabel sampling per frame const
samplingPerFrame: array[1..3] of Integer = ( 1152, 1152, 384);
function FindFirstHeader(filename: string): Integer;
function FindNextFrame(filename: string; prevHeaderPos: Integer; prevHeader: TMP3HeaderArray): Integer;
function getMP3Header(filename: string; pos: Integer): TMP3HeaderArray;
function frameSize(headerArray: TMP3HeaderArray): Integer; function isAvailableToSteg(filename: string; framePos: Integer; length: Integer): Boolean;
function isStegged(filename: string; framePos: Integer): Boolean; function FrameCount(filename: string): Integer;
function MaxStegSize(filename: string; length: Integer): Integer; function FileSize(FileName : String) : Int64;
function HideFile(mp3File:string; hiddenFile: string; resultFile: string; length: Integer): Integer;
function RevealFile(mp3File:string): string;
procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);
function LeftPad(S: string; Ch: Char; Len: Integer): string; implementation
//function untuk mendapatkan lokasi frame pertama function FindFirstHeader(filename: string): Integer; var
filemp3: File;
headerArray: array[0..3] of byte; count, pos: Integer;
begin Result:=-1; if FileExists(filename) then begin AssignFile(filemp3, filename); FileMode:=fmOpenRead; Reset(filemp3,1);
//looping sampai dapat header file pos:=0;
while not eof(filemp3) do begin
seek(filemp3, pos);
BlockRead(filemp3, headerArray, 4, count);
if ((headerArray[0]=$FF) and ((headerArray[1]=$FB) or (headerArray[1]=$FA))) then begin Result:=pos; break; end else begin pos:=pos+1; end; end; CloseFile(filemp3); end else begin exit; end; end;
//function untuk mendapatkan frame selanjutnya
function FindNextFrame(filename: string; prevHeaderPos: Integer; prevHeader: TMP3HeaderArray): Integer; var filemp3: File; count: Integer; posNow: Integer; headArray: TMP3HeaderArray; begin if FileExists(filename) then begin AssignFile(filemp3, filename);
FileMode:=fmOpenRead; Reset(filemp3, 1);
posNow:=prevHeaderPos+FrameSize(prevHeader); while not eof(filemp3) do
begin
seek(filemp3, posNow);
BlockRead(filemp3, headArray, 4, count);
if ((headArray[0]=$FF) and ((headArray[1] and $E0)=$E0) and ((headArray[2] and $F0)<>$F0)) then
begin Result:=posNow; break; end else begin posNow:=posNow+1; end; end; CloseFile(filemp3); end else begin exit; end; end;
//function untuk parsing mp3 header
procedure ParseHeaderArray(headerArray: TMP3HeaderArray; var RawHeader: TRawMP3Header); begin RawHeader.AudioVersion:=(headerArray[1] shr 3) and $3; RawHeader.LayerIdx:=(headerArray[1] shr 1) and $3; RawHeader.Protection:=(headerArray[1] and $1); RawHeader.BitrateIdx:=(headerArray[2] shr 4) and $F; RawHeader.SamplingRateIdx:=(headerArray[2] shr 2) and $3; RawHeader.Padding:=(headerArray[2] shr 1) and $1; RawHeader.PrivateBit:=(headerArray[2] and 1); RawHeader.ChannelMode:=(headerArray[3] shr 6) and $3; RawHeader.ModeExt:=(headerArray[2] shr 4) and $3; RawHeader.Copyright:=(headerArray[2] shr 3) and $1; RawHeader.Original:=(headerArray[2] shr 2) and $1; RawHeader.Emphasis:=(headerArray[2] and 1); end;
//function untuk mendapatkan mp3 header dari current pos function getMP3Header(filename: string; pos: Integer): TMP3HeaderArray; var filemp3: File; headerArray: TMP3HeaderArray; count: integer; begin if FileExists(filename) then begin AssignFile(filemp3, filename); FileMode:=fmOpenRead; Reset(filemp3,1); seek(filemp3, pos);
end else begin exit; end; end;
//function untuk mengetahui ukuran frame
function frameSize(headerArray: TMP3HeaderArray): Integer; var myRawMP3Header: TRawMP3Header; begin ParseHeaderArray(headerArray, myRawMP3Header); Result:=trunc(samplingPerFrame[myRawMP3Header.LayerIdx]/ 8 * bmpeg1[myRawMP3Header.BitrateIdx][myRawMP3Header.LayerIdx] * 1000 / samplingRate[myRawMP3Header.SamplingRateIdx] + myRawMP3Header.Padding); end;
//function untuk mengecek apakah sebuah frame mengandung pesan rahsia function isStegged(filename: string; framePos: Integer): Boolean; var
filemp3: File;
pos, n, count: Integer; buf: array[0..254] of Char; begin Result:=False; if FileExists(filename) then begin AssignFile(filemp3, filename); FileMode:=fmOpenRead; Reset(filemp3,1); pos:=framePos; seek(filemp3, pos+36);
BlockRead(filemp3, buf, 4, count); for n := 0 to 4 do
begin
if (buf[n] + buf[n + 1] + buf[n + 2] + buf[n + 3] = 'STEG') then begin Result := true; CloseFile(filemp3); Exit; end end; CloseFile(filemp3); end else begin exit; end; end;
//function untuk memeriksa apakah sebuah frame dapat digunakan sebagai penampung pesan
function isAvailableToSteg(filename: string; framePos: Integer; length: Integer): Boolean;
var
pos, i : Integer;
buf: array[0..254] of byte; available: Boolean;
filemp3lagi: TFileStream; begin available:=False; Result:=available; if FileExists(filename) then begin filemp3lagi:=TfileStream.Create(filename, fmOpenRead or fmShareDenyNone); pos:=framePos; filemp3lagi.seek(pos, soFromBeginning); filemp3lagi.Read(buf, length); for i := 0 to length-2 do begin if (buf[i]=buf[i+1]) then begin available:=True; end else begin available:=False; Result:=available; filemp3lagi.Free; exit; end; end; Result:=available; filemp3lagi.Free; end else begin exit; end; end;
//function untuk menghitung jumlah frame
function FrameCount(filename: string): Integer; var
pos, posNext, count: Integer; frameHeader: TMP3HeaderArray; begin pos:=FindFirstHeader(filename); frameHeader:=getMP3Header(filename, pos); count:=0; posNext:=pos; while posNext<>-1 do begin count:=count+1;
posNext:=FindNextFrame(filename, posNext, frameHeader); if posNext<>-1 then
frameHeader:=getMP3Header(filename, posNext); end;
Result := count; end;
//function untuk menghitung jumlah frame yang dapat dijadikan media steganografi
function FrameAvailableToStegCount(filename: string; length: Integer): Integer;
var
pos:=FindFirstHeader(filename); frameHeader:=getMP3Header(filename, pos); count:=0; posNext:=pos; while posNext<>-1 do begin
if (isAvailableToSteg(filename, posNext+36, length)) then begin
count:=count+1; end;
posNext:=FindNextFrame(filename, posNext, frameHeader); if posNext<>-1 then
frameHeader:=getMP3Header(filename, posNext); end;
Result := count-1; end;
//function untuk mendapatkan maximum steg data dalam sebuah MP3 function MaxStegSize(filename: string; length: Integer): Integer; var
posmp3, posmp3old, n, posNext: Integer; firsttime, available: Boolean;
begin
firsttime:= True;
posmp3:=FindFirstHeader(filename); posmp3old:=posmp3;
posNext:=FindNextFrame(filename, posmp3, getMP3Header(filename, posmp3));
n:=0;
posmp3:=posmp3+40;
//loop sampai semua pesan rahasia dibaca while (posNext<>-1) do begin if (firsttime) then begin if (isAvailableToSteg(filename,posmp3old+36,length)) then begin posmp3:=posNext+40; posmp3old:=posNext;
posNext:=FindNextFrame(filename, posmp3old, getMP3Header (filename,posmp3old));
firsttime:=False; end else begin
posmp3old:=posNext;
posNext:=FindNextFrame(filename, posmp3old, getMP3Header (filename,posmp3old));
posmp3:=posmp3old+40; end;
end;
available:=isAvailableToSteg(filename,posmp3old+36,length); if ((available) AND (not firsttime)) then
begin
posmp3:=posmp3+1; n:=n+1;
end else if ((not available) AND (not firsttime)) then begin
end;
if ((posmp3>=posNext) AND (not firsttime) AND (posNext<>-1)) then begin
posmp3old:=posNext;
posNext:=FindNextFrame(filename, posmp3old, getMP3Header (filename,posmp3old)); posmp3:=posmp3old+40; end; end; Result:=n; end;
//funnction untuk menyisipkan pesan dalam MP3
function HideFile(mp3File:string; hiddenFile: string; resultFile: string; length: Integer): Integer;
var
posmp3, poshidden, posmp3old, n, m, posNext, len, i: Integer; buff1: byte;
firsttime, available: Boolean; key: string;
streamHidden, streamHasil: TFileStream; begin
Result:=-1;
firsttime:= True;
if (FileSize(hiddenFile)>MaxStegSize(mp3File, length)) then begin
exit; end;
CopyFile(PAnsiChar(mp3file), PAnsiChar(resultFile), False); //berikan penanda berupa panjang pesan dan ekstensi
key:=inttostr(FileSize(hiddenFile))+'#'+LeftPad(extractFileExt( hiddenFile), ' ', 5);
len:=strlen(PAnsiChar(key)); //membuka file hasil
streamHasil:=TFileStream.Create(resultFile, fmOpenReadWrite or fmShareDenyNone);
posmp3:=FindFirstHeader(resultFile); posmp3old:=posmp3;
posNext:=FindNextFrame(resultFile, posmp3, getMP3Header(resultFile, posmp3));
streamHasil.Seek(posmp3, soFromBeginning); //membuka file yang akan disisipkan
streamHidden:=TfileStream.Create(hiddenFile, fmOpenRead or fmShareDenyNone); poshidden:=0; streamHidden.Seek(poshidden, soFromBeginning); n:=0; posmp3:=posmp3+40; m:=streamHidden.Size;
poshidden:=n; streamHidden.Seek(poshidden, soFromBeginning); streamHidden.Read(buff1, 1); if (firsttime) then begin if (isAvailableToSteg(mp3File,posmp3old+36,length)) then begin streamHasil.Seek(posmp3-4, soFromBeginning); streamHasil.WriteBuffer('STEG', 4); for i := 0 to len do begin streamHasil.Write(Byte(key[i+1]), 1); end; posmp3:=posNext+40; posmp3old:=posNext;
posNext:=FindNextFrame(resultFile, posmp3old, getMP3Header (resultFile,posmp3old));
firsttime:=False; end else begin
posmp3old:=posNext;
posNext:=FindNextFrame(resultFile, posmp3old, getMP3Header (resultFile,posmp3old));
posmp3:=posmp3old+40; end;
end;
available:=isAvailableToSteg(mp3File,posmp3old+36,length); if ((available) AND (not firsttime)) then
begin if ((posmp3-4)=(posmp3old+36)) then begin streamHasil.Seek(posmp3-4, soFromBeginning); streamHasil.WriteBuffer('STEG', 4); streamHasil.Write(buff1, 1); posmp3:=posmp3+1;
end else begin
streamHasil.Seek(posmp3, soFromBeginning); streamHasil.Write(buff1, 1);
posmp3:=posmp3+1; end;
n:=n+1;
end else if ((not available) AND (not firsttime)) then begin
posmp3:=posNext; end;
if ((posmp3>=posNext) AND (not firsttime) AND (posNext<>-1)) then begin
posmp3old:=posNext;
posNext:=FindNextFrame(resultFile, posmp3old, getMP3Header (resultFile, posmp3old)); posmp3:=posmp3old+40; end; end; streamHasil.Free; streamHidden.Free; Result:=n; end;
//function untuk mendapatkan hidden file function RevealFile(mp3File:string): string; var
filemp3: File;
posmp3, posmp3old, n, count, posNext: Integer; buff1: byte;
firsttime:Boolean; res: string;
remaining, len: Integer; A: TStringList; resultExt: string; streamHasil: TFileStream; begin Result:='None'; firsttime:=True; res:=''; remaining:=255; A := TStringList.Create; //Buka file mp3 AssignFile(filemp3, mp3File); FileMode:=fmOpenRead; Reset(filemp3,1); posmp3:=FindFirstHeader(mp3File); posmp3old:=posmp3;
posNext:=FindNextFrame(mp3File, posmp3, getMP3Header(mp3File, posmp3));
seek(filemp3, posmp3);
//Mengetahui ukuran dan ekstensi file hasil steganografi posmp3:=posmp3+40; while (firsttime) do begin if (isStegged(mp3File,posmp3old)) then begin seek(filemp3, posmp3);
BlockRead(filemp3, buff1, 1, count); res:=res+Char(buff1); if (buff1=ord('.')) then begin remaining:=4; end; remaining:=remaining-1; if (remaining<0) then begin firsttime:=False; break; end; posmp3:=posmp3+1; end else begin posmp3:=posNext; end;
if (posmp3>=posNext) then begin
posmp3:=posmp3old+40; end;
end;
Split('#', res, A); len:=strtoint(A[0]); resultExt:=trim(A[1]); streamHasil:=TFileStream.Create(mp3File+resultExt, fmCreate or fmShareDenyNone); posmp3:=posNext; posmp3old:=posmp3;
posNext:=FindNextFrame(mp3File, posmp3, getMP3Header(mp3File, posmp3)); n:=0; posmp3:=posmp3+40; while (n<len) do begin if (isStegged(mp3File,posmp3old)) then begin seek(filemp3, posmp3);
BlockRead(filemp3, buff1, 1, count); //Tulis
streamHasil.Write(buff1,1); n:=n+1;
posmp3:=posmp3+1; end else begin posmp3:=posNext; end;
if (posmp3>=posNext) then begin
posmp3old:=posNext;
posNext:=FindNextFrame(mp3File, posmp3old, getMP3Header (mp3File,posmp3old)); posmp3:=posmp3old+40; end; end; streamHasil.Free; CloseFile(filemp3); Result:=mp3File+resultExt; end;
// mengembalikan ukuran sebenarnya dari sebuah file. Return zero jika file tidak ditemukan
function FileSize(FileName : String) : Int64; var
SearchRec : TSearchRec; begin
if FindFirst(FileName, faAnyFile, SearchRec ) = 0 then Result := Int64(SearchRec.FindData.nFileSizeHigh) shl Int64(32) + Int64(SearchREc.FindData.nFileSizeLow)
else
Result := 0; end;
procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings); begin Assert(Assigned(Strings)); Strings.Clear; Strings.Delimiter := Delimiter; Strings.DelimitedText := Input; end;
//pad string (left)
function LeftPad(S: string; Ch: Char; Len: Integer): string; var
RestLen: Integer; begin
Result := S;
RestLen := Len - Length(s); if RestLen < 1 then Exit;
Result := S + StringOfChar(Ch, RestLen); end;
end.
//function untuk kompresi dan enkripsi pesan rahasia
function TfrmMain.encryptAndCompress(filename: string; password: string): Boolean;
var
SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; CompressionStream: TZCompressionStream;
begin
Result:=False; //Proses Kompresi try
InputStream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
OutputStream := TFileStream.Create('tmpCrypt.tmp.zip', fmCreate); CompressionStream := TZCompressionStream.Create(OutputStream, zcMax); CompressionStream.CopyFrom(InputStream, InputStream.Size); CompressionStream.Free; //Result:=True; OutputStream.Free; InputStream.Free; except MessageDlg('File IO error',mtError,[mbOK],0); end; //Proses Enkripsi try SourceCrypt:= TFileStream.Create('tmpCrypt.tmp.zip',fmOpenRead or fmShareDenyNone); DestCrypt:= TFileStream.Create('tmpCrypt.tmp'+ExtractFileExt (filename),fmCreate); DCP_rijndael1.InitStr(password,TDCP_sha1); DCP_rijndael1.EncryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); // Proses meng-encrypt pesan rahasia
DestCrypt.Free; SourceCrypt.Free; except MessageDlg('File IO error',mtError,[mbOK],0); end; DeleteFile('tmpCrypt.tmp.zip'); end;
//function untuk memeriksa ukuran file setelah dikompresi dan dienkripsi
function TfrmMain.checkSizeAfter(filename: string; password: string): Integer;
var
SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; CompressionStream: TZCompressionStream;
begin
//kompresi try
InputStream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone);
OutputStream := TFileStream.Create('tmpCrypt.tmp.zip', fmCreate); CompressionStream := TZCompressionStream.Create(OutputStream, zcMax); CompressionStream.CopyFrom(InputStream, InputStream.Size); CompressionStream.Free; OutputStream.Free; InputStream.Free; except MessageDlg('File IO error',mtError,[mbOK],0); end; //enkripsi try SourceCrypt:= TFileStream.Create('tmpCrypt.tmp.zip',fmOpenRead or fmShareDenyNone); DestCrypt:= TFileStream.Create('tmpCrypt.tmp',fmCreate); DCP_rijndael1.InitStr(password,TDCP_sha1); DCP_rijndael1.EncryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); DCP_rijndael1.Burn; Result:=DestCrypt.Size; DestCrypt.Free; SourceCrypt.Free; except MessageDlg('File IO error',mtError,[mbOK],0); end; DeleteFile('tmpCrypt.tmp'); DeleteFile('tmpCrypt.tmp.zip'); end;
procedure TfrmMain.btnSisipClick(Sender: TObject); var
n: Integer; begin
if ((txtPassword.Text='') or (txtPassword2.Text='')) then begin
messageDlg('Masukkan Kunci!!', mtError, [mbOK], 0); exit;
end;
if (txtPassword.Text<>txtPassword2.Text) then begin
messageDlg('Kedua Kunci tidak sesuai! Periksa kembali!!!', mtError, [mbOK], 0);
exit; end;
if (not FileExists(txtFilename.Text)) or (not FileExists (txtHiddenFile.Text)) then
begin
messageDlg('Masukkan File MP3 dan Pesan Rahasia', mtError, [mbOK], 0);
exit; end;
stegFileResult:= extractFilePath(txtFilename.Text) + 'RSteg-'+ extractFileName(txtFilename.Text) ;
txtStegFileResult.Text:=stegFileResult;
if (encryptAndCompress(txtHiddenFile.Text, txtPassword.Text)) then begin
n:=HideFile(txtFilename.Text, 'tmpCrypt.tmp'+ExtractFileExt (txtHiddenFile.Text), stegFileResult, 20);
if (n>-1) then begin
messageDlg('Penyisipan Pesan Berhasil!'+#13+'File hasil steganografi adalah '+stegFileResult+#13+'Jumlah Byte yang disisipkan adalah '+inttostr(n), mtInformation, [mbOK], 0); end else begin
messageDlg('Penyisipan Gagal! Ukuran pesan melebihi kapasitas maximal MP3', mtError, [mbOK], 0);
end;
end else begin
messageDlg('Proses Kompresi dan Enkripsi Gagal!', mtError,[mbOK],0);
end; end;
procedure TfrmMain.btnMaxMP3Click(Sender: TObject); var max: Integer; begin if FileExists(txtFilename.Text) then begin max:=MaxStegSize(txtFilename.Text, 20);
messageDlg('Kapasitas Maksimal MP3 adalah '+inttostr(max), mtInformation, [mbOK], 0);
btnMaxMP3.Caption:='Kapasitas Max MP3 = '+inttostr(max); end else
begin
messageDlg('File tidak dapat ditemukan ', mtError, [ mbOK], 0);
end; end;
var
sizeAfter: Integer; begin
if (txtPassword.Text='') then begin
messageDlg('Masukkan Kunci!!!', mtError, [ mbOK], 0);
exit; end;
if (not FileExists(txtHiddenFile.Text)) then begin
messageDlg('File tidak ditemukan ', mtError, [ mbOK], 0);
exit; end;
sizeAfter:=checkSizeAfter(txtHiddenFile.Text, txtPassword.Text); messageDlg('Jumlah byte pesan setelah dienkripsi adalah
'+inttostr(sizeAfter), mtInformation, [mbOK], 0); btnCipherSize.Caption:='Ukuran byte terenkripsi = '+inttostr(sizeAfter);
end; end.
//Function untuk dekripsi dan dekompresi pesan
function TForm4.decompressAndDecrypt(filename: string; kunci: string):
Boolean; var
SourceCrypt, DestCrypt, InputStream, OutputStream: TFileStream; DeCompressionStream: TZDecompressionStream;
begin
Result:=False; //Proses dekripsi try
SourceCrypt:= TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); DestCrypt:= TFileStream.Create('tmpDecrypt.tmp.zip',fmCreate); DCP_rijndael1.InitStr(kunci,TDCP_sha1); // dekripsi pesan DCP_rijndael1.DecryptStream(SourceCrypt,DestCrypt,SourceCrypt.Size); DCP_rijndael1.Burn; DestCrypt.Free; SourceCrypt.Free; DeleteFile(filename); //Result:=True; except MessageDlg('File IO error',mtError,[mbOK],0); end; //Proses dekompresi try InputStream := TFileStream.Create('tmpDecrypt.tmp.zip', fmOpenRead or fmShareDenyNone);
DecompressionStream := TZDecompressionStream.Create(InputStream); OutputStream.CopyFrom(DecompressionStream, 0); DecompressionStream.Free; OutputStream.Free; InputStream.Free; DeleteFile('tmpDecrypt.tmp.zip'); Result:=True; except MessageDlg('File IO error',mtError,[mbOK],0); end; end;
procedure TForm4.btnUngkapClick(Sender: TObject); var
resultName:string; begin
if (txtkunci.Text='') then begin
messageDlg('Masukkan kunci pada kolom di atas!',mtError, [mbOK], 0);
exit; end;
if (not FileExists(txtStegFileResult.Text)) then begin
messageDlg('Masukkan File Stegged-Mp3!', mtError, [mbOK], 0); exit; end; resultName:=RevealFile(txtStegFileResult.Text); if (resultName<>'None') then begin
//decompress and decrypt
if (decompressAndDecrypt(resultName, txtkunci.Text)) then begin
messageDlg('Pengungkapan Pesan Berhasil!'+#13+'File Hasil Pengungkapan Pesan adalah '+resultName, mtInformation, [mbOK], 0);
end else begin
messageDlg('Pengungkapan Pesan Gagal!', mtError, [mbOK], 0); end;
end else begin
messageDlg('Pengungkapan Pesan Gagal!', mtError, [mbOK], 0); end;
end; end.