Lampiran 1. Fungsi Menu Utama
function varargout = menu_utm(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn',
@menu_utm_OpeningFcn, ...
'gui_OutputFcn', @menu_utm_OutputFcn, ...
'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:}); end
function menu_utm_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
movegui(gcf, 'center');
guidata(hObject, handles);
function varargout = menu_utm_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnProsesPenyisipan_Callback(hObject, eventdata, handles)
figure(prosesPenyisipan);
function btnProsesEkstraksi_Callback(hObject, eventdata, handles)
figure(prosesEkstraksi);
figure (hitungMSE);
function btnHitungMSE_CreateFcn(hObject, eventdata, handles)
function btnKeluar_Callback(hObject, eventdata, handles)
Lampiran 2. Fungsi Enkripsi dan Encoding
function varargout = prosesPenyisipan(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn',
@prosesPenyisipan_OpeningFcn, ... 'gui_OutputFcn', @prosesPenyisipan_OutputFcn, ...
'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:}); end
function prosesPenyisipan_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout =
prosesPenyisipan_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles) axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]); axes(handles.picCitraStego); cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtKataKunciKedua,'String',''); set(handles.txtKataKunciKetiga,'String',''); set(handles.lblNamaFile,'String','');
clearvars -global;
function btnPilihCitraCover_Callback(hObject, eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra Cover');
if isequal(fileGambar,0) return;
end
axes(handles.picCitraStego); cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
global gmbInput namaFile
pathGambar = [folderGambar fileGambar]; axes(handles.picCitraCover)
cla(gca, 'reset'); imshow(pathGambar); drawnow;
tmpImg = imread(pathGambar); gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi leGambar)-4));
namaFile = fileGambar;
function txtPesanRahasia_Callback(hObject, eventdata, handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
function txtKataKunciPertama_Callback(hObject, eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function txtKataKunciKedua_Callback(hObject, eventdata, handles)
function txtKataKunciKedua_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function txtKataKunciKetiga_Callback(hObject, eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function btnProsesPenyisipan_Callback(hObject, eventdata, handles)
global gmbInput gmbOutput if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih dahulu!');
uiwait(msgbox(message)); return
end
if (isempty(get(handles.txtPesanRahasia,'String'))) message = sprintf('Masukkan pesan rahasia!'); uiwait(msgbox(message));
end
if (isempty(get(handles.txtKataKunciPertama,'String'))) message = sprintf('Masukkan kata kunci pertama!'); uiwait(msgbox(message));
return end
if (isempty(get(handles.txtKataKunciKedua,'String'))) message = sprintf('Masukkan kata kunci kedua!'); uiwait(msgbox(message));
return end
if (isempty(get(handles.txtKataKunciKetiga,'String'))) message = sprintf('Masukkan kata kunci ketiga!'); uiwait(msgbox(message));
return end
filterGmbInput = gmbInput;
filterGmbInput(filterGmbInput == bin2dec('00011111')) = bin2dec('00011110');
filterGmbInput(filterGmbInput == bin2dec('00111111')) = bin2dec('00111110');
filterGmbInput(filterGmbInput == bin2dec('01111111')) = bin2dec('01111110');
filterGmbInput(filterGmbInput == bin2dec('11111111')) = bin2dec('11111110');
[gmbOutput] = MLSB(true, filterGmbInput, get(handles.txtPesanRahasia,'String'), ...
get(handles.txtKataKunciPertama,'String'), ... get(handles.txtKataKunciKedua,'String'), ... get(handles.txtKataKunciKetiga,'String'));
if ~isempty(gmbOutput)
axes(handles.picCitraStego) cla(gca, 'reset');
imshow(gmbOutput); drawnow;
message = sprintf('Proses Penyisipan Berhasil'); uiwait(msgbox(message));
end
global namaFile gmbOutput if (isempty(gmbOutput))
message = sprintf('Lakukan proses penyisipan terlebih dahulu!');
uiwait(msgbox(message)); return
end
nama = namaFile(1:strfind(namaFile, '.')-1); ekstensi = namaFile(strfind(namaFile, '.'):end);
[fileGambar, folderGambar] = uiputfile([nama '_Stego' ekstensi],'Save file name');
if ~isequal(fileGambar, 0)
pathGambar = [folderGambar fileGambar]; imwrite(gmbOutput, pathGambar);
Lampiran 3. Fungsi Decoding dan Dekripsi
function varargout = prosesEkstraksi(varargin) gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn',
@prosesEkstraksi_OpeningFcn, ... 'gui_OutputFcn', @prosesEkstraksi_OutputFcn, ...
'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:}); end
function prosesEkstraksi_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = prosesEkstraksi_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles) axes(handles.picCitraStego);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.txtKataKunciPertama,'String',''); set(handles.txtKataKunciKedua,'String',''); set(handles.txtKataKunciKetiga,'String',''); set(handles.lblNamaFile,'String','');
clearvars -global;
function btnCitraStego_Callback(hObject, eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.pgm;*.png;*.tif;*.bmp','Pilih Citra Stego');
if isequal(fileGambar,0) return;
end
set(handles.txtPesanRahasia,'String','');
global gmbInput namaFile
pathGambar = [folderGambar fileGambar]; axes(handles.picCitraStego)
cla(gca, 'reset'); imshow(pathGambar); drawnow;
tmpImg = imread(pathGambar); gmbInput = tmpImg;
set(handles.lblNamaFile,'String',fileGambar(1:length(fi leGambar)-4));
namaFile = fileGambar;
function txtKataKunciPertama_Callback(hObject, eventdata, handles)
function txtKataKunciPertama_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function txtKataKunciKedua_Callback(hObject, eventdata, handles)
function txtKataKunciKedua_CreateFcn(hObject, eventdata, handles)
set(hObject,'BackgroundColor','white'); end
function txtKataKunciKetiga_Callback(hObject, eventdata, handles)
function txtKataKunciKetiga_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function txtPesanRahasia_Callback(hObject, eventdata, handles)
function txtPesanRahasia_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white'); end
function btnProsesEkstraksi_Callback(hObject, eventdata, handles)
global gmbInput
if (isempty(gmbInput))
message = sprintf('Pilih citra stego terlebih dahulu!');
uiwait(msgbox(message)); return
end
if (isempty(get(handles.txtKataKunciPertama,'String'))) message = sprintf('Masukkan kata kunci pertama!'); uiwait(msgbox(message));
return end
if (isempty(get(handles.txtKataKunciKedua,'String'))) message = sprintf('Masukkan kata kunci kedua!'); uiwait(msgbox(message));
return end
message = sprintf('Masukkan kata kunci ketiga!'); uiwait(msgbox(message));
return end
[pesan] = MLSB(false, gmbInput, '', ...
get(handles.txtKataKunciPertama,'String'), ... get(handles.txtKataKunciKedua,'String'), ... get(handles.txtKataKunciKetiga,'String'));
if ~isempty(pesan)
%Tampilkan pada layar
set(handles.txtPesanRahasia,'String',pesan);
message = sprintf('Proses Ekstraksi Berhasil'); uiwait(msgbox(message));
Lampiran 4. Fungsi Means Square Error (MSE)
function varargout = hitungMSE(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn',
@hitungMSE_OpeningFcn, ...
'gui_OutputFcn', @hitungMSE_OutputFcn, ...
'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1}); end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:}); end
function hitungMSE_OpeningFcn(hObject, eventdata, handles, varargin)
guidata(hObject, handles);
btnClear_Callback(handles)
function varargout = hitungMSE_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function btnClear_Callback(handles) axes(handles.picCitraCover);
cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]); axes(handles.picCitraStego); cla(gca, 'reset');
set(gca,'XTick',[],'YTick',[]);
set(handles.lblNamaFileCitraCover,'String',''); set(handles.lblNamaFileCitraStego,'String',''); set(handles.lblMSE,'String','');
function btnPilihCitraCover_Callback(hObject, eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra Cover');
if isequal(fileGambar,0) return;
end
global gmbInput
pathGambar = [folderGambar fileGambar]; axes(handles.picCitraCover)
cla(gca, 'reset'); imshow(pathGambar); drawnow;
tmpImg = imread(pathGambar); gmbInput = tmpImg;
function btnPilihCitraStego_Callback(hObject, eventdata, handles)
[fileGambar, folderGambar] =
uigetfile('*.jpg;*.pgm;*.png;*.tif;*.bmp','Pilih Citra Cover');
if isequal(fileGambar,0) return;
end
global gmbOutput
pathGambar = [folderGambar fileGambar]; axes(handles.picCitraStego)
cla(gca, 'reset'); imshow(pathGambar); drawnow;
tmpImg = imread(pathGambar); gmbOutput = tmpImg;
set(handles.lblNamaFileCitraStego,'String',fileGambar(1 :length(fileGambar)-4));
function btnHitungMSE_Callback(hObject, eventdata, handles)
global gmbInput gmbOutput if (isempty(gmbInput))
message = sprintf('Pilih citra cover terlebih dahulu!');
uiwait(msgbox(message)); return
end
if (isempty(gmbOutput))
message = sprintf('Pilih citra stego terlebih dahulu!');
uiwait(msgbox(message)); return
end
if length(size(gmbInput)) ~= length(size(gmbOutput)) message = sprintf('Ukuran citra tidak sama!'); uiwait(msgbox(message));
return end
for i = 1 : length(size(gmbInput))
if size(gmbInput, i) ~= size(gmbOutput, i)
message = sprintf('Ukuran citra tidak sama!'); uiwait(msgbox(message));
return end
end
for i = 1 : length(size(gmbInput))
tmpMSE = norm(double(gmbInput(:,:,i) - gmbOutput(:,:,i)));
mse = mse + (tmpMSE / (size(gmbInput, 1) * size(gmbInput, 2)));
end