LISTING PROGRAM
public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
TabHost tab = (TabHost) findViewById(R.id.tabHost); tab.setup();
TabHost.TabSpec spec1 = tab.newTabSpec("Pengamanan"); spec1.setIndicator("PENGAMANAN");
spec1.setContent(R.id.layout1); tab.addTab(spec1);
TabHost.TabSpec spec2 = tab.newTabSpec("Pengungkapan"); spec2.setIndicator("PENGUNGKAPAN");
spec2.setContent(R.id.layout2); tab.addTab(spec2);
for(int i=0;i<tab.getTabWidget().getChildCount();i++) {
TextView tv = (TextView)
tab.getTabWidget().getChildAt(i).findViewById(android.R.id.title); tv.setTextColor(Color.parseColor("#FFFFFF"));
tv.setTextSize(15);
A-2
}
for(i=0; i<key2.length(); i++){ j = (int) key2.charAt(i);
final EditText et_plaintext_en = (EditText) findViewById(R.id.et_plaintext_en);
final EditText et_key1_en = (EditText) findViewById(R.id.et_key1_en);
final EditText et_key2_en = (EditText) findViewById(R.id.et_key2_en);
final TextView tv_ciphertext_en = (TextView) findViewById(R.id.tv_ciphertext_en);
ImageButton b_encrypt = (ImageButton) findViewById(R.id.b_encrypt); b_encrypt.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String plaintext = et_plaintext_en.getText().toString(); String key1 = et_key1_en.getText().toString();
String key2 = et_key2_en.getText().toString();
if (checkInput(plaintext, key1, key2)) {
String key = "", ciphertext1 = "", ciphertext2 = "";
int i, j, k, pesan, kecil = 0, tmp = 0; j = (int) plaintext.charAt(i);
k = (int) key.charAt(i);
pesan = ((j - 32) + (k - 32)) % 95; pesan += 32;
ciphertext1 += (char) pesan; }
char[][] matrix = new char[bar][kol];
for (i = 0; i < bar; i++) {
for (j = 0; j < kol; j++) {
if (tmp < ciphertext1.length()) {
break; }
}
for (i = 0; i < kol; i++) {
if (Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {
kecil = Integer.parseInt(key2.charAt(i) + ""); }
}
for (i = 0; i < bar; i++) {
for (j = 0; j < kol; j++) {
if (Integer.parseInt(key2.charAt(j) + "") == kecil && matrix[i][j] != Character.MIN_VALUE) {
ciphertext2 += matrix[i][j];
Toast.makeText(MainActivity.this, "Pengamanan Sukses", Toast.LENGTH_LONG).show();
}
else{
tv_ciphertext_en.setText("");
Toast.makeText(MainActivity.this, "Periksa Kembali Inputan Anda", Toast.LENGTH_LONG).show();
final EditText et_ciphertext_de = (EditText) findViewById(R.id.et_ciphertext_de);
final EditText et_key1_de = (EditText) findViewById(R.id.et_key1_de);
final EditText et_key2_de = (EditText) findViewById(R.id.et_key2_de);
final TextView tv_plaintext_de = (TextView) findViewById(R.id.tv_plaintext_de);
ImageButton b_decrypt = (ImageButton) findViewById(R.id.b_decrypt); b_decrypt.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
String ciphertext2 = et_ciphertext_de.getText().toString(); String key1 = et_key1_de.getText().toString();
String key2 = et_key2_de.getText().toString();
if (checkInput(ciphertext2, key1, key2)) { String key="", ciphertext1="", plaintext="";
int i, j, k=0, pesan, kecil=0, tmp=-1; //dekripsi myszkowski
int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext2.length()/kol);
A-4
if(Integer.parseInt(key2.charAt(j)+"") == kecil){
if(i == bar-1 && j >=
kol-((bar*kol)-if(ciphertext1.length() < ciphertext2.length()){ ciphertext1 += matrix[i][j];
for(i=0; i<ciphertext1.length(); i++){ j = i % key1.length();
key += key1.charAt(j); }
for(i=0; i<ciphertext1.length(); i++){ j = (int) ciphertext1.charAt(i); k = (int) key.charAt(i);
plaintext += (char) pesan; }
tv_plaintext_de.setText(plaintext);
Toast.makeText(MainActivity.this, "Pengungkapan Sukses", Toast.LENGTH_LONG).show();
}
else{
tv_plaintext_de.setText("");
Toast.makeText(MainActivity.this, "Periksa Kembali Inputan Anda", Toast.LENGTH_LONG).show();
final EditText et_plaintext_en = (EditText) findViewById(R.id.et_plaintext_en);
final EditText et_key1_en = (EditText) findViewById(R.id.et_key1_en);
final EditText et_key2_en = (EditText) findViewById(R.id.et_key2_en);
final TextView tv_ciphertext_en = (TextView) findViewById(R.id.tv_ciphertext_en);
final EditText et_ciphertext_de = (EditText) findViewById(R.id.et_ciphertext_de);
final EditText et_key1_de = (EditText) findViewById(R.id.et_key1_de);
final EditText et_key2_de = (EditText) findViewById(R.id.et_key2_de);
public void onClick(View v) { et_plaintext_en.setText(""); et_key1_en.setText(""); et_key2_en.setText(""); tv_ciphertext_en.setText("");
Toast.makeText(MainActivity.this, "Kolom Inputan Telah Direset", Toast.LENGTH_SHORT).show();
} });
final ImageButton b_clear_de = (ImageButton) findViewById(R.id.b_clear_de); b_clear_de.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) { et_ciphertext_de.setText(""); et_key1_de.setText(""); et_key2_de.setText(""); tv_plaintext_de.setText("");
Toast.makeText(MainActivity.this, "Kolom Inputan Telah Direset", Toast.LENGTH_SHORT).show();
} });
CheckBox cb_view1_en = (CheckBox) findViewById(R.id.cb_view1_en); cb_view1_en.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
CheckBox cb_view1_de = (CheckBox) findViewById(R.id.cb_view1_de); cb_view1_de.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener() {
A-6
});
CheckBox cb_view2_de = (CheckBox) findViewById(R.id.cb_view2_de); cb_view2_de.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
final ImageButton b_help_en = (ImageButton) findViewById(R.id.b_help_en); b_help_en.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = new Intent(MainActivity.this, HelpActivity.class); startActivity(i);
} });
final ImageButton b_help_de = (ImageButton) findViewById(R.id.b_help_de); b_help_de.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = new Intent(MainActivity.this, HelpActivity.class); startActivity(i);
} });
final ImageButton b_about_en = (ImageButton) findViewById(R.id.b_about_en); b_about_en.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = new Intent(MainActivity.this, AboutActivity.class); startActivity(i);
} });
final ImageButton b_about_de = (ImageButton) findViewById(R.id.b_about_de); b_about_de.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
*/
public class HelpActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_help);
ImageButton b_back = (ImageButton) findViewById(R.id.b_back); Button b_penggunaan = (Button) findViewById(R.id.b_penggunaan); Button b_algoritma = (Button) findViewById(R.id.b_algoritma);
final TextView tv_bantuan = (TextView) findViewById(R.id.tv_bantuan); b_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(HelpActivity.this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i); }
});
b_penggunaan.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
tv_bantuan.setText("Terdiri dari proses Pengamanan dan Pengungkapan. Pada Pengamanan, tulis pesan asli yang " +
"ingin disandi pada Kolom Pesan, kunci pertama pada Kolom Kunci 1 dan kunci kedua pada Kolom Kunci 2, kemudian klik " +
"Button Proses untuk memulai Pengamanan. Hasil Pengamanan berupa pesan tersandi yang tidak dapat dibaca.\nPada " +
"Pengungkapan, tulis pesan tersandi hasil dari proses Pengamanan pada Kolom Pesan, kunci pertama pada Kolom Kunci 1 dan " +
"kunci kedua pada Kolom Kunci 2, kemudian klik Button Proses untuk memulai Pengungkapan. Hasil Pengungkapan berupa pesan " +
"asli yang dapat dibaca."); }
});
b_algoritma.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
tv_bantuan.setText("Menggunakan dua buah algoritma Kriptografi yaitu algoritma Vigenere Cipher dan Myszkowski Transposition. " +
"Pada proses Pengamanan, pesan asli dienkripsi menggunakan algoritma Vigenere Cipher, kemudian hasilnya dienkripsi " +
"lagi menggunakan algoritma Myszkowski Transposition menjadi pesan tersandi. Sedangkan pada proses Pengungkapan, " +
"pesan tersandi didekripsi menggunakan algoritma Myszkowski transposition, kemudian hasilnya didekripsi lagi menggunakan " +
"algoritma Vigenere Cipher menjadi pesan asli."); }
});
ImageButton encrypt = (ImageButton) findViewById(R.id.b_encrypt); encrypt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_bantuan.setText("Button yang digunakan untuk memulai proses Pengamanan atau Pengungkapan. Pada proses Pengungkapan, button " +
A-8
Toast.LENGTH_SHORT).show(); }
});
ImageButton help = (ImageButton) findViewById(R.id.b_help_en); help.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_bantuan.setText("Button untuk menampilkan Halaman Bantuan penggunaan (halaman ini). Bantuan yang disediakan yaitu penjelasan " +
"mengenai Penggunaan aplikasi dan apa saja yang ada pada Halaman Pengamanan atau Pengungkapan. Selain itu, Halaman Bantuan " +
"juga berisi penjelasan Algoritma yang digunakan untuk memproses pesan. Gunakan button bergambar panah di kiri atas untuk " +
"kembali ke Halaman Pengamanan.");
Toast.makeText(HelpActivity.this, "Button Bantuan", Toast.LENGTH_SHORT).show();
} });
ImageButton about = (ImageButton) findViewById(R.id.b_about_en); about.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
tv_bantuan.setText("Button untuk menampilkan Halaman Tentang. Halaman ini berisi informasi mengenai pembuat aplikasi. Gunakan button " +
"bergambar panah di kiri atas untuk kembali ke Halaman Pengamanan.");
Toast.makeText(HelpActivity.this, "Button Tentang", Toast.LENGTH_SHORT).show();
} });
EditText pesan = (EditText) findViewById(R.id.et_plaintext_en); pesan.setInputType(InputType.TYPE_NULL);
pesan.setOnTouchListener(new View.OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
tv_bantuan.setText("Kolom untuk menulis pesan yang ingin diproses. Pesan terdiri dari karakter ASCII 32 hingga 126. Apabila muncul " +
"pemberitahuan Periksa Kembali Input Anda, maka mungkin saja salah satu karakter pesan yang digunakan tidak sesuai. " +
"Pesan dapat di-copy ke clipboard dan di-paste dengan menahan klik pada teks. Gunakan button yang muncul pada kanan " +
"atas setelah teks di-select");
Toast.makeText(HelpActivity.this, "Kolom Pesan", Toast.LENGTH_SHORT).show();
return false; }
});
EditText key1 = (EditText) findViewById(R.id.et_key1_en); key1.setInputType(InputType.TYPE_NULL);
key1.setOnTouchListener(new View.OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
tv_bantuan.setText("Kolom untuk menulis kunci pertama. Kunci terdiri dari karakter ASCII 32 hingga 126. Minimal panjang kunci " +
"yang digunakan adalah 2 karakter dan maksimal sepanjang pesan. Apabila muncul pemberitahuan Periksa Kembali Input " +
"Anda, maka mungkin saja kunci yang digunakan tidak sesuai."); Toast.makeText(HelpActivity.this, "Kolom Kunci 1",
Toast.LENGTH_SHORT).show();
return false; }
});
EditText key2 = (EditText) findViewById(R.id.et_key2_en); key2.setInputType(InputType.TYPE_NULL);
Apabila muncul pemberitahuan Periksa Kembali Inputan " +
"Anda, maka mungkin saja kunci yang digunakan tidak sesuai."); Toast.makeText(HelpActivity.this, "Kolom Kunci 2",
Toast.LENGTH_SHORT).show();
return false; }
});
TextView hasil = (TextView) findViewById(R.id.tv_ciphertext_en); hasil.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
tv_bantuan.setText("Kolom untuk menampilkan pesan hasil proses Pengmanan atau Pengungkapan. Pesan dapat di-copy ke clipboard " +
"dengan menahan klik pada teks. Gunakan button yang muncul di kanan atas setelah teks di-select.");
Toast.makeText(HelpActivity.this, "Kolom Hasil Proses", Toast.LENGTH_SHORT).show();
return false; }
});
final CheckBox view1 = (CheckBox) findViewById(R.id.cb_view1_en); view1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(view1.isChecked()){
tv_bantuan.setText("Bila kotak diceklis maka akan memperlihatkan kunci pertama");
Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 1", Toast.LENGTH_SHORT).show();
}
else{
tv_bantuan.setText("Bila kotak tidak diceklis maka akan menyembunyikan kunci pertama");
Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 1", Toast.LENGTH_SHORT).show();
} } });
final CheckBox view2 = (CheckBox) findViewById(R.id.cb_view2_en); view2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(view2.isChecked()){
tv_bantuan.setText("Bila kotak diceklis maka akan memperlihatkan kunci kedua");
Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 2", Toast.LENGTH_SHORT).show();
}
else{
tv_bantuan.setText("Bila kotak tidak diceklis maka akan menyembunyikan kunci kedua");
Toast.makeText(HelpActivity.this, "Kotak Lihat Kunci 2", Toast.LENGTH_SHORT).show();
A-10
/**
* Created by ILMUKOMPUTER on 8/6/2016. */
public class AboutActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_about);
ImageButton b_back = (ImageButton) findViewById(R.id.b_back); b_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(AboutActivity.this, MainActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ilmukomputer.mycipher.MainActivity" android:background="@drawable/background">
<TabHost
android:id="@+id/tabHost"
android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout
android:id="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TabWidget
android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content"
android:background="@color/colorPrimary"></TabWidget> <FrameLayout
android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent"> <include
android:id="@+id/layout1"
layout="@layout/layout_encrypt" android:layout_width="match_parent"
android:layout_height="match_parent"></include> <include
android:id="@+id/layout2"
layout="@layout/layout_decrypt" android:layout_width="match_parent"
android:layout_height="match_parent"></include> </FrameLayout>
</LinearLayout> </TabHost>
<TextView
android:id="@+id/tv_ciphertext_en" android:layout_width="fill_parent" android:layout_height="fill_parent" android:hint="Pesan Tersandi" android:background="@drawable/box" android:layout_alignParentEnd="true" /> <ImageButton android:layout_alignParentEnd="true" /> <EditText
android:id="@+id/et_plaintext_en" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="text"
android:hint="Tulis Pesan" android:maxLines="1" android:layout_alignParentBottom="true" /> <EditText android:hint="Kunci 1"
android:maxLines="1"
A-12
android:layout_toStartOf="@+id/cb_view2_en" android:layout_alignStart="@+id/et_key1_en" /> <ImageButton android:layout_alignParentEnd="true" /> <ImageButton android:layout_alignParentTop="true" /> <ImageButton android:layout_alignParentTop="true" /> <CheckBox android:layout_alignParentEnd="true" /> <CheckBox android:layout_alignParentEnd="true" /> </RelativeLayout>
6. layout_decrypt.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/tv_plaintext_de" android:layout_width="fill_parent" android:layout_height="fill_parent" android:hint="Pesan Asli"
android:background="@drawable/box" android:gravity="left"
android:textIsSelectable="true" android:padding="20dp"
android:layout_width="50dip" android:layout_alignParentEnd="true" /> <EditText
android:id="@+id/et_ciphertext_de" android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="text"
android:hint="Tulis Pesan Tersandi" android:maxLines="1" android:layout_alignParentBottom="true" /> <EditText android:hint="Kunci 1"
android:maxLines="1"
android:layout_toStartOf="@+id/cb_view1_de" /> <EditText android:hint="Kunci 2"
A-14
android:background="@drawable/ic_about" android:gravity="center"
android:layout_toRightOf="@+id/b_help_de" android:layout_marginBottom="10dp" android:layout_alignParentTop="true" /> <ImageButton android:layout_alignParentTop="true" /> <CheckBox android:layout_alignParentEnd="true" /> <CheckBox android:layout_alignParentEnd="true" /> </RelativeLayout>
7. activity_help.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ilmukomputer.mycipher.HelpActivity" android:background="@drawable/background">
<ImageButton android:layout_alignParentTop="true" /> <TextView
android:id="@+id/tv_menu_bantuan" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Menu Bantuan"
android:textSize="50sp"
android:layout_marginBottom="20dp" android:layout_below="@+id/b_back" android:layout_centerHorizontal="true" /> <Button
android:id="@+id/b_algoritma" android:minHeight="90dp" />
<TextView
android:layout_marginBottom="10dp" /> <FrameLayout android:background="@drawable/box"> <include
android:id="@+id/layout3"
layout="@layout/layout_encrypt" android:layout_width="wrap_content"
android:layout_height="wrap_content"></include> </FrameLayout>
</RelativeLayout>
8. activity_about.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ilmukomputer.mycipher.AboutActivity" android:background="@drawable/background">
<ImageButton
android:id="@+id/b_back" android:layout_width="50dip" android:layout_height="50dip"
A-16
android:layout_height="fill_parent" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_centerHorizontal="true" android:layout_below="@+id/tv_menu_tentang" android:src="@drawable/cover" />
CURRICULUM VITAE
DATA PRIBADI
PENDIDIKAN FORMAL
1999–2000 TK Angkasa Lanud Padang
2000–2004 SD An-Nur Pekanbaru
2004–2006 SD Angkasa 1 Lanud Padang
2006–2009 SMPN 7 Padang
2009–2010 SMAN 10 Padang
2010–2012 SMAN 4 Pekanbaru
2012–sedang berlangsung Universitas Sumatera Utara Program Studi : S1 IlmuKomputer
KEMAMPUAN
Nama Lengkap Faisal Ridho
Jenis Kelamin 121401055
Tempat, Tanggal Lahir Medan, 25 Mei 1994
Agama Islam
Alamat Jl. Jermal VII Komp. Graha Jermal A.20
No.HP 081269946242
E-mail buatkirimtugas@gmail.com
Alamat Orang Tua Jl. Jermal VII Komp. Graha Jermal A.20
DAFTAR PUSTAKA
Achmad, R. 2011. Pengukuran kekuatan kunci pada vigenere cipher. (Online)
http://informatika.stei.itb.ac.id/~rinaldi.munir/Kriptografi/2010-2011/Makalah1/Makalah1-IF3058-Sem1-2010-2011-058.pdf (27 Juli 2016).
Asror, K. 2015. Peningkatan sistem keamanan pesan pada perangkat mobile android dengan enkripsi dekripsi menggunakan algoritma affine cipher dan vigenere cipher. Skripsi. Universitas Dian Nuswantoro Semarang.
Badan Pengembangan dan Pembinaan Bahasa.2008. Kamus Besar Bahasa Indonesia Dalam Jaringan.(Online) http://badanbahasa.kemdikbud.go.id/kbbi/ (14 Maret 2016).
Bhateja, A. & Kumar, S. 2014. Genetic algorithm with elitism for cryptanalysis of vigenere cipher. Proceedings of International Conference Issues and Challenges in Intelligent Computing Techniques (ICICT). pp. 373-377.
Bhateja, A.K., Bhateja, A., Chaudhury, S. & Saxena, P.K. 2014. Cryptanalysis of vigenere cipher using cuckoo search. Applied Soft Computing 26: 315-324.
Bhowmick, A., Lal, A.V. & Ranjan, N. 2015. Enhanced 6x6 playfair cipher using double myszkowski transposition. International Journal of Engineering Research and Technology 4(7): 1100-1104.
Dharwiyanti, S. & Wahono, R.S. 2003. Pengantar unified modeling language (UML). (Online). http://setia.staff.gunadarma.ac.id/Downloads/files/6077/ Modul_UML.pdf (27 Juli 2016).
Fahrianto, F., Masruroh, S.U. & Ando, N.Z. 2014. Encrypted SMS application on android with combination of caesar cipher and vigenere algorithm. Proceedings of International Conference on Cyber and IT Management (CITSM), pp. 31-33.
Girsang, T.T. 2010. Analisis kerahasiaan data menggunakan algoritma vigenere cipher dalam sistem pengamanan data. Skripsi. Universitas Sumatera Utara.
Nacira, G. & Abdelaziz, A. 2005. Secured net-banking by θ-vigenere in syverson’s
protocol. Proceedings of 3rdACS/IEEE International Conference on Computer Systems and Applications, pp. 1-6.
Shabara, S. 2015. Enkripsi SMS pada smartphone berbasis android dengan metode vigenere dan transposisi kolom. Skripsi. Universitas Dian Nuswantoro Semarang.
Singh, G. & Supriya. 2013. Modified vigenere encryption algorithm and its hybrid implementation with base64 and AES. Proceedings of 2nd International Conference on Advanced Computing, Networking and Security (ADCONS), pp. 232-237.
Zarlis, M. & Handrizal. 2008. Algoritma dan Pemrograman: Teori dan praktik dalam Pascal. Edisi Kedua. USU Press: Medan.
BAB 3
ANALISIS DAN PERANCANGAN
3.1. Analisis Sistem
Analisis sistem adalah tahapan yang dilakukan untuk menguraikan sebuah sistem agar
mendapatkan gambaran tentang apa yang akan dirancang dan diimplementasikan pada
program. Dalam tugas akhir ini, ada tiga tahap analisis sistem yaitu : analisis masalah,
analisis persyaratan dan analisis proses.
3.1.1. Analisis masalah
Permasalahan yang akan diselesaikan pada sistem ini adalah mengamankan pesan dari
pihak ketiga yang tidak berhak mengetahui isi dari pesan dengan
mengimplementasikan kombinasi algoritma Vigenere cipher dan Myszkowski
transposition. Untuk mengidentifikasi masalah tersebut digunakan diagram Ishikawa
Gambar 3.1 Diagram Ishikawa
Berdasarkan Gambar 3.1, permasalahan yang dihadapi pada penelitian ini adalah
perlunya meningkatkan keamanan pesan dengan kombinasi algoritma kriptografi, dan
penyebab munculnya permasalahan tersebut terdiri dari beberapa kategori, yaitu
manusia, metode, material dan mesin.
Pada kategori manusia, masalah disebabkan oleh pengirim dan penerima ingin
merahasiakan pesan dan pihak ketiga melakukan penyadapan karena rasa ingin tahu.
Pada kategori metode, masalah disebabkan oleh panjang kunci dari algoritma
Vigenere cipher dapat diketahui karena kunci diulangi hingga sepanjang plaintext.
Pada kategori material, masalah disebabkan oleh pesan berbentuk teks rentan disadap
saat dikirimkan ke penerima. Pada kategori mesin, masalah disebabkan oleh perangkat
smartphone lebih mudah dibawa dibandingkan komputer dan belum adanya aplikasi
pada smartphone yang menggunakan kombinasi algoritma Vigenere cipher dan
Myszkowski transposition. Solusi yang ditawarkan adalah mengamankan pesan
dengan mengacak posisi huruf hasil enkripsi Vigenere cipher dengan menggunakan
16
3.1.2.1. Persyaratan fungsional
Kebutuhan fungsional menjelaskan proses-proses aktifitas yang dapat dilakukan oleh
sistem dan kebutuhan yang harus dipenuhi oleh sistem, yaitu:
1. Fungsi Enkripsi
Pengguna dapat melakukan proses enkripsi pesan dari plaintext menjadi
ciphertext dengan menggunakan kunci enkripsi yang telah dimasukkan.
2. Fungsi Dekripsi
Pengguna dapat melakukan proses dekripsi pesan dari ciphertext kembali
menjadi plaintext dengan menggunakan kunci yang telah dimasukkan.
3.1.2.2. Persyaratan non-fungsional
Persyaratan non-fungsional meliputi karakteristik berikut ini :
1. Performa
Sistem yang akan dibangun dapat menampilkan hasil enkripsi dan dekripsi.
2. Mudah dipelajari dan digunakan
Sistem yang akan dibangun memiliki tampilan sederhana dan user friendly
sehingga mudah dipelajari dan digunakan oleh pengguna.
3. Hemat Biaya
Sistem yang akan dibangun tidak membutuhkan perangkat pendukung
tambahan yang membutuhkan biaya yang besar.
4. Dokumentasi
Sistem yang akan dibangun dapat menyimpan data hasil proses.
5. Kontrol
Sistem akan menampilkan pemberitahuan bila pengguna salah atau tidak
lengkap memasukkan data input.
awal dilakukan kebalikan dari proses sebelumnya yaitu ciphertext didekripsi
menggunakan algoritma Myszkowski transposition, kemudian hasilnya didekripsi
dengan menggunakan algoritma Vigenere cipher. Proses enkripsi menggunakan kunci
yang sama dengan kunci dekripsi.
3.2. Pemodelan Sistem
Pemodelan (modeling) adalah proses merancang piranti lunak sebelum melakukan
pengkodean. Dengan menggunakan model, diharapkan pengembangan piranti lunak
dapat memenuhi semua kebutuhan pengguna dengan lengkap dan tepat (Dharwiyanti
& Wahono, 2003).
3.2.1. Unified Modeling Language (UML)
Unified modeling language adalah bahasa yang menjadi standar dalam industri untuk
visualisasi, merancang dan mendokumentasikan sistem piranti lunak (Dharwiyanti &
Wahono, 2003). Model UML yang digunakan pada penelitian ini antara lain adalah
use case diagram, activity diagram serta sequence diagram.
3.2.1.1. Use case diagram
Use case diagram merupakan penggambaran fungsionalitas yang diharapkan dari
sebuah sistem. Sebuah use case merepresentasikan sebuah interaksi antara aktor
dengan sistem (Dharwiyanti & Wahono, 2003). Adapun use case dari sistem yang
18
Gambar 3.2 Use Case Diagram
Pada gambar 3.2, digambarkan hanya ada seorang aktor yaitu pengguna.
Pengguna dapat menginput data, melakukan proses pengamanan dan pengungkapan.
Use case pengamanan dan pengungkapan membutuhkan pengecekan inputan agar
dapat dijalankan. Untuk lebih jelasnya, use case pengamanan dapat dilihat pada Tabel
3.1.
Tabel 3.1 Deskripsi Use Case Pengamanan
Name Pengamanan
Actors Pengguna
Description Proses memasukkan pesan asli dan kunci, kemudian melakukan
enkripsi menggunakan algoritma Vigenere dan Myszkowski, lalu
menampilkan hasilnya
Basic Flow Pengguna memasukkan pesan asli dan kunci, kemudian menekan
tombol enkripsi
Alternate Flow Pengguna memilih menu Pengungkapan
Pre Condition Pengguna telah membuka menu Pengamanan
Post Condition Pengguna mendapatkan pesan tersandi
Tabel 3.2 Deskripsi Use Case Pengungkapan
Name Pengungkapan
Actors Pengguna
Description Proses memasukkan pesan tersandi dan kunci, kemudian
melakukan dekripsi dengan algoritma Vigenere dan Myszkowski,
lalu menampilkan hasilnya
Basic Flow Pengguna memasukkan pesan tersandi dan kunci, kemudian
menekan tombol dekripsi
Alternate Flow Pengguna memilih menu Pengamanan
Pre Condition Pengguna telah memilih menu Pengungkapan
Post Condition Pengguna mendapatkan pesan asli
3.2.1.2. Activity diagram
Activity diagram merupakan penggambaran berbagai alir aktivitas dalam sistem yang
sedang dirancang, bagaimana alir awal, decision yang mungkin terjadi dan berakhir.
Diagram ini dapat dibagi menjadi beberapa object swimlane untuk menggambarkan
objek mana yang bertanggung jawab untuk aktivitas tertentu (Dharwiyanti & Wahono,
2003).
Gambar 3.3 menunjukkan activity diagram untuk proses pengamanan. Proses
dimulai dari pengguna memilih menu pengamanan dan sistem akan menampilkan
halaman pengamanan. Kemudian pengguna memasukkan pesan asli (plaintext), kunci
pertama (key1) dan kunci kedua (key2), lalu menekan tombol enkripsi. Sistem
melakukan pengecekan inputan, bila cek gagal maka proses selesai dan bila cek
sukses, sistem melakukan enkripsi plaintext menggunakan algoritma Vigenere cipher
20
Gambar 3.3 Activity Diagram Pengamanan
Gambar 3.4 menunjukkan activity diagram untuk proses pengungkapan.
Proses dimulai dari pengguna memilih menu pengungkapan dan sistem menampilkan
halaman pengungkapan. Kemudian pengguna memasukkan ciphertext2, key1 dan
key2, lalu menekan tombol dekripsi. Sistem melakukan pengecekan inputan, bila cek
gagal proses selesai dan bila cek sukses, sistem melakukan dekripsi ciphertext2
menggunakan algoritma Myszkowski transposition dengan key2 untuk menghasilkan
ciphertext1. Ciphertext1 selanjutnya didekripsi menggunakan algoritma Vigenere
cipher dengan key1 untuk menghasilkan plaintext, kemudian menampilkan hasilnya
Gambar 3.4 Activity Diagram Pengungkapan
3.2.1.3. Sequence diagram
Sequence diagram merupakan penggambaran skenario atau langkah-langkah yang
dilakukan sebagai respons dari sebuah event untuk menghasilkan output tertentu.
Sequence diagram terdiri dari waktu pada vertikal dan objek-objek yang terkait pada
horizontal (Dharwiyanti & Wahono, 2003). Sequence diagram dari proses
22
Gambar 3.5 Sequence Diagram Pengamanan
Pada Gambar 3.5 dapat dilihat bahwa pertama pengguna memasukkan
plaintext, key1 dan key2 pada pengamanan. Kemudian plaintext dan key1 digunakan
untuk dienkripsi menjadi ciphertext1. Ciphertext1 dienkripsi lagi menggunakan key2
untuk mendapatkan ciphertext2. Setelah itu, ciphertext2 ditampilkan kepada
pengguna. Sequence diagram dari proses pengungkapan dapat dilihat pada Gambar
3.6.
Pada Gambar 3.6 dapat dilihat bahwa pertama pengguna memasukkan
ciphertext2, key1 dan key2 pada pengungkapan. Kemudian ciphertext2 dan key2
digunakan untuk didekripsi menjadi ciphertext1. Ciphertext1 didekripsi lagi
menggunakan key1 untuk mendapatkan plaintext kembali. Setelah itu, plaintext
ditampilkan kepada pengguna.
3.2.2. Flowchart
Flowchart merupakan gambar atau bagan yang memperlihatkan urutan dan hubungan
antar proses beserta pernyataannya. Gambaran ini dinyatakan dengan simbol dan garis
penghubung. Flowchart berguna untuk memudahkan dalam melakukan pengecekan
bagian-bagian dalam analisis masalah (Zarlis & Handrizal, 2008).
3.2.2.1. Flowchart sistem
Flowchart sistem yaitu bagan dengan simbol tertentu yang menggambarkan urutan
prosedur dan proses suatu file dalam suatu media menjadi file di dalam media lain,
dalam suatu sistem pengolahan data (Zarlis & Handrizal, 2008). Flowchart dari sistem
24
Gambar 3.7 Flowchart Sistem
Pada Gambar 3.7 sistem dimulai dengan menentukan pilihan halaman menu, yaitu
menu pengamanan atau pengungkapan. Halaman pengamanan berfungsi untuk
mengenkripsi pesan asli menjadi pesan tersandi. Halaman pengungkapan berfungsi
untuk mendekripsikan pesan tersandi kembali menjadi pesan asli.
3.2.2.2. Flowchart program pengamanan
Flowchart program yaitu bagan dengan simbol-simbol tertentu yang menggambarkan
urutan proses dan hubungan antar proses secara mendetail di dalam suatu program
(Zarlis & Handrizal, 2008). Flowchart program pengamanan dapat dilihat pada
Gambar 3.8 Flowchart Pengamanan
3.2.2.3. Flowchart program pengungkapan
26
Gambar 3.9 Flowchart Pengungkapan
3.2.3. Pseudocode
Pseudocode adalah kode yang mirip dengan kode pemrogaman yang sebenarnya
seperti Pascal, atau C, sehingga lebih tepat digunakan untuk menggambarkan
algoritma yang akan dikomunikasikan kepada pemrogram (Zarlis & Handrizal, 2008).
3.2.3.1. Pseudocode enkripsi Vigenere
Pseudocode enkripsi Vigenere dapat dilihat pada Gambar 3.10.
Gambar 3.10 Pseudocode Enkripsi Vigenere
3.2.3.2. Pseudocode enkripsi Myszkowski
Pseudocode enkripsi Myszkowski dapat dilihat pada Gambar 3.11.
Kamus :
plaintext, key1, key, ciphertext1 : string pesan, i, j, k : integer
Algoritma :
Input (plaintext) Input (key1)
For (i=0; i<plaintext.length(); i++) j = i % key1.length()
key += key1.charAt(j) EndFor
For (i=0; i<plaintext.length(); i++) j = (int) plaintext.charAt(i) k = {int} key.charAt(i)
pesan = ((j-32) + (k-32)) % 95 pesan += 32
ciphertext += (char) pesan EndFor
28
Gambar 3.11 Pseudocode Enkripsi Myszkowski
3.2.3.3. Pseudocode dekripsi Myszkowski
Pseudocode dekripsi Myszkowski dapat dilihat pada Gambar 3.12.
Kamus :
ciphertext1, ciphertext2, key2 : string bar, kol, tmp, kecil, i, j, k : integer matrix[bar,kol] : array of char
Algoritma :
Input (ciphertext1) Input (key2)
tmp = 0
kol = key2.length()
bar = ceil(ciphertext1.length() / kol) For (i=0; i<bar i++)
For (j=0; j<kol; j++)
If (tmp < ciphertext1.length())
matrix[i,j] = ciphertext1.charAt(tmp)
While (ciphertext2.length() < ciphertext1.length()) For (i=0; i<kol; i++)
If (int.parse(key2.char(i)) > tmp) kecil = int.parse(key2.char(i)) break()
EndIf EndFor
For (i=0; i<kol; i++)
If (int.parse(key2.char(i)) > tmp & int.parse(key2.char(i) < kecil)
kecil = int.parse(key2.char(i)) EndIf
EndFor
For (i=0; i<bar; i++) For (j=0; j<kol; j++)
Kamus :
ciphertext1, ciphertext2, key2 : string bar, kol, tmp, kecil, i, j, k : integer matrix[bar,kol] : array of char
Algoritma :
bar = ceil(ciphertext2.length() / kol) While (k < ciphertext2.length())
For (i=0; i<kol; i++)
If (int.parse(key2.char(i)) > tmp) kecil = int.parse(key2.char(i)) break()
EndIf EndFor
For (i=0; i<kol; i++)
If (int.parse(key2.char(i)) > tmp & int.parse(key2.char(i) < kecil)
kecil = int.parse(key2.char(i)) EndIf
EndFor
For (i=0; i<bar; i++) For (j=0; j<kol; j++)
If (int.parse(key2.char(j)) == kecil)
If (i==bar-1 & j>=kol-((kol*bar)-ciphertext2.length())
Else
For (i=0; i<bar i++) For (j=0; j<kol; j++)
If (ciphertext1.length() < ciphertext2.length()) ciphertext1 += matrix[i,j]
EndIf EndFor EndFor
30
Gambar 3.13 Pseudocode Dekripsi Vigenere
3.3. Perancangan Antarmuka (Interface)
Perancangan antarmuka (interface) merupakan bagian yang penting dalam
membangun sebuah sistem. Antarmuka yang dirancang harus memperhatikan
kenyamanan dan kemudahan pengguna dalam menjalankan sistem.
3.3.1. Screen launcher
Screen launcher merupakan gambar yang muncul saat sistem dibuka pertama kali.
Screen launcher akan digunakan untuk menampilkan logo aplikasi saat sistem sedang
melakukan proses untuk menampilkan halaman pengamanan. Rancangan screen
launcher dapat dilihat pada Gambar 3.14.
Kamus :
ciphertext1, key1, key, plaintext : string pesan, i, j, k : integer
Algoritma :
Input (ciphertext1) Input (key1)
For (i=0; i<ciphertext1.length(); i++) j = i % key1.length()
key += key1.charAt(j) EndFor
For (i=0; i<ciphertext1.length(); i++) j = (int) ciphertext1.charAt(i) k = {int} key.charAt(i)
If (j >= k)
ciphertext += (char) pesan EndFor
Gambar 3.14 Rancangan Screen Launcher
3.3.2. Halaman pengamanan
Halaman pengamanan merupakan halaman yang ditampilkan setelah screen launcher.
Halaman ini akan digunakan untuk memasukkan plaintext, key1 dan key2, melakukan
proses enkripsi, serta menampilkan ciphertext2. Rancangan halaman Pengamanan
32
Gambar 3.15 Rancangan Halaman Pengamanan
Pada Gambar 3.15 ditunjukkan bahwa halaman pengamanan terdiri dari
beberapa komponen, yaitu Tab, Button, CheckBox, EditText dan TextView.
Keterangan komponen tersebut dapat dilihat pada Tabel 3.3.
Tabel 3.3 Keterangan Gambar Rancangan Halaman Pengamanan
No Keterangan
1 Tab Pengamanan untuk menampilkan halaman pengamanan
2 Tab Pengungkapan untuk menampilkan halaman pengungkapan
3 Button Bantuan untuk menampilkan halaman bantuan
4 Button Tentang untuk menampilkan halaman tentang
5 Button Reset untuk mengosongkan semua kolom masukkan
6 Button Enkripsi untuk memulai proses enkripsi
7 CheckBox Lihat Kunci 1 untuk menampilkan atau menyembunyikan key1
8 CheckBox Lihat Kunci 2 untuk menampilkan atau menyembunyikan key2
9 EditText Kunci 1 untuk memasukkan key1
3.3.3. Halaman pengungkapan
Halaman pengungkapan merupakan halaman yang ditampilkan saat pengguna
menekan Tab Pengungkapan. Halaman ini akan digunakan untuk memasukkan
ciphertext2, key1 dan key2, melakukan proses dekripsi serta menampilkan plaintext.
Rancangan halaman pengungkapan dapat dilihat pada Gambar 3.16
Gambar 3.16 Rancangan Halaman Pengungkapan
Pada Gambar 3.16 ditunjukkan bahwa halaman pengungkapan terdiri dari
beberapa komponen, yaitu Tab, Button, CheckBox, EditText dan TextView.
34
Tabel 3.4 Keterangan Gambar Rancangan Halaman Pengungkapan
No Keterangan
1 Tab Pengamanan untuk menampilkan halaman pengamanan
2 Tab Pengungkapan untuk menampilkan halaman pengungkapan
3 Button Bantuan untuk menampilkan halaman bantuan
4 Button Tentang untuk menampilkan halaman tentang
5 Button Reset untuk mengosongkan semua kolom masukkan
6 Button Dekripsi untuk memulai proses dekripsi
7 CheckBox Lihat Kunci 1 untuk menampilkan atau menyembunyikan key1
8 CheckBox Lihat Kunci 2 untuk menampilkan atau menyembunyikan key2
9 EditText Kunci 1 untuk memasukkan key1
10 EditText Kunci 2 untuk memasukkan key2
11 EditText Ciphertext untuk memasukkan ciphertext2
12 TextView Plaintext untuk menampilkan plaintext
3.3.4. Halaman bantuan
Halaman bantuan merupakan halaman yang ditampilkan saat pengguna menekan
Button Bantuan. Halaman ini akan digunakan untuk membantu pengguna dalam
Gambar 3.17 Rancangan Halaman Bantuan
Pada Gambar 3.17 ditunjukkan bahwa halaman bantuan terdiri dari beberapa
komponen, yaitu Button, TextView dan FrameLayout. Keterangan komponen tersebut
dapat dilihat pada Tabel 3.5.
Tabel 3.5 Keterangan Gambar Rancangan Halaman Bantuan
No Keterangan
1 Button Kembali untuk kembali ke halaman pengamanan
2 Button Penggunaan untuk memberikan informasi penggunaan aplikasi
3 Button Algoritma untuk memberikan informasi algoritma yang digunakan
4 TextView Judul untuk menampilkan judul halaman
5 TextView Bantuan untuk menampilkan informasi yang dipilih
36
Gambar 3.18 Rancangan Halaman Tentang
Pada Gambar 3.17 ditunjukkan bahwa halaman tentang terdiri dari beberapa
komponen seperti Button, TextView dan ImageView. Keterangan komponen tersebut
dapat dilihat pada Tabel 3.6.
Tabel 3.6 Keterangan Gambar Rancangan Halaman Tentang
No Keterangan
1 Button Kembali untuk kembali ke halaman pengamanan
2 TextView Judul untuk menampilkan judul halaman
4.1. Implementasi
Setelah sistem yang akan dibangun dianalisis dan dirancang, selanjutnya dilakukan
implementasi sistem tersebut menjadi sebuah program. Sistem dibangun
menggunakan Android Studio dengan bahasa pemrograman Java.
4.1.1. Implementasi pseudocode enkripsi Vigenere
Pada bagian ini pseudocode enkripsi Vigenere diimplementasikan ke dalam bahasa
Java. Berikut potongan source code proses enkripsi Vigenere dapat dilihat pada
Gambar 4.1.
Gambar 4.1 Potongan Source Code Enkripsi Vigenere
4.1.2. Implementasi pseudocode enkripsi Myszkowski
Pada bagian ini pseudocode enkripsi Myszkowski diimplementasikan ke dalam bahasa
Java. Berikut potongan source code proses enkripsi Myszkowski dapat dilihat pada for (i = 0; i < plaintext.length(); i++) {
j = i % key1.length(); key += key1.charAt(j); }
for (i = 0; i < plaintext.length(); i++) { j = (int) plaintext.charAt(i);
k = (int) key.charAt(i);
pesan = ((j - 32) + (k - 32)) % 95; pesan += 32;
38
Gambar 4.2 Potongan Source Code Enkripsi Myszkowski
4.1.3. Implementasi pseudocode dekripsi Myszkowski
Pada bagian ini pseudocode dekripsi Myszkowski diimplementasikan ke dalam bahasa
Java. Berikut potongan source code dekripsi Myszkowski dapat dilihat pada Gambar
4.3.
int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext1.length() / kol);
char[][] matrix = new char[bar][kol];
for (i = 0; i < bar; i++) {
for (j = 0; j < kol; j++) {
if (tmp < ciphertext1.length()) {
matrix[i][j] = ciphertext1.charAt(tmp);
while (ciphertext2.length() < ciphertext1.length()) {
for (i = 0; i < kol; i++) {
if (Integer.parseInt(key2.charAt(i) + "") > tmp) { kecil = Integer.parseInt(key2.charAt(i) + "");
break; }
}
for (i = 0; i < kol; i++) {
if (Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {
kecil = Integer.parseInt(key2.charAt(i) + ""); }
}
for (i = 0; i < bar; i++) {
for (j = 0; j < kol; j++) {
if (Integer.parseInt(key2.charAt(j) + "") == kecil && matrix[i][j] != Character.MIN_VALUE) {
Gambar 4.3 Potongan Source Code Dekripsi Myszkowski
4.1.4. Implementasi pseudocode dekripsi Vigenere
int kol = key2.length(), bar = (int) Math.ceil((double) ciphertext2.length()/kol);
char[][] matrix = new char[bar][kol];
while(k < ciphertext2.length()) {
for(i=0; i<kol; i++) {
if(Integer.parseInt(key2.charAt(i) + "") > tmp) { kecil = Integer.parseInt(key2.charAt(i) + "");
break; }
}
for(i=0; i<kol; i++) {
if(Integer.parseInt(key2.charAt(i) + "") > tmp && Integer.parseInt(key2.charAt(i) + "") < kecil) {
kecil = Integer.parseInt(key2.charAt(i) + ""); }
}
for(i=0; i<bar; i++){
for(j=0; j<kol; j++){
if(Integer.parseInt(key2.charAt(j)+"") == kecil){
if(i == bar-1 && j >= kol-((bar*kol)-ciphertext2.length())){
for(i=0; i<bar; i++){
for(j=0; j<kol; j++){
if(ciphertext1.length() < ciphertext2.length()){ ciphertext1 += matrix[i][j];
40
Gambar 4.4 Potongan Source Code Dekripsi Vigenere
4.1.5. Implementasi enkripsi Vigenere cipher
Pada bagian ini dijelaskan proses implementasi algoritma Vigenere cipher pada
enkripsi. Sebelum melakukan enkripsi, kunci yang digunakan terlebih dahulu diulangi
hingga memiliki panjang yang sama dengan plaintext. Sebagai contoh digunakan
plaintext“FAISAL RIDHO” dengan key1 “ILKOM” dan key2 “7414”.
4.1.5.1. Proses pengulangan kunci
Pada proses ini, key1 diulangi hingga memiliki panjang yang sama dengan plaintext.
Berikut adalah proses pengulangan kunci untuk algoritma Vigenere cipher :
plaintext : “FAISAL RIDHO“
key1 : “ILKOM”
key : “ILKOMILKOMIL”
Keterangan :
plaintext = pesan yang akan dienkripsi
key1 = kunci yang digunakan untuk algoritma Vigenere cipher for(i=0; i<ciphertext1.length(); i++){
j = i % key1.length(); key += key1.charAt(j); }
for(i=0; i<ciphertext1.length(); i++){
j = (int) ciphertext1.charAt(i); k = (int) key.charAt(i);
if(j >= k) {
pesan = ((j - 32) - (k - 32)) % 95; }
else{
pesan = ((j - 32) + 95 - (k - 32)) % 95; }
pesan += 32;
4.1.5.2. Proses pengubahan karakter menjadi ASCII
Pada proses ini plaintext dan key1 diubah menjadi ASCII. Tabel ASCII yang
digunakan untuk mengubah karakter menjadi ASCII ditunjukkan pada Tabel 4.1.
Tabel 4.1 Tabel ASCII
Char ASCII Char ASCII Char ASCII Char ASCII Char ASCII
(spasi) 32 3 51 F 70 Y 89 l 108
! 33 4 52 G 71 Z 90 m 109
“ 34 5 53 H 72 [ 91 n 110
# 35 6 54 I 73 \ 92 o 111
$ 36 7 55 J 74 ] 93 p 112
% 37 8 56 K 75 ^ 94 q 113
& 38 9 57 L 76 _ 95 r 114
‘ 39 : 58 M 77 ` 96 s 115
( 40 ; 59 N 78 a 97 t 116
) 41 < 60 O 79 b 98 u 117
* 42 = 61 P 80 c 99 v 118
+ 43 > 62 Q 81 d 100 w 119
, 44 ? 63 R 82 e 101 x 120
- 45 @ 64 S 83 f 102 y 121
. 46 A 65 T 84 g 103 z 122
/ 47 B 66 U 85 h 104 { 123
0 48 C 67 V 86 i 105 | 124
1 49 D 68 W 87 j 106 } 125
2 50 E 69 X 88 k 107 ~ 126
42
4.1.5.3. Proses enkripsi Vigenere cipher
Pada proses ini plaintext dienkripsi menjadi ciphertext1 dengan menggunakan kunci
yang telah diulangi. Pada penelitian ini, pesan yang digunakan terdiri dari 95 karakter
ASCII dari 32 hingga 126, sehingga rumus yang digunakan untuk proses enkripsi
yaitu :
− 32 = ( − 32) + ( − 32) 95 atau dapat juga ditulis :
= (( − 32) + ( − 32) 95) + 32 proses enkripsi dilakukan sebagai berikut :
= ((70 − 32) + (73 − 32) 95) + 32 = 111
4.1.5.4. Proses pengubahan ASCII menjadi karakter
Pada proses ini angka ASCII diubah kembali menjadi karakter sesuai Tabel 4.1.
Berikut adalah proses pengubahan menjadi karakter : = 111=‘o’
= 109= ‘m’
= 116= ‘t’
= 35= ‘#’
= 120= ‘x’
= 113= ‘q’
= 113= ‘q’
= 123= ‘{‘
sehingga diperoleh ciphertext1“omt#nuL}xqq{“.
4.1.6. Implementasi enkripsi Myszkowski transposition
Pada bagian ini dijelaskan proses implementasi algoritma Myszkowski transposition
pada enkripsi. Pesan yang akan dienkripsi yaitu ciphertext1 hasil dari enkripsi
algoritma Vigenere cipher. Sebelum melakukan enkripsi, ciphertext1 terlebih dahulu
disusun menjadi sebuah matriks.
4.1.6.1. Proses penyusunan matriks
Pada proses ini ciphertext1“omt#nuL}xqq{“disusun menjadi matriks dengan panjang
kolom sama dengan panjang key2 “7414”. Sedangkan panjang baris sama dengan
pembulatan ke atas dari panjang ciphertext1 setelah dibagi dengan panjang kolom.
Berikut adalah proses penyusunan matriks :
kolom = panjang key2 = 4
baris =12 4⁄ = 3
ciphertext1 disusun perbarisnya atau dari kiri ke kanan. Matriks enkripsi ciphertext1
dapat dilihat pada Tabel 4.2.
Tabel 4.2 Tabel Matriks Enkripsi
7 4 1 4
44
4.1.7. Implementasi dekripsi Myszkowski Transposition
Pada bagian ini dijelaskan proses implementasi algoritma Myszkowski transposition
pada dekripsi. Pesan yang akan didekripsi yaitu ciphertext2 hasil dari enkripsi
algoritma Myszkowski transposition. Proses dekripsi.dilakukan dengan menyusun
ciphertext2 kembali menjadi matriks terlebih dahulu.
4.1.7.1. Proses penyusunan matriks
Pada proses ini ciphertext2“tLqm#u}q{onx”disusun menjadi matriks dengan panjang
kolom sama dengan panjang key2 “7414”. Sedangkan panjang baris sama dengan
pembulatan ke atas dari panjang ciphertext1 setelah dibagi dengan panjang kolom.
Berikut adalah proses penyusunan matriks :
kolom = panjang key2 = 4
baris =12 4⁄ = 3
Ciphertext2 diisi satu-persatu ke dalam matriks perkolomnya sesuai kunci dari
yang terkecil hingga terbesar. Untuk angka yang sama ditulis dari kiri ke kanan.
Berikut ini adalah proses penyusunan matriks dekripsi.
Ciphertext2“tLq”disusun dari atas ke bawah pada kolom 3 atau kolom kunci
1 terlebih dahulu. Proses ini ditunjukkan pada Tabel 4.3.
Tabel 4.3 Tabel Matriks Dekripsi Tahap 1
7 4 1 4
t
L
q
Kemudian, ciphertext2 “m#u}q{” disusundari kiri ke kanan pada kolom 2 dan
Tabel 4.4 Tabel Matriks Dekripsi Tahap 2
7 4 1 4
m t #
u L }
q q {
Selanjutnya, ciphertext2 yang tersisa “onx” disusun dari atas ke bawah pada
kolom 1 atau kolom kunci 7. Proses ini ditunjukkan pada Tabel 4.5.
Tabel 4.5 Tabel Matriks Dekripsi Tahap 3
7 4 1 4
o m t #
n u L }
x q q {
4.1.7.2. Proses dekripsi Myszkowski transposition
Pada proses ini dilakukan pembacaan matriks setelah matriks disusun seperti Tabel
4.5. Pembacaan matriks dilakukan perbarisnya atau dari kiri ke kanan, sehingga
diperoleh ciphertext1“omt#nuL}xqq{“.
4.1.8. Implementasi dekripsi Vigenere cipher
Pada bagian ini dijelaskan proses implementasi algoritma Vigenere cipher pada
dekripsi. Sebelum melakukan enkripsi, kunci yang digunakan terlebih dahulu diulangi
hingga memiliki panjang yang sama dengan ciphertext1.
46
Keterangan :
ciphertext1 = pesan yang akan didekripsi
key1 = kunci yang digunakan untuk algoritma Vigenere cipher
key = key1 yang telah diulangi hingga sepanjang plaintext
4.1.8.2. Proses pengubahan karakter menjadi ASCII
Pada proses ini plaintext dan key1 diubah menjadi ASCII. Berikut adalah proses
pengubahan karakter ciphertext1 dan key1 menjadi ASCII sesuai Tabel 4.1.
= ‘o’ = 111 = ‘I’ = 73
4.1.8.3. Proses dekripsi Vigenere cipher
Pada proses ini ciphertext1 didekripsi menjadi plaintext dengan menggunakan kunci
yang telah diulangi. Rumus yang digunakan untuk proses dekripsi yaitu : − 32 = ( − 32) − ( − 32) 95; untuk ≥
− 32 = ( − 32) + 95 − ( − 32) 95; untuk <
atau dapat juga ditulis :
= (( − 32) − ( − 32) 95) + 32; untuk ≥
= (( − 32) + 95 − ( − 32) 95) + 32; untuk <
= (113 − 32) − (77 − 32) 95 + 32 = 68 = (113 − 32) − (73 − 32) 95 + 32 = 72 = (123 − 32) − (76 − 32) 95 + 32 = 79
4.1.8.4. Proses pengubahan ASCII menjadi karakter
Pada proses ini angka ASCII diubah kembali menjadi karakter sesuai Tabel 4.1.
Berikut adalah proses pengubahan menjadi karakter :
= 70 =‘F’
= 65 =‘A’
= 73 =‘I’
= 83 =‘S’
= 65 =‘A’
= 76 =‘L’
= 32 = (spasi)
= 82 =‘R’
= 73 =‘I’
= 68 =‘D’
= 72 =‘H’
= 79 =‘O’
sehingga diperoleh plaintext“FAISAL RIDHO”.
4.2. Pengujian
Setelah dilakukan perancangan dan implementasi, selanjutnya sistem harus diuji.
Pengujian dilakukan dengan menggunakan Black Box Testing. Black Box Testing
48
Tabel 4.6 Pengujian Screen Launcher
Jenis
Black
Box
Pengujian Hasil yang
diharapkan
Hasil Pengujian Keterangan
Behavior
Testing
Membuka
dan
menutup
aplikasi
secara
berulang-ulang
Screen
launcher
ditampilkan
sebelum
halaman
pengamanan
terbuka
Diterima
4.2.2. Pengujian halaman pengamanan
Pengujian pada halaman pengamanan dilakukan dengan menggunakan jenis Black
Box Testing yaitu Limit Testing, Sample Testing dan Robustness Testing. Pengujian
dilakukan untuk mengetahui apakah aplikasi telah mampu melakukan pengamanan
dan mampu mengatasi error akibat kesalahan inputan. Hasil pengujian pada halaman
Tabel 4.7 Pengujian Halaman Pengamanan
Jenis
Black
Box
Pengujian Hasil yang
diharapkan
Hasil Pengujian Keterangan
Limit
Testing
Panjang
kunci1 =
(panjang
plaintext
- 1)
Sistem
melakukan
pengamanan
dan
menampilkan
hasilnya
Diterima
Panjang
kunci1 =
panjang
plaintext
Sistem
melakukan
pengamanan
dan
menampilkan
hasilnya
50
Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan)
52
Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan)
Tabel 4.7 Pengujian Halaman Pengamanan (lanjutan)
Kunci1
tidak
diinput
Sistem
menampilkan
pemberitahuan
“Input Tidak
Boleh
Kosong”
Diterima
Kunci2
tidak
diinput
Sistem
menampilkan
pemberitahuan
“Input Tidak
Boleh
Kosong”
Diterima
54
Tabel 4.8 Pengujian Halaman Pengungkapan
Jenis
Black
Box
Pengujian Hasil yang
diharapkan
Hasil Pengujian Keterangan
Limit
Testing
Panjang
kunci1 =
(panjang
plaintext
- 1)
Sistem
melakukan
pengamanan
dan
menampilkan
hasilnya
Diterima
Panjang
kunci1 =
panjang
plaintext
Sistem
melakukan
pengamanan
dan
menampilkan
hasilnya
56
Tabel 4.8 Pengujian Halaman Pengungkapan (lanjutan)
58
Tabel 4.8 Pengujian Halaman Pengungkapan (lanjutan)
Kunci1
tidak
diinput
Sistem
menampilkan
pemberitahuan
“Input Tidak
Boleh
Kosong”
Diterima
Kunci2
tidak
diinput
Sistem
menampilkan
pemberitahuan
“Input Tidak
Boleh
Kosong”
Diterima
4.2.4. Pengujian halaman bantuan
Pengujian pada halaman bantuan dilakukan dengan menggunakan salah satu jenis
Black Box Testing yaitu Behavior Testing. Pengujian dilakukan untuk memeriksa
apakah komponen-komponen pada halaman bantuan telah berfungsi dengan baik dan
menampilkan informasi dengan benar. Hasil pengujian pada halaman bantuan dapat
60
apakah komponen-komponen pada halaman tentang telah berfungsi dengan baik.
Hasil pengujian pada halaman tentang dapat dilihat pada Tabel 4.10.
Tabel 4.10 Pengujian Halaman Tentang
Jenis
Black
Box
Pengujian Hasil yang
diharapkan
Hasil Pengujian Keterangan
Behavior
Testing
Membuka
halaman
tentang
Sistem
menampilkan
informasi
pembuat
aplikasi
Diterima
4.2.6. Pengujian keamanan
Pada bagian ini, ciphertext2 hasil enkripsi kombinasi algoritma Vigenere cipher
dibandingkan dengan ciphertext hasil enkripsi dengan algoritma Vigenere cipher saja.
Pengujian ini dilakukan untuk mengetahui apakah kombinasi menggunakan algoritma
Myszkowski transposition dapat menutupi kelemahan dari algoritma Vigenere cipher
yaitu dapat ditebaknya panjang kunci dari frekuensi deretan huruf yang sering muncul,
sehingga dapat meningkatkan keamanan pada pesan.
4.2.6.1. Pengujian Vigenere cipher
penyadap berhasil mendapatkan seluruh ciphertext hasil enkripsi algoritma Vigenere
cipher sebagai berikut :
,iyCj|fTit1A)rH,iyCn$p,hzWb#gH,iyqH+vwnH,iyCv|d)dzeAuwH,iyCv!h|wH,iyCj|fTh
i,AuqlWt!hm(O
1. Tentukan kriptogram yang berulang. Salah satu kriptogram yang sering
munculyaitu “,iy”.
2. Hitung jarak antar kriptogram yang berulang, seperti ditunjukkan pada Tabel
4.11.
Tabel 4.11 Deretan Huruf Berulang Vigenere
Kriptogram Berulang“,iy” Posisi Ditemukan Jarak
ke-1 dan ke-2 1 dan 16 15
ke-2 dan ke-3 16 dan 31 15
ke-3 dan ke-4 31 dan 41 10
ke-4 dan ke-5 41 dan 56 15
ke-5 dan ke-6 56 dan 66 10
3. Hitung faktor pembagi dari jarak tersebut :
Faktor pembagi 10 = {2, 5, 10}
Faktor pembagi 15 = {3, 5, 15}
62
yang sering digunakan yaitu “THE”, sehingga sementara diasumsikan bahwa “,jy”
adalah ciphertextdari “THE”.
,iyCj |fTit 1A)rH ,iyCn $p,hz Wb#gH ,iyqH +vwnH ,iyCv |d)dz
eAuwH ,iyCv !h|wH ,iyCj |fThi ,Auql Wt!hm (O
sebelumnya diketahui bahwa :
− 32 = ( − 32) − ( − 32) 95; untuk ≥
− 32 = ( − 32) + 95 − ( − 32) 95; untuk <
sehingga untuk menghitung dilakukan dengan rumus : ( − 32) = ( − 32) − ( − 32 ) 95; untuk ≥
( − 32) = ( − 32) + 95 − ( − 32 ) 95; untuk <
atau dapat ditulis :
= (( − 32) − ( − 32 ) 95) + 32; untuk ≥
= (( − 32) + 95 − ( − 32 ) 95) + 32; untuk <
Kemudian dihitung , dan untuk mengetahui tiga karakter pertama pada kunci.
= (44 − 32) + 95 − (84 − 32 ) 95 + 32 = 87 =‘W’
= (105 − 32) − (72 − 32 ) 95 + 32 = 65 =‘A’
= (121 − 32) − (69 − 32 ) 95 + 32 = 84 =‘T’
Setelah ditemukan tiga karakter pertama pada kunci, selanjutnya karakter ke-6,
ke-7 dan ke-8 lalu ke-11, ke-12, ke-13 ciphertext dan seterusnya selain “,iy”
didekripsi dengan menggunakan kunci “WAT”.
= (124 − 32) − (87 − 32 ) 95 + 32 = 69 =‘E’
= (102 − 32) − (65 − 32 ) 95 + 32 = 69 =‘E’
= (84 − 32) − (84 − 32 ) 95 + 32 = 32 =‘(sp)’
= (49 − 32) + 95 − (87 − 32 ) 95 + 32 = 89 =‘Y’