LAMPIRAN A: LISTING PROGRAM
//c++ code dari Algoritma IDEA //////////////////////////////////////////////////////// // // Proyek untuk mendukung skripsi dengan judul: // Perancangan dan Implmentasi Sistem Keamanan Data Menggunakan // Algoritma Kriptografi Simetri IDEA (International Data Encryption // Algorithm) // // // Oleh // Nama : Dewi Try Agustina // NIM : 041401015 // // gambaran ikhtisar : Program ini melakukan proses berikut ini: // - menampilkan semua subkunci-subkunci enkripsi dan // dekripsi yang digunakan pada proses enkripsi dan dekripsi // - mengenkripsi pesan plainteks // - mendekripsi pesan cipherteks // - menampilkan perincian hasil round demi round // (totalnya 8 putaran) // // Program berisi menu pengarahan user, dimana user dapat memilih // kunci inisial 128-bit dan juga memilih pesan untuk dienkripsi // dan didekripsi. // // Peng-Compile-an : Program ini telah diuji untuk bekerja pada // Windows XP OS dengan menggunakan kompiler g++ (flop.engr.orst.edu) // Untuk mengompile: g++ Idea.cpp -o Idea.exe // // // Catatan : Program ini sedikit tidak rapi. Pengkodean dapat dibuat // lebih efisien. // // Pemakaian : Run dapat dieksekusi tanpa argumen: Idea.exe // Lalu pilihlah pilihan menu yang tepat. // // ////////////////////////////////////////////// // main() ada di dasar file !
#include #include #include #include #include
<stdio.h>
<stdlib.h> <string>
//global #define NUMSUBKEYS 52 #define NUMROUNDS 8 #define MAXINPUTSIZE 32
Universitas Sumatera Utara
// jika menggunakan #define dengan // angka-angka ini, akan timbul masalah // ketika diambil mod dari angka-angka ini. unsigned int TWOPOWER16 = 65536; unsigned int TWOPOWER161 = 65537; unsigned int inputsize; // semua unsigned unsigned unsigned unsigned
informasi subkunci short esubkeys[NUMSUBKEYS]; short dsubkeys[NUMSUBKEYS]; int origkeyint[4]; char origkeychar[17];
//*************************************************** // argumen adalah array dari karakter dan menampilkan // nilai hex dari 4 karakter bertalian (4 byte) // dimulai pada pointer. pointer itu mengulang // sampai semua bit pada string asli dibaca //*************************************************** void printHex (unsigned char* start) { unsigned int* val = (unsigned int*)start; int times = inputsize/4; cout <<endl; for (int i=0; i
sampai
%03d:
//**************************************** // Ini adalah inti mesin enkripsi dan dekripsi yang // melakukan semua putaran dan melakukan semua operasi aritmatik // add,mult,xor,swap,invers) //**************************************** void runIdea(unsigned char* msg, short* keysbit16,int writeflag) {
unsigned
char*
outmsg,unsigned
//if writeflag is 1, then we print round by round results
unsigned unsigned unsigned unsigned unsigned unsigned
short x1,x2,x3,x4; short y1,y2,y3,y4; short x5,x6,x7,x8,x9,x10; short x11,x12,x13,x14; short xtemp; int writeint;
// msg adalah 1 byte. buat 2 byte ptr untuk memfasilitasi pengkopian untuk // bidang 16 bit // 2 byte ke x1, 2 byte ke x2,dsb.
Universitas Sumatera Utara
unsigned short* msgbit16 = (unsigned short*) msg; //cout << "msg is " << *msg <<endl; x1 = *msgbit16++; x2 = *msgbit16++; x3 = *msgbit16++; x4 = *msgbit16++;
//x1 //x2 //x3 //x4
= = = =
(x1 (x2 (x3 (x4
>>8) >>8) >>8) >>8)
| | | |
(x1<<8); (x2<<8); (x3<<8); (x4<<8);
// ini untuk men-debug maksud. // membuat lebih hebat dari 8 jika tidak ingin debug int tst=9;
// adalah // //
catatan bahwa mod 2^16+1 dapat menghasilkan nilai yang mana 2^16. ini lebih besar dari ruang untuk 16 bit, jadi operasi mod membuat 2^16 mod 2^16+1 sama dengan 0.
for (int i=0; i
//IY if (i==tst ) cout << "LANGKAH 2: " << *keysbit16 << endl;
x2 adalah " << x2 << ", kunci adalah
//LANGKAH 2 dari 14 x2 = (x2 + *keysbit16++) % TWOPOWER16; //IY if (i==tst ) cout << "\tSetelah add, x2 adalah " << x2 << endl; //IY if (i==tst ) cout << "LANGKAH 3: x3 adalah " << x3 << ", kunci adalah " << *keysbit16 << endl; //LANGKAH 3 dari 14 x3 = (x3 + *keysbit16++) % TWOPOWER16; //IY if (i==tst ) cout << "\tSetelah add, x3 adalah " << x3 << endl;
Universitas Sumatera Utara
//IY if (i==tst ) cout << "LANGKAH 4: " << *keysbit16 << endl;
x4 adalah " << x4 << ", kunci adalah
//LANGKAH 4 dari 14 x4 = (x4* (*keysbit16++)) % TWOPOWER161; //IY if (i==tst ) cout << "\tSetelah mul, x4 adalah " << x4 << endl; //IY if (i==tst) cout << "LANGKAH 5: << x1 << endl;
x3 adalah " << x3 << ", x1 adalah "
//LANGKAH 5 dari 14 x5 = x1^x3; if (i==tst) cout << "\tSetelah XOR, x5 adalah " << x5 << endl; //IY if (i==tst) cout << "LANGKAH 6(outorder): adalah " << x4 << endl;
x2 adalah " << x2 << ", x4
//LANGKAH 6 dari 14 x6 = x2^x4; //IY if (i==tst) cout << "\tSetelah XOR, x6 adalah " << x6 << endl; //IY if (i==tst) cout << "LANGKAH 7(outorder): kunci adalah " << *keysbit16 << endl;
x5 adalah " << x5 << ",
//LANGKAH 7 dari 14 x7 = (x5* (*keysbit16++)) % TWOPOWER161; if (i==tst) cout << "\tSetelah mul, x7 adalah " << x7 << endl; //IY if (i==tst) cout << "LANGKAH 8: << x7 << endl;
x6 adalah " << x6 << ", x7 adalah "
//LANGKAH 8 dari 14 x8 = (x6+x7) % TWOPOWER16; //IY if (i==tst) cout << "\tSetelah ADD, x8 adalah " << x8 << endl; //IY if (i==tst) cout << "LANGKAH 9: " << *keysbit16 << endl;
x8 adalah " << x8 << ", kunci adalah
Universitas Sumatera Utara
//LANGKAH 9 dari 14 x9 = (x8* (*keysbit16++)) % TWOPOWER161; //IY if (i==tst) cout << "\tSetelah mul, x9 adalah " << x9 << endl; //IY if (i==tst) cout << "LANGKAH 10: << x9 << endl;
x7 adalah " << x7 << ", x9 adalah "
//LANGKAH 10 dari 14 x10 = (x7+x9) % TWOPOWER16; //IY if (i==tst) cout << "\tSetelah add, x10 adalah " << x10 << endl; //LANGKAH 11,12,13,14 dari 14 x11=x1^x9; x12=x3^x9; x13=x2^x10; x14=x4^x10;
if (i==tst ) { cout << "\tLANGKAH 11: cout << "\tLANGKAH 12: x12 << endl; cout << "\tLANGKAH 13: x13 << endl; cout << "\tLANGKAH 14: }
Setelah XOR, x11 adalah " << x11 << endl; Setelah XOR, x12(Setelah swap) adalah " << Setelah XOR, x13(Setelah swap) adalah " << Setelah XOR, x14 adalah " << x14 << endl;
//nilai baru untuk iterasi berikutnya x1=x11; x2=x12; x3=x13; x4=x14; if (writeflag==1) { printf ("ROUND %d:\n", i+1); writeint = (x1<<16) + x2; printf("\tBit 1 sampai 32 0x%08x\n",writeint); writeint = (x3<<16) + x4; printf("\tBit 33 sampai 64 0x%08x\n\n",writeint); } } // untuk setiap putaran
// transformasi output terakhir. modifikasi 4 subkunci seperti berikut: y1 = (x11 * (*keysbit16++)) % TWOPOWER161; //flip flop kedua y (y1 & y2) berikut !! y3 = (x13 + *keysbit16++) % TWOPOWER16; y2 = (x12 + *keysbit16++) %TWOPOWER16; y4 = (x14 * (*keysbit16)) % TWOPOWER161; // letakkan data baru ke dalam buffer msgbit16=(unsigned short*)outmsg;
Universitas Sumatera Utara
*msgbit16++ *msgbit16++ *msgbit16++ *msgbit16 =
= y1; = y3; = y2; y4;
//*msgbit16++ //*msgbit16++ //*msgbit16++ //*msgbit16 =
= (y1 >>8) = (y3 >>8) = (y2 >>8) (y4 >>8) |
| (y1<<8); | (y3<<8); | (y2<<8); (y4<<8);
if (writeflag==1) { unsigned int tempint; printf ("SETELAH TRANSFORMASI OUTPUT DAN SWAP:\n"); msgbit16=(unsigned short*)outmsg; tempint = (y1 <<16) + y3; printf("\tBit 1 sampai 32 0x%08x\n",tempint); tempint = (y2 <<16) + y4; printf("\tBit 33 sampai 64 0x%08x\n",tempint); } } // akhir runIdea
//**************************************** // setiap blok terdiri dari 8 byte (64 bit), jadi // dilakukan loop sampai semua blok telah dienkripsi, // pada dasarnya menangani kerja runIdea //**************************************** void encrypt (unsigned char* msg,unsigned char* outmsg,int writeflag) { int blocks = inputsize/8; unsigned char* inptr=msg; unsigned char* outptr=outmsg; for(int i=0;i
Universitas Sumatera Utara
inptr+=8; outptr+=8; } } //akhir dekripsi
//******************************************* // mencari invers dari angka 16 bit mod 2^16+1 // menggunakan algoritma extended euclidean //******************************************* //unsigned short inv(unsigned short b) short inv(unsigned short b) { // sesuai dengan yang dikatakan buku jika mengambil mod 0 atau 1 if (b==0 || b==1) return b; // inisial variabel int a = 65536+1; // 2^16 + 1 int g0 = a; int g1 = b; int v0 = 0; int v1 = 1; int savev0; int q; int rem; int numloops = 0; // memulai algoritma extended euglidean while (g1 != 0) { numloops++; q = g0/g1; rem = g0 % g1; g0=g1; g1 = rem; savev0=v0; v0 = v1; v1 = savev0 - (v1*q); } assert (g0==1); // PENTING - jika diakhiri dengan angka negatif, // untuk beberapa alasan, positifnya ekivalen dengan 1. // jadi tambahkan 1 untuk mendapatkan nilainya jika hasil negatif ditemukan. if (v0 >1) return v0; else return 1+v0; } // akhir inv
//****************************************** // Menampilkan 128 bit kunci asli dalam hex //****************************************** void printOrigKey() {
Universitas Sumatera Utara
printf printf printf printf printf
("Kunci asli dalam ("\tKunci asli 1st ("\tKunci asli 2nd ("\tKunci asli 3rd ("\tKunci asli 4th
teks : %s\n\n",origkeychar); 32bits: 0x%08x\n",origkeyint[0]); 32bits: 0x%08x\n",origkeyint[1]); 32bits: 0x%08x\n",origkeyint[2]); 32bits: 0x%08x\n",origkeyint[3]);
} //********************************************* // Menampilkan 52 subkunci yg digunakan untuk // enkripsi dan dekripsi //********************************************* void printKeys() { int count=1; cout << "\n\n***** IKHTISAR SUBKUNCI ENKRIPSI DAN DEKRIPSI *****" <<endl; cout << endl << "Semua subkunci adalah sepanjang 16-bit " <<endl<<endl; printOrigKey(); for (int k=0; k
}// akhir printKeys //**************************************** // bergantung pada 52 subkunci enkripsi, // untuk menemukan 52 subkunci dekripsi (16 bit) //**************************************** void calcDKeys () { //*** 1st,4th subkunci untuk setiap round for (int i=0;i
//*** 2nd, 3rd subkunci untuk setiap round dsubkeys[1] = -1 * esubkeys[49]; //first round dsubkeys[2] = -1 * esubkeys[50]; //first round for (int i =7; i
Universitas Sumatera Utara
//*** 5th, 6th subkunci untuk setiap round for (int i=4; i< (NUMSUBKEYS) ; i+=6) { dsubkeys[i] = esubkeys[50-i]; dsubkeys[i+1] = esubkeys[51-i]; }
int count=1; for (int k=0; k
//**************************************** // mengambil 128 bit kunci asli yang dilewati // sebagai array byte dan menghitung subkunci // enkripsi (totalnya 52 subkunci - 16 bit) //**************************************** void calcEKeys(unsigned char* userkey) { //kunci dari contoh //char userkey[16]; //for(int i=0; i<16; i++) //userkey[i] = i+1;
int firstbyte = 0;
// Gabungkan kedua bagian 8-bit menjadi satu 16 bit!!! // Hal ini dilakukan dengan pergeseran bit-bit. // Sebagian besar logika dari fungsi ini disebabkan hal ini.
for (int j=0; j<8;j++) { esubkeys[j] = (userkey[firstbyte] userkey[firstbyte+1]; firstbyte = firstbyte+2; }
<<8)
+
for (int f=8; f>7)); }
((esubkeys[f+n-7]
<<9)
|
Universitas Sumatera Utara
// 2 esubkeys berikutnya esubkeys[f+6] = (short) (esubkeys[f+6-6-8]>>7)); esubkeys[f+7] = (short) (esubkeys[f+7-6-8]>>7)); }
((esubkeys[f+6-7]
<<9)
|
((esubkeys[f+7-7-8]
<<9)
|
// subkunci 48-51 esubkeys[NUMSUBKEYS-4] = (short) ((esubkeys[NUMSUBKEYS-4-7] <<9) | (esubkeys[NUMSUBKEYS-4-6] >>7)); esubkeys[NUMSUBKEYS-4+1] = (short) ((esubkeys[NUMSUBKEYS-4+1-7] <<9) | (esubkeys[NUMSUBKEYS-4+1-6] >>7)); esubkeys[NUMSUBKEYS-4+2] = (short) ((esubkeys[NUMSUBKEYS-4+2-7] <<9) | (esubkeys[NUMSUBKEYS-4+2-6] >>7)); esubkeys[NUMSUBKEYS-4+3] = (short) ((esubkeys[NUMSUBKEYS-4+3-7] <<9) | (esubkeys[NUMSUBKEYS-4+3-6] >>7));
int count=1; for (int k=0; k
//**************************************** // keadaan bahwa program telah dimulai. //**************************************** void promptWelcome() { if (sizeof(unsigned short)!=2){ cout <<" Ukuran unsigned short bukan 2 byte. Silakan run pada flop.engr.orst.edu atau pada mesin lain. Program ini membutuhkan 2 byte untuk unsigned short untuk mensimulasikan subkunci 16-bit " <<endl; exit(0); } cout cout <<endl; cout cout cout <<endl; cout cout <<endl; cout cout <<endl; cout cout cout cout <<endl;
<< endl <<endl; << "***************
SELAMAT
DATANG
******************"
<< "Ini adalah Program Pendukung Skripsi" <<endl<<endl; << "Implementasi Sistem Keamanan Data" <<endl; << "Dengan Menggunakan Algoritma Kriptografi Simetri" << "IDEA (International Data Encryption Algorithm)" <<endl; << "*************************************************" << "oleh " <<endl; << "*************************************************" << "Nama : Dewi Try Agustina" <<endl; << "NIM : 041401015" <<endl; << "S1 Ilmu Komputer FMIPA USU" <<endl; << "*************************************************"
Universitas Sumatera Utara
cout << "*************************************************" <<endl; cout << endl <<endl; } //akhir promptWelcome
//**************************************** // Mendesak user untuk memasukkan plainteks // atau cipherteks lain. Memberikan nilai // pada array yang dilewatinya. //**************************************** void promptForText(unsigned char* ptext,int encryptionflag) { std::string str; if (encryptionflag ==1) cout << endl << "************ ENKRIPSI PLAINTEKS **********" <<endl<<endl; else cout << endl << "************ DEKRIPSI CIPHERTEKS **********" <<endl<<endl; while (1) { cout << "Ukuran Block Data adalah 8 bit. " <<endl; cout << "Untuk itu, silakan masukkan 8, 16, 24, 32 karakter" <<endl<<endl; if (encryptionflag ==1) cout << "Plainteks yang kamu inputkan: "; else cout << "Cipherteks yang kamu inputkan: "; getline(cin, str); if ((str.size() == 8) || (str.size()==16) || (str.size()==24) || (str.size()==32)) break; else cout <<endl<< "ERROR: input adalah " << str.size()<< " sebagai ganti dari 8,16,24,32 karakter. Coba lagi" <<endl <<endl; } inputsize = str.size(); for (int i=0;i<str.size();i++) { ptext[i] = str[i]; } ptext[inputsize]='\0'; } //desakan untuk plainteks
//************************************************************** // program ini mendesak user untuk memasukkan kunci 128 bit. // karna kita ketahui bahwa 1 karakter = 1 byte = 8 bit, // sehingga memasukkan 16 karakter sama dengan memasukkan 128 bit. // selanjutnya 16 karakter itu dikonversi menjadi 128 bit //************************************************************** void promptForKey() { cout << "Keterangan : " <<endl; cout << "IDEA beroperasi pada kunci berukuran 128-bit. " <<endl; cout << "User akan memasukan 16 karakter alfanumerik" <<endl;
Universitas Sumatera Utara
cout << "16 karakter alfanumerik ini akan dikonversikan "<< endl; cout << "ke dalam kunci 128-bit. " <<endl; cout << "(16 karakter * 8 bit = 128 bit)" <<endl; cout << endl <<endl; std::string str; while (1) { cout << "Silakan masukkan 16 tekan enter!" <<endl; getline(cin, str);
karakter alfanumerik , lalu
if (str.size() == 16) break; else cout <<endl<< "ERROR: Itu bukan termasuk alfanumeric. " <<endl; cout << " Silakan Coba lagi...!!!" <<endl<<endl; }
16
karakter
for (int i=0;i<16;i++) { origkeychar[i] = str[i]; } origkeychar[16]='\0'; cout << endl << "Terima kasih banyak telah menginput."<<endl ;
//mengubah ke hex int firstbyte = 0; for (int j=0; j<4;j++) { //menggabungkan dua bagian 8-bit menjadi satu 16-bit origkeyint[j] = (origkeychar[firstbyte] <<24) (origkeychar[firstbyte+1]<<16) + (origkeychar[firstbyte+2]<<8) + (origkeychar[firstbyte+3]); firstbyte = firstbyte+4; } printOrigKey(); } //akhir promptForKey
+
//**************************************** // mengeprint hex dan ascii plainteks //**************************************** void printPlainTextSummary(unsigned char* plaintext) { plaintext[inputsize]='\0'; printf ("\n\nPlainteks kamu\n"); printf ("=================================\n"); printf ("Plainteks dalam ASCII: \"%s\"\n",plaintext); printf ("Plainteks dalam Hex:"); printHex(plaintext); } //**************************************** // mengeprint hex cipherteks //**************************************** void printCipherTextSummary(unsigned char* ciphertext) { ciphertext[inputsize] = '\0'; printf ("\n\nCipherteks yang dihasilkan\n");
Universitas Sumatera Utara
printf ("=================================\n"); printf ("Cipherteks dalam Hex:"); printHex(ciphertext); }
//**************************************** // mengeprint hex dan ascii cipherteks // yang telah didekripsi //**************************************** void printDecipherTextSummary(unsigned char* decipheredtext) { decipheredtext[inputsize] = '\0'; printf ("\n\nDekripsi Cipherteks tersebut\n"); printf ("=================================\n"); printf ("Hasil dekripsi teks dalam \"%s\"\n",decipheredtext); printf ("Hasil dekripsi teks dalam Hex:"); printHex(decipheredtext); }
ASCII:
//************************************************************* // LOOP MAIN PROGRAM! SECARA TERUS-MENERUS // menyarankan user untuk menginput dan memproses permintaan //************************************************************* int main() { promptWelcome(); promptForKey();
//Catatan: kesampingkan kunci yg diinput user hanya untuk maksud testing //unsigned char origkeychar[17]; //for(int i=0; i<16; i++) //origkeychar[i] = i+1; //origkeychar[16]='\0'; calcEKeys(origkeychar); calcDKeys();
std::string str; unsigned char ciphertext[MAXINPUTSIZE+1]; unsigned char decipheredtext[MAXINPUTSIZE+1]; unsigned char plaintext[MAXINPUTSIZE+1]; ciphertext[MAXINPUTSIZE] = '\0'; decipheredtext[MAXINPUTSIZE] = '\0'; unsigned int myint; unsigned int* intptr;
//************************** //******** LOOP MAIN PROGRAM //**************************
while (1) { cout << endl <<endl << "MENU UTAMA" <<endl; cout << "=========" <<endl<<endl;
Universitas Sumatera Utara
cout << "Tekan 1 untuk menampilkan semua kunci Enkripsi/Dekripsi" <<endl; cout << "Tekan 2 untuk mengenkripsi plainteks dengan menampilkan hasil" <<endl; cout << "Tekan 3 untuk mendekripsi cipherteks dengan menampilkan hasil" <<endl; cout << "Tekan 4 untuk mengenkripsi, lalu mendekripsi" << "(Tanpa menampilkan hasil)" <<endl; cout << "Tekan 5 untuk keluar" <<endl<<endl; cout << "Pilihan kamu : " ; getline(cin, str);
// bisa juga menggunakan statement switch if (str[0] == '1') printKeys(); else if (str[0]=='2') { promptForText(plaintext,1); encrypt(plaintext,ciphertext,1); printCipherTextSummary(ciphertext); } else if (str[0]=='3') { promptForText(ciphertext,0); decrypt(ciphertext,decipheredtext,1); printDecipherTextSummary(decipheredtext); } else if(str[0]=='4') { promptForText(plaintext,1); encrypt(plaintext,ciphertext,0); decrypt(ciphertext,decipheredtext,0); printPlainTextSummary(plaintext); printCipherTextSummary(ciphertext); printDecipherTextSummary(decipheredtext); } else if(str[0]=='5') { cout << "Menutup program IDEA....Sampai jumpa lagi...... " <<endl<<endl; exit(0); } else { cout <<"Error: Input salah, harus angka antara 1 sampai 5 !!! " <<endl; } } // akhir loop main program return 0; } //akhir main program
Universitas Sumatera Utara
LAMPIRAN B: KODE ASCII KODE ASCII 0 – 127 :
Universitas Sumatera Utara
KODE ASCII 127 - 255 :
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara
Universitas Sumatera Utara