=
3
0 j
P(4i+j).2
8j
(2.6)
i=0,,3
Di dalam langkah whitening, kata-kata ini di-XOR dengan 4 kata dari
kunci yang diperluas.
R
0,i
=P K
i
(2.7)
i=0,,3
Gambar 2.8 Blok Diagram Twofish
(Schneier, 1998 : 9)
Pada setiap 16 putaran, dua kata pertama digunakan sebagai masukan
kepada fungsi F, yang juga mengambil angka bulat itu sebagai masukan. Kata
yang ketiga di-XOR dengan keluaran pertama F dan kemudian diputar ke kanan
satu bit. Kata keempat diputar ke kiri satu bit kemudian di-XOR dengan kata
keluaran F Yang kedua . Akhirnya, keduanya saling ditukar menghasilkan
persamaan :
(F
r,0,
F
r,1
) = F(F
r,0,
F
r,1
,r) (2.8)
R
r+1,0
= ROR(R
r,2
F
r,0
,1) (2.9)
R
r+1,1
= ROL(R
r,3
,1)F
r,1
(2.10)
R
r+1,2
= R
r,0
(2.11)
R
r+1,3
= R
r,1
(2.12)
untuk r=0,,15 di mana ROR dan ROL adalah berfungsi memutar argumentasi
pertama (32-bit kata) ke kanan dengan angka bit-bit diindikasikan dengan
argumentasi keduanya. Langkah whitening keluaran membatalkan `pertukaran
putaran terakhir dan meng XOR kata-kata dengan 4 kata dari kunci yang
diperluas.
C
i
= R
16,(i+2) mod 4
K
i+4
(2.13)
i =0,,3
Empat kata dari ciphertext kemudian menulis seperti 16 byte c
0
,,c
15
sama
seperti menggunakan konversi little-endian untuk plaintext.
c
i
=
(
) 4 mod ( 8
2
4 /
i
i C
mod 2
8
(2.14)
i =0,,15
(Schneier dkk, 1998: 5).
2.3.2.1 Fungsi F
Fungsi F adalah suatu permutasi key-dependent di atas nilai 64-bit. Untuk
mengambil tiga argumentasi, dua kata masukan R
0
Dan R
1
, dan angka bulat r
digunakan untuk memilih subkey yang sesuai. R
0
yang dilewati fungsi g,
menghasilkan T
0
. i
diputar 8 bit ke kanan kemudian melewati fungsi g untuk
menghasilkan T
1
. Hasil T
0
danT
1
selanjutnya dikombinasikan dalam sebuah PHT
danditambahkan 2 kata dari kunci yang diperluas menghasilkan persamaan :
T
0
= g(R
0
) (2.15)
T
1
= g(ROL(R
1
,8)) (2.16)
F
0
= (T
0
+T
1
+K
2r+8
) mod 2
32
(2.17)
F
1
= (T
0
+2T
1
+K
2r+9
) mod 2
32
(2.18)
Di mana ( F
0
, F
1
) adalah hasil dari F. (Schneier dkk, 1998: 7).
2.3.2.2 Fungsi g
Fungsi g membentuk jantungnya Twofish. Kata masukan X dipecah
menjadi empat byte. Masing-masing byte dijalankan melewati S-box key-
dependent. Masing-masing S-box adalah bijective, mengambil 8 bit masukan, dan
menghasilkan 8 bit keluaran. Ke empat hasil diinterpretasikan sebagai vektor yang
panjangnya 4 di atas GF (28), dan dikalikan dengan yang matriks MDS 4x4
(menggunakan bidang GF (28) untuk perhitungannya). Untuk menghasilkan
vektor diinterpretasikan sebagai 32-bit kata sebaga adalah hasil dari g :
x
i
=
i
X
8
2 / mod 2
8
(2.19)
i =0,,3
y
i
= s
i
| |
i
x (2.20)
i =0,,3
|
|
|
|
|
.
|
\
|
3
2
1
0
z
z
z
z
=
|
|
|
.
|
\
|
.
.
.
MDS .
|
|
|
|
|
.
|
\
|
3
2
1
0
y
y
y
y
(2.21)
Z =
8
3
0
2 .
= i
i
z
(2.22)
Di mana s
i
adalah S-Box key-dependent dan Z adalah hasil dari g. Untuk
merumuskan dengan baik, kita harus menetapkan koresponden antara nilai-nilai
byte dan elemen-elemen bidang GF (28). Kita merepresentasikan GF (2
8
) sebagai
GF(2)[x]/v(x) di mana v(x)=x
8
+x
6
+x
5
+x
3
+1 adalah suatu polynomial primitif dari
8 tingkat di atas GF(2). Unsur Bidang a=
=
7
0 i
a
i
x
i
dengan a
i
GF (2) adalah
dikenal dengan nilai byte
=
7
0 i
a
i
x
i
. Ini adalah beberapa pengertian pemetaan
alamiah"; penambahan di dalam GF (28) berkorespondensi dengan suatu XOR
dari bytes.
Matriks MDS-nya adalah sebagai berikut :
MDS =
|
|
|
|
|
.
|
\
|
B EF EF
EF B EF
EF EF B
B B EF
5 01
01 5
01 5
5 5 01
(2.23)
Di mana elemen-elemen ditulis sebagai nilai-nilai byte heksadesimal.
(Schneier dkk, 1998: 7).
2.3.2.3 Jadwal Kunci
J adwal kunci harus menyediakan 40 kata dari kunci yang diperluas
K
0
,,K
39
, dan 4 buah S-Box key-dependent yang digunakan di dalam fungsi g.
Twofish didefinisikan untuk kunci-kunci dengan panjang N=128, N=192, dan N=
256. Beberapa kunci yang lebih pendek dari 256 bit dapat digunakan oleh
lapisannya dari nol hingga yang lebih besar yang didefinisikan sebagai panjang
kunci. Kita mendefinisikan k=N/64. Kunci M terdiri dari 8k byte m
0
,,m
8k-1
.
Byte-byte adalah yang pertama diubah ke dalam 2k kata dari 32 bit masing-
masing :
M
i
=
j
j
j i
m
8
3
0
) 4 (
2 .
=
+
(2.24)
i =0,2k-1
dan kemudian ke dalam dua vektor kata dari panjang k :
M
e
= (M
0
,M
2
,,M
2k-2
) (2.25)
M
o
= (M
1
,M
3
,,M
2k-2
) (2.26)
Sepertiga vektor kata dari panjang k adalah juga diperoleh dari kunci itu.
Hal ini dilakukan dengan mengambil byte-byte kunci di dalam kelompok
8, menginterpretasikannya sebagai vektor di atas GF (28), dan mengalikannya
dengan matrils 4x8 yang diperoleh dari suatu kode R. Masing-masing hasil dari 4
byte kemudian diinterpretasikan sebagai suatu kata 32 bit.. Kata-kata ini
menyusun vektor yang ketiga :
|
|
|
|
|
.
|
\
|
3 ,
2 ,
1 ,
0 ,
i
i
i
i
s
s
s
s
=
|
|
|
.
|
\
|
.
.
.
RS .
|
|
|
|
|
|
|
|
|
|
|
.
|
\
|
+
+
+
+
+
+
+
7
6
5
4
3
2
1
Si
Si
Si
Si
Si
Si
Si
Si
m
m
m
m
m
m
m
m
(2.27)
S
i
=
j
j
j i
S
8
3
0
,
2 .
=
(2.28)
untuk i =0,,k-1, dan
S = (S
k
-1,S
k-2
,,S
0
) (2.29)
Catat bahwa daftar S kata-kata itu di dalam order terbalik". Karena Untuk
perkalian matriks RS, GF (28) diwakili oleh GF (2)[x]/w(x), di mana w(x)=
x
8
+x
6
+x
3
+x
2
+1 adalah polynomial primitif derajat dari 8 tingkat di atas GF(2).
Pemetaan antara nilai-nilai byte dan elemen-elemen GF (28) menggunakan
defnisi yang sama sebagaimana yang digunakan untuk perkalian matriks MDS.
Dalam pemetaan ini, matriks RS ditunjukkan sebagai berikut :
RS =
|
|
|
|
|
.
|
\
|
03 9 58
19 3 47
5 68 6 1
9 58 5
5 87 55 4
1 1 02
3 82 56 4
87 55 4 01
E DB
D AE
E C E
E DB A
A A
C FC A
F A
A
(2.30)
Ke tiga vektor M
e
, M
o
, dan S ini membentuk basis dari jadwal kunci.
(Schneier dkk, 1998: 8).
2.3.2.4 Penambahan Panjang Kunci
Twofish dapat menerima kunci-kunci dengan panjang byte di atas 256 bit..
Untuk ukuran-ukuran kunci yang tidak didefinisikan di atas, kunci diisi pada
bagian akhir dengan nol byte kepada yang lebih panjang berikutnya. Sebagai
contoh, suatu kunci 80-bit m
0
,,m
9
akan diperluas dengan mengatur m
i
=0 untuk
i=10,,15 dan diperlakukan sebagaimana pada kunci 128-bit. (Schneier dkk,
1998: 8).
2.3.2.5 Fungsi h
Pada gambar 2.9 menunjukkan suatu ikhtisar fungsi h. Ini adalah suatu
fungsi yang mengambil dua input-a 32-bit kata X dan sebuah daftar L = ( L
0
,,L
k-
1
) dari kata-kata X 32 dengan panjang k- dan menghasilkan satu kata pada
outputnya. Ini adalah pekerjaan fungsi di dalam langkah-langkah k. Pada setiap
langkah, empat byte itu masing-masing melintasi suatu fixed S-Box, dan di-XOR
dengan sebuah byte yang diperoleh dari daftar. Akhirnya, byte-byte sekali lagi
digeser melewati sebuah fixed S-box dan empat byte itu dikalikan dengan matriks
MDS seperti halnya dalam g. Lebih formal kita memisah-misahkan kata-kata itu
ke dalam bytes :
l
i,j
=
8
2 /
i
L mod 2
8
(2.31)
x
j
=
j
X
8
2 /
mod 2
8
(2.32)
untuk i=0,,k-1 dan j=0,,3. Kemudian urutan subtitusi dan XOR diterapkan :
y
k,j
= x
j
(2.33)
j =0,,3
Gambar 2.9 Skema Fungsi h
(Schneier, 1998 : 9)
jika k 3 didapatkan :
y
3,0
= q
1
[y
4,0
] l
3,0
(2.34)
y
3,1
= q
0
[y
4,1
] l
3,1
(2.35)
y
3,2
= q
0
[y
4,2
] l
3,2
(2.36)
y
3,3
= q
1
[y
4,3
] l
3,3
(2.37)
jika k = 4 didapatkan :
y
2,0
= q
1
[y
3,0
] l
3,0
(2.38)
y
2,1
= q
1
[y
3,1
] l
3,1
(2.39)
y
2,2
= q
0
[y
3,2
] l
3,2
(2.40)
y
2,3
= q
0
[y
3,3
] l
3,3
(2.41)
Dalam seluruh kasus didapatkan :
y
0
= q
1
[q
0
[q
0
[y
2,0
] l
1,0
] l
0,0
] (2.42)
y
1
= q
0
[q
0
[q
1
[y
2,1
] l
1,1
] l
0,1
] (2.43)
y
2
= q
0
[q
1
[q
0
[y
2,2
] l
1,2
] l
0,2
] (2.44)
y
3
= q
1
[q
1
[q
1
[y
2,3
] l
1,3
] l
0,3
] (2.45)
Di sini, q
0
dan q
1
ditetapkan permutasi di atas nilai 8-bit yang akan didefinisikan
segera. Menghasilkan vektor yang merupakan perkalian matriks MDS, seperti
halnya dalam fungsi g :
|
|
|
|
|
.
|
\
|
3
2
1
0
z
z
z
z
=
|
|
|
.
|
\
|
.
.
.
MDS .
|
|
|
|
|
.
|
\
|
3
2
1
0
y
y
y
y
(2.46)
Z =
i
i
i
z
8
3
0
2 .
=
(2.47)
di mana Z adalah hasil dari h. (Schneier dkk, 1998: 8).
2.3.2.6 S-Box Key-dependent
Sekarang dapat didefinisikan S-Box dalam fungsi g oleh :
g(x)=h(X; S) (2.48)
Hal itu adalah karena i=0,,3, S-Box Key-Dependent s
i
dibentuk oleh pemetaan
dari x
i
ke y
i
di dalam fungsi h, di mana daftar Lsama dengan vektor S yang
diperoleh dari kunci itu. (Schneier dkk, 1998: 10).
2.3.2.7 Kata-kata Kunci yang Diperluas Kj
Kata-kata dari kunci yang diperluas didefinisikan menggunakan fungsi h :
= 2
24
+2
16
+2
8
+2
0
(2.49)
A
i
= h(2
i
,M
e
) (2.50)
B
i
= ROL(h((2
i
+ 1) ,M
o
),8) (2.51)
K
2i
= (A
i
+B
i
) mod 2
32
(2.52)
K
2i+1
= ROL((A
i
+2B
i
) mod 2
32
,9) (2.53)
Konstanta digunakan untuk menduplikat byte yang mempunyai properti untuk
i= 0,,255, kata itu jika terdiri dari empat byte yang sama, masing-masing
dengan nilai i. Fungsi h diberlakukan bagi kata-kata jenis ini. Untuk A
i
nilai-nilai
byte itu adalah 2i, dan argumentasi yang kedua dari h adalah M
e
. B
i
dihitung
dengan cara yang sama menggunakan 2i+1 sebagai byte nilai dan M
o
sebagai
argumentasi yang kedua, dengan suatu putaran ekstra di atas 8 bit. Nilai-nilai A
i
dan B
i
Dua dikombinasikan dalam PHT. Salah satu dari hasil itu selanjutnya
diputar dengan 9 bit. Kedua hasil tersebut membentuk dua kata kunci yang
diperluas. (Schneier dkk, 1998: 10).
2.3.2.8 Permutasi q0 dan q1
Permutasi q
0
dan q
1
adalah ditetapkan permutasi di atas nilai-nilai 8 bit.
Mereka dibangun dari empat 4-bit permutasi yang masing-masing berbeda. Untuk
nilai masukan x didefinisikan sebagai nilai output y sebagai berikut :
a
0
, b
0
=
16 / x , x mod 16 (2.54)
a
1
= a
0
b
0
(2.55)
b
1
= a
0
ROR
4
(b
0
,1) 8a
0
mod 16 (2.56)
a
2
, b
2
= t
0
[a
1
],t
1
[b
1
] (2.57)
a
3
= a
2
b
2
(2.58)
b
3
= a
2
ROR
1
(b
2
,1) 8a
2
mod 16 (2.59)
a
4
, b
4
= t
2
[a
3
],t
3
[b
3
] (2.60)
y = 16b
4
+a
4
(2.61)
di mana ROR
4
adalah suatu fungsi yang serupa dengan ROR yang merupakan
putaran nilai 4-bit. Pertama, byte dipecah menjadi dua bagian. Ini dikombinasikan
dalam suatu bijective yang mencampur langkah. Masing-masing bagian kemudian
melintasi 4-bitfixed S-Box. Ini diikuti oleh yang lain. Akhirnya, dua bagian
dikombinasikan kembali ke dalam satu byte. Untuk permutasi q
0
S-Box 4-bit :
t
0
= [8 1 7 D 6 F 3 2 0 B 5 9 E C A 4] (2.62)
t
1
= [E C B 8 1 2 3 5 F 4 A 6 7 0 9 D] (2.63)
t
2
= [B A 5 E 6 D 9 0 C 8 F 3 2 4 7 1] (2.64)
t
3
= [D 7 F 4 1 2 6 E 9 B 3 0 8 5 C A] (2.65)
di mana masing-masing S-Box 4-Bit diwakili oleh daftar masukan yang
menggunakan notasi hexadecimal. (untuk masukan 0,,15 didaftarkan dalam
order.) Dengan cara yang sama, untuk q
1
S-Box 4-bit :
t
0
= [2 8 B D F 7 6 E 3 1 9 4 0 A C 5] (2.66)
t
1
= [1 E 2 B 4 C 3 7 6 D A 5 F 9 0 8] (2.67)
t
2
= [4 C 7 5 1 6 9 A 0 E D 8 2 B 3 F] (2.68)
t
3
= [B 9 5 1 C 3 D E 6 4 7 F 2 0 8 A] (2.69)
Gambar 2.10 Satu Putaran Fungsi F (Kunci 128-bit)
(Schneier dkk, 1998: 10).
2.3.3 Tujuan Desain Twofish
Twofish dirancang untuk memenuhi kriteria desain yang ditentukan oleh
NIST sebagai kandidat AES. Adapun criteria-kriteria yang ditetapkan oleh NIST
untu kandidat AES adalah sebagai berikut:
a. Blok cliper simetris 128-bit
b. Panjang key-nya adalah 128 bit, 192 bit, dan 256 bit.
c. Tidak ada key-key yang lemah.
d. Memiliki efisiensi, baik pada Pentium Pro maupun pada software dan
hardware dari platform yang berbeda.
e. Memiliki rancangan yang flkeksibel, misalnya menerima panjang key
tambahan, dapat diterapkan pada software dan hardware dari platform
berbeda, cocok untuk stream chipper, fungsi hash dan MAC.
f. Simple design, baik untuk memudahkan analisa dan implementasi.
Sebagai tambahannya, ditekankan kriteria kinerja sebagai berikut:
a. Mampu menerima panjang key diatas 256.
b. Mengenkripsi data kurang dari 500 siklus clock per block di atas Pantium,
Pentium Pro dan Pentium II, bagi algoritma yang dioptimasi secara penuh.
c. Mampu melakukan set-up key 128-bit (untuk kecepatan enkripsi optimal)
dalam waktu kurang dari yang diperlukan untuk mengenkripsi 32 blok di
atas Pentium, Pentium Pro, dan Pentium II.
d. Mengenkripsi data kurang dari 5000 siklus clock per blok di atas Pentium,
Pentium Pro, dan Pentium II tanpa melakukan key setup terlebih dahulu.
e. Tidak menggunakan operasi-operasi yang dapat mengurangi kinerja ketika
dijalankan pada mekroproc\sesor 3-bit yang lain.
f. Tidak menggunakan operasi-operasi yang mengurangi efisiensi ketika
dijalankan di atas processor 8-bit atau 16-bit.
g. Tidak menggunakan operasi-operasi yang mengurangi efisiensi ketika
dijalankan di atas processor 64-bit, seperti Merced.
h. Tidak melibatkan elemen apapun yang membuat tidak efisien dalam hal
hardware.
i. Memiliki bermacam kinerja yang mengacu pada key-schedule.
j. Mengenkripsi data dalam waktu kurang dari 10 millidetik pada processor
8-bit.
k. Dapat diimplementasikan di ats processor 8-bit dan dengan RAM 64 byte
saja.
l. Dapat diimplementasikan pada hardware yang menggunakan kurang dari
20000 gates.
Sementara itu, tujuan NIST dalam hubungannya dengan Twofish adalah
sebagai berikut:
a. Twofish 16-round tidak boleh memiliki chosen-plaintext attack yang
memerlukan kurang dari 2
80
chosen-plaintext dan menggunakan waktu
dari 2
N
dimana N adlah panjang key.
b. Twofish 12-round tidak boleh memiliki suatu related-key attack yang
memerlukan kurang dari 2
64
chosen-plaintext dan menggunakan waktu
kurang dari 2
N
dimana N adalah panjang key.
Akhirnya, diputuskan tujuan fleksibel dalam kriptografi Twofish sebagai
berikut:
a. Memiliki varian dengan sebuah nomor variable dari setiap round.
b. Memiliki key schedule yang dapat di-prekomputasikan untuk kecepatan
maksimum dan penggunaan memori manimum.
c. Cocok sebagai stream chipper, fungsi hash satu arah, MAC dan pseudo
ramdom number generator, dengan menggunakan metode konstruksi yang
dapat dimengerti.
d. Memiliki varian famili-key untuk memungkinkan versi chipper yang
berbeda dan non interoperable.
Dan twofish telah memenuhi semua kriteria-kriteria diatas.
BAB III
ANALISIS DAN PERANCANGAN SISTEM
Bab ini membahas tentang analisis dan perancangan sistem tentang
pembuatan aplikasi enkripsi serta dekripsi file dan folder dengan algoritma
twofish. Analisis dan perancangan ini meliputi analisis sistem, perancangan
proses, tahap pembuatan sistem, dan perancangan antarmuka.
3.1. Analisis Sistem
Masalah yang diselesaikan dalam skripsi ini antara lain adalah
menerapkan algoritma twofish digunakan untuk enkripsi dan dekripsi file dan
folder. Pada subbab ini dilakukan beberapa analisis yaitu deskripsi sistem dan
perancangan proses sistem yang akan dibangun.
3.1.1. Deskripsi Sistem
Subbab ini akan membahas mengenai deskripsi sistem yang dikerjakan
pada skripsi ini. Tujuan pembuatan sistem ini adalah menerapkan algoritma untuk
mengamankan file ataupun folder sehingga file atau folder tersebut menjadi tidak
dapat terbaca. Proses utama pada aplikasi perangkat lunak ini adalah melakukan
enkripsi dan dekripsi. Adapun proses dalam perangkat lunak ini sebagai berikut :
a. Melakukan enkripsi file dan folder.
1. Pengguna memasukkan input berupa file atau folder. File atau folder
yang akan diinputkan berupa file teks, file gambar, file suara, dan lain
sebagainya.
2. Masukkan kunci untuk mengenkripsi.
3. Lakukan enkripsi file atau folder yang telah diinputkan.
4. File atau folder yang telah terenkripsi menjadi file yang tidak terbaca.
Diagram alir untuk enkripsi file adalah sebagai berikut:
Gambar 3.1 Enkripsi File dan Folder
b. Melakukan dekripsi file dan folder
1. Masukkan file yang sudah terenkripsi.
2. Masukkan kunci yang sama ketika file atau folder dienkripsi.
3. Lakukan dekripsi untuk file yang telah diinputkan.
4. File akan menjadi seperti keadaan semula. Untuk folder yang
terenkripsi tidak dapat diketahui bahwa itu folder karena inputan
dekripsi berupa file terenkripsi, dengan kata lain folder yang dienkripsi
berupa file. Folder yang terenkripsi akan menjadi folder semula.
Diagram alir dekripsi file adalah sebagai berikut :
Gambar 3.2 Dekripsi File dan Folder
3.1.2 Perancangan Proses Sistem
Proses yang dirancang pada perangkat lunak ini berdasarkan pada
algortima yang digunakan yaitu algoritma twofish. Algotirma twofish sendiri
merupakan algoritma yang menggunakan kunci simetrik yaitu kunci yang
digunakan untuk mengenkripsi sama dengan kunci yang digunakan pada saat
mendekripsi. Twofish menggunakan 128 bit setiap blok yang akan dienkripsi.
Kunci yang digunakan dengan panjang maksimal 256 bit.
Pada bab teori dasar telah dijelaskan tentang unsur pembangun twofish
beseta algoritmanya. Berikut bagan dari algoritma twofish yang akn dijelaskan
pada subbab ini.
Gambar 3.3 Bagan Algoritma Twofish
(Schneier, 1998 : 9)
Secara lebih jelas tahapan-tahapan algoritma twofish akan dijabarkan
sebagai berikut.
Penjadwalan Kunci :
a. Sebelum melalui tahapan enkripsi, maka harus melalui penjadwalan kunci.
Panjang kunci yang didefinisikan twofish sepanjang 128 bit, 192, bit dan
256 bit. Apabila input kunci yang dimasukkan kurang dari ketentuan
tersebut, maka akan ditambahakan zero byte sampai panjang kunci
memenuhi ketentuan di atas.
b. Setelah itu kunci dibagi menjadi vector Me, Mo, dan S. Vector Me dan Mo
digunakan pada fungsi h sebagai list, sedangkan vector S digunakan untuk
tahap enkripsi pada fungsi g.
c. Masukkan masing-masing word kunci Kj yang diekspansi yaitu 2i dan
2i+1 ke dalam fungsi h yaitu melalui permutasi q0 dan q1 dilanjutkan
dengan matrik MDS.
Gambar 3.4 Fungsi h
(Schneier, 1998 : 9)
d. Hasil dari word 2i melalui proses PHT, sedangkan word 2i+1 sebelum
melalui proses PHT dilakukan rotasi kekiri sejauh 8 bit. Maka hasil dari
proses tersebut menjadi kunci yang sudah terjadwal.
Tahap Enkripsi :
a. Input plainteks sebesar 128 bit akan dibagi menjadi empat word yaitu P0,
P1, P2, P3 yang masing-masing sebesar 32 bit. P0 dan P1 akan menjadi
bagian kiri, sedangkan P2 dan P3 akan menjadi bagian kanan.
b. Plainteks akan melalui proses input whitening yaitu input akan di-XOR
dengan empat word kunci yang telah terjadwal yaitu K0, K1, K2, dan K3.
Secara formalnya adalah sebagai berikut :
Ro,i =Pi xor Ki (3.1)
i =0, , 3
Gambar 3.5 Proses Whitening
c. Proses berikutnya input akan melalui proses pada fungsi F yang meliputi
di dalamnya adalah fungsi g dan dilanjutkan dengan PHT (pseudo
hadamard transform), dan dilakukan penambahan hasil PHT dengan
kunci. Proses fungsi F tersebut dilakukan secara bertahap. R0 dan R1 yang
merupakan hasil whitening akan menjadi input untuk fungsi F.
d. R0 dan R1 akan dimasukkan ke dalam fungsi g yang merupakan bagian
awal dari fungsi F. Untuk R1 sebelum dimasukkan ke dalam fungsi g akan
dirotasi ke kiri sejauh 8 bit. R0 dan R1 melalui S-box dan selanjutnya akan
dikalikan dengan matriks MDS. Hasil dari fungsi g ini masing-masing
menjadi T0 dan T1.
e. T0 dan T1 akan melalui proses PHT yang merupakan penggabungan T0
dan T1 dimana T0 +T1 dan T0 +2T1. Setelah itu hasil dari PHT tersebut
masing-masing akan ditambahkan dengan kunci yang sudah terjadwal
yaitu K2r+8 dan K2r+9. Hasil dari fungsi F adalah F0 dan F1, maka
dengan demikian fungsi F telah terpenuhi.
Gambar 3.6 Fungsi F
f. Setelah itu F0 dan F1 masing-masing di-XOR dengan R2 dan R3. Hasil
dari R2 XOR F0 dirotasi ke kanan sejauh 1 bit. Sedangkan R3 XOR F1,
sebelumnya R3 dirotasi ke kiri sejauh 1 bit.
g. Setelah itu, maka akan dilakukan iterasi sebanyak 16 kali. Setiap iterasi
sama dengan proses sebelumnya.
h. Hasil dari swap blok terakhir adalah penukaran bagian kanan dan kiri yang
di-undo.
i. Hasil dari 16 round enkripsi kan melalui output whitening yaitu proses
peng-XORan 16 round enkripsi dengan K4, K5, K6, dan K7.
Gambar 3.7 Swap Blok Terakhir dan Output Whitening
Pada proses dekripsi, cara yang dilalui sama saja dengan proses enkripsi
tetapi hanya arahnya saja yang berlawanan. Proses yang dilalui secara berurutan
yaitu : output whitening, swap blok trakhir, 16 iterasi dekripsi, dan input
whitening. Inputnya adalah chiperteks dan kunci untuk memperoleh plainteks.
Kunci untuk dekripsi sama saja dengan kunci enkripsi, begitupun juga panjang
maksimal kunci yaitu 256 bit atau 32 karakter.
3.2 Tahapan Penelitian
Dalam pembuatan proses sistem yang dibangun melalui beberapa tahapan.
Secara garis besar tahapan pembutan sistem yang akan dibangun adalah sebagai
berikut :
a. Melakukan studi literatur
Melakukan studi literatur yang berhungan dengan penelitian yang dikutip
dari buku teks, paper, dan browsing internet. Bahasan yang ambil
mengenai teori kriptografi, algoritma twofish, dan hubungan keilmuan
yang dibahas dengan agama Islam. Melalui studi literatur, teori tersebut
dianalisis untuk mengimplementasikannya ke dalam bentuk perangkat
lunak.
b. Analisis dan perancangan perangkat lunak.
Menganalisis dan merancang perangkat lunak enkripsi dan dekripsi file
dan folder untuk memperoleh perangkat lunak yang sesuai dengan teori
dan rancangan yang telah dilakukan.
c. Pembuatan perangkat lunak
Pembuatan perangkat lunak berdasarkan analisis dan perancangan yang
dilakukan sehingga diperoleh hasil yang optimal.
d. Uji coba dan evaluasi sistem.
Melakukan uji coba terhadap perangkat lunak. Uji coba yang dilakukan
yaitu menguji keberhasilan enkripsi file atau folder serta
mendekripsikannya kembali sehingga menjadi file semula. Bahan yang
akan diuji berupa file yang mempunyai kapasitas yang beragam. Selain itu
mengevaluasi sistem yang telah diselesaikan dengan menganalisa kinerja
perangkat lunak yang telah dibangun.
3.3 Perancangan Antarmuka
Rancangan antarmuka yang akan dibangun mempunyai dua form yaitu
form enkripsi dan form dekripsi. Form enkripsi adalah form untuk mengenkripsi
file, dimana bagian dari form ini yaitu text field kunci untuk menginputkan kunci
atau password dengan panjang maksimal 256 bit atau 32 karakter, text field file
input untuk menginputkan file atau folder yang akan dienkripsi dengan open
file/folder, text field file output untuk menyimpan file yang akan dienkripsi, dan
button enkrip file adalah tombol untuk mengenkripsi file. Berikut adalah gambar
rancangan form enkripsi yang akan dibangun.
Gambar 3.8 Rancangan Form Enkripsi
Keterangan gambar :
1. Button form enkripsi
2. Button form dekripsi
3. Text Field kunci
4. Text Field file input
5. Text Field file output
KUNCI
FILE INPUT
FILE OUTPUT
Waktu Enkrip :
6. Check box open file/folder enkripsi
7. Button open file/folder enkripsi
8. Button destinasi file/folder enkripsi
9. Button enkrip file
Sedangkan form dekripsi adalah form untuk mendekripsi file, dimana
bagian dari form ini yaitu text field kunci untuk menginputkan kunci atau
password yang harus sama dengan kunci pada saat mengenkripsi file, text field
file input untuk menginputkan file yang terenkripsi dengan open file, text field file
output untuk menyimpan file yang telah didekripsi, dan button dekrip file adalah
tombol untuk mendekripsi file. Berikut adalah gambar rancangan form dekripsi
yang akan dibangun.
KUNCI
FILE INPUT
FILE OUTPUT
Waktu Dekrip :
Gambar 3.9 Rancangan Form Dekripsi
Keterangan gambar :
1. Button form enkripsi
2. Button form dekripsi
3. Text Field kunci
4. Text Field file input
5. Text Field file output
6. Button open file
7. Button destinasi file/folder dekripsi
8. Button dekrip file
BAB IV
IMPLEMENTASI DAN EVALUASI
Bab ini akan membahas tentang pengujian dan analisa hasil program yang
telah dibuat. Tujuan dari pengujian ini adalah untuk mengetahui apakah aplikasi
yang telah dibuat sesuai dengan perancangannya.
4.1 Ruang Lingkup Pendukung Implementasi
Untuk menjalankan aplikasi yang telah dibangun maka dibutuhkan
beberapa ruang lingkup pendukung implementasi yaitu berupa perangkat keras
maupun perangkat lunak. Berikut adalah ruang lingkup untuk menjalankan
aplikasi yang telah dibangun.
4.1.1 Ruang Lingkup Perangkat Keras
Dalam pembuatan aplikasi enkripsi menggunakan perangkat keras
Notebook Acer Aspire 5315. Adapun spesifikasi yang perangkat keras yang
digunakan adalah :
a. Prosesor Intel Celeron 560 (2,13Ghz).
b. RAM DDR II 512 MB.
c. Hardisk dengan Kapasitas 80 GB.
d. Monitor WXGA Acer CrystalBrite LCD 15,4 inci.
4.1.2 Ruang Lingkup Perangkat Lunak
Perangkat lunak yang digunakan untuk pengembangan aplikasi ini antara
lain :
1. Sistem Operasi Windows XP Profesional SP2.
2. Borland Delphi 7.0.
4.2 Implementasi Sistem
Pada subbab ini akan memaparkan implentasi sistem berdasarkan
rancangan program. Rancangan yang telah dirancang akan diimplentasikan ke
dalam bentuk sourcecode dalam bahasa pemrograman borland delphi 7.0. Berikut
adalah paparan implementasi dari perangkat lunak yang telah dibangun.
4.2.1 Implementasi Algoritma Twofish
4.2.1.1 Penjadwalan Kunci
Sebelum melalukan proses enkripsi pada twofish maka diperlukan
penjadwalan kunci. Sebelum penjadwalan kunci, vector Me, Mo, dan S,
dipersiapkan terlebih dahulu. Setelah itu vector Me dan Mo menjadi bagian dari
penjadwalan kunci sebagai masukan, sedangkan vector S akan digunakan pada
saat enkripsi. Lalu proses berikutnya akan dilakukan perhitungan fungsi h. Berikut
adalah source code dari penjaadwalan kunci :
procedure Hitung_J adKunci;
var
p :LWord;
Ai, Bi, K2i, K2i1 :LWord;
i :byte;
begin
fillchar(K2i, sizeof(K2i),0);
fillchar(K2i1, sizeof(K2i1),0);
p:=0;
for i:=0 to 19 do
begin
fillchar(p,sizeof(p),0);
p:=p+$01010101;
Ai:=h(p, VectorMe);
p:=p+$01010101;
Bi:=ROL(h(p, VectorMo), 8);
J adKunci[i+i]:=Ai+Bi;
J adKunci[i+i+1]:=RoL(Bi+Bi+Ai, 9);
end;
end;
4.2.1.2 Tahap Enkripsi File
Proses enkripsi pada algoritma twofish melalui beberapa tahapan. Pertama
masukan dari plainteks sebesar 128 bit dipecah menjadi empat bagian yang
masing-masing sebesar 32 bit lalu di XOR-kan dengan kunci yang sudah
terjadwal yang masing-masing juga dibagi menjadi empat bagian. Hal ini disebut
dengan proses whitening. Hasil whitening akan akan melalui fungsi F yang
mempunyai output F0 dan F1 dan masing-masing di-XORkan dengan R2 dan R3
(melalui rotasi kekiri 1 bit). Setelah itu dilakukan iterasi sebanyak 16 kali iterasi,
sebelum iterasi dilakukan sama dengan proses sebelumnya. Dilakukan swap blok
akhir yaitu dengan meng-undo swap blok paling akhir tersebut. Terakhir
dilakukan peng-XORan terhadap beberapa kunci yang terjadwal yaitu K4, K5,
K6, dan K7. Demikian proses enkripsi yang dilakukan. Berikut adalah source
code untuk proses enkripsi:
Function BlokEnkrip(Blok:Block16) :Block16;
var
i :byte;
T0, T1 :LWord;
begin
InputWhitening(Blok);
for i:=0 to 7 do
begin
T0 :=h(Blok[0], Vectors);
T1 :=h(ROL(Blok[1], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+8];
F1 :=T0+T1+T1+J adKunci[4*i+9];
blok[2] :=ROR (T0 xor blok[2], 1);
blok[3] :=T1 XOR ROL (blok[3], 1);
T0 :=h(blok[2], VectorS);
T1 :=h(RoL(Blok[3], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+10];
F1 :=T0+T1+T1+J adKunci[4*i+11];
blok[0] :=ROR (T0 XOR blok[0], 1);
blok[1] :=T1 XOR ROL (blok[1], 1);
end;
SwapBlock(Blok);
OutputWhitening(Blok);
BlokEnkrip:=Blok;
end;
4.2.3.3 Tahap Dekripsi File
Proses yang dilalui pada saat dekripsi sama saja dengan proses enkripsi
tetapi hanya arahnya saja yang berlawanan. Proses yang dilalui secara berurutan
yaitu : output whitening, swap blok trakhir, 16 iterasi dekripsi, dan input
whitening. Inputnya adalah chiperteks dan kunci untuk memperoleh plainteks.
Kunci untuk dekripsi sama saja dengan kunci enkripsi, begitupun juga panjang
maksimal kunci yaitu 256 bit atau 32 karakter. Berikut adalah source code untuk
mendekripsi file :
Function BlockDekrip(Blok:Block16) :Block16;
var
i :byte;
T0, T1 :LongWord;
begin
OutputWhitening(Blok);
for i :=7 downto 0 do
begin
T0 :=h(Blok[0], VectorS);
T1 :=h(ROL(Blok[1], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+10];
F1 :=T0+T1+T1+J adKunci[4*i+11];
blok[2] :=ROL (blok[2], 1) xor T0;
blok[3] :=ROR ((blok[3] xor T1), 1);
T0 :=h(blok[2], VectorS);
T1 :=h(ROL(Blok[3], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+8];
F1 :=T0+T1+T1+J adKunci[4*i+9];
blok[0] :=ROL (blok[0], 1) XOR T0;
blok[1] :=ROR ((blok[1] XOR T1), 1);
end;
SwapBlock(Blok);
InputWhitening(Blok);
BlokDekrip:=Blok;
end;
4.2.2 Enkripsi dan Dekripsi Folder
Teknik enkripsi folder berbeda dengan enkripsi file karena di dalam folder
terdapat jumlah file yang lebih dari satu. Untuk teknik enkripsi folder yaitu nama
direktori dimasukkan pada header masing-masing file, dengan kata lain proses
enkripsi folder harus melalui penyatuan file lalu dilakukan proses pengenkripsian,
dan folder itu sendiri dienkrip berdasarkan namanya. Sedangkan untuk dekripsi
folder yaitu header file dibongkar terlebih dahulu, lalu folder di-create dan isi dari
folder tersebut dimasukkan file-file isi dari folder yang terlebih dahulu dibongkar.
Berikut source code dari penginputan folder.
procedure TMainFrm.CInBrowseBtnClick(Sender: TObject);
Var
I: Integer;
Hasil, J adi, S : String;
Begin
If CheckBox1.Checked Then
Begin
Ffolder.ShowModal;
CInFileBox.Text:=Ffolder.DirectoryListBox1.Directory;
Y.Caption:=Ffolder.DirectoryListBox1.Directory;
S:=CInFileBox.Text;
I:=Length( CInFileBox.Text);
Hasil:='';
Repeat
Hasil:=Hasil+S[i];
I:=I-1;
Until ((S[i]='/') Or (S[i]='\') or (I<=1));
J adi:='';
For I:=Length(Hasil) DownTo 1 Do
Begin
J adi:=J adi+Hasil[i];
End;
H2.Caption:=J adi;
End Else
Begin
if OpenDlg.Execute then
CInFileBox.Text:=OpenDlg.Filename;
End;
Sedangkan adalah source code dari dekripsi folder adalah:
procedure TMainFrm.Button1Click(Sender: TObject);
var
NewFileName: string;
Msg: string;
NewFile: TFileStream;
OldFile: TFileStream;
begin
NewFileName :=ExtractFilePath(Application.ExeName) +
ExtractFileName(CInFileBox.Text);
Msg :=Format('Copy %s to %s?', [CInFileBox.Text, NewFileName]);
if MessageDlg(Msg, mtCustom, mbOKCancel, 0) =mrOK then
begin
OldFile :=TFileStream.Create(CInFileBox.Text, fmOpenRead or
fmShareDenyWrite);
try
NewFile :=TFileStream.Create(NewFileName, fmCreate
or fmShareDenyRead);
try
NewFile.CopyFrom(OldFile, OldFile.Size);
finally
FreeAndNil(NewFile);
end;
finally
FreeAndNil(OldFile);
end;
end;
end;
4.3 Implementasi Antarmuka
Dalam antarmuka yang dibangun, ada dua form utama yaitu form enkripsi
dan form dekripsi. Form enkripsi adalah form untuk mengenkripsi file, sedangkan
form dekripsi adalah form untuk mendekripsi file. Adapun form enkripsi adalah
sebagai berikut.
Gambar 4.1 Form Enkripsi
Keterangan gambar :
10. Button form enkripsi
11. Button form dekripsi
12. Text Field kunci
13. Text Field file input
14. Text Field file output
15. Check box open file/folder enkripsi
16. Button open file/folder enkripsi
17. Button destinasi file/folder enkripsi
18. Button enkrip file
Text field kunci untuk menginputkan kunci atau password dengan panjang
maksimal 256 bit atau 32 karakter, text field file input untuk menginputkan file
atau folder yang akan dienkripsi dengan open file/folder, text field file output
untuk menyimpan file yang akan dienkripsi, dan button enkrip file adalah tombol
untuk mengenkripsi file. Sedangkan form dekripsi adalah sebagai berikut.
Gambar 4.2 Form Dekripsi
Keterangan gambar :
9. Button form enkripsi
10. Button form dekripsi
11. Text Field kunci
12. Text Field file input
13. Text Field file output
14. Button open file
15. Button destinasi file/folder dekripsi
16. Button dekrip file
Text field kunci untuk menginputkan kunci atau password yang harus
sama dengan kunci pada saat mengenkripsi file, text field file input untuk
menginputkan file yang terenkripsi dengan open file, text field file output untuk
menyimpan file yang telah didekripsi, dan button dekrip file adalah tombol untuk
mendekripsi file.
4.4. Uji Coba Perangkat Lunak
Untuk mencoba keberhasilan perangkat lunak yang akan dibuat maka akan
dilakukan uji coba perangkat lunak. Uji coba perangkat lunak enkripsi dan
dekripsi bertujuan untuk menguji keberhasilan pengenkripsian pada file dan folder
sehingga file atau folder yang telah dienkripsi sehingga tidak bisa terbaca, dan
menguji keberhasilan pendekripsian file atau folder tersebut sehingga kembali
menjadi kondisi semula. Uji coba yang dilakukan adalah dengan dengan mencoba
mengenkripsi berbagai macam tipe file yaitu file suara, teks dokumen, video,
gambar, aplikasi, dan folder. Twofish merupakan algoritma yang bekerja secara
blok chiper simetris, sehingga kunci dekripsi yang digunakan sama dengan kunci
enkripsi.
Berikut adalah tahapan penggunaan perangkat lunak untuk melakukan
enkripsi file :
a. Untuk mengenkripsi file terlebih dahulu menginputkan file yang akan
dienkrip.
b. Setelah itu menempatkan destinasi file hasil enkripsi.
c. Masukkan kunci untuk mengenkripsi file.
d. Hasil enkrip dapat diberi nama sesuai dengan keinginan.
e. Tekan button Enkrip File, setelah itu file akan terenkrip.
Sedangkan tahapan untuk melakukan dekripsi file adalah :
a. Untuk mendekripsi file terlebih dahulu menginputkan file yang akan
didekrip.
b. Setelah itu menempatkan destinasi file hasil dekripsi.
c. Masukkan kunci untuk mendekripsi file. Kunci dekripsi sama seperti kunci
enkripsi.
f. Hasil dekrip dapat diberi nama sesuai dengan keinginan.
g. Tekan button Dekrip File, setelah itu file akan terenkrip.
Ekstensi file yang diuji yaitu .exe, .doc, .jpg, mp3, mp4, dan folder. Kunci yang
dipergunakan adalah kata uji_coba.
4.4.1 Uji Coba dengan Ekstensi File .doc.
Uji coba pertama yang dilakukan dengan tipe file tipe file teks dokumen
yaitu .doc, .doc merupakan file dari Microsoft Word Office 2003. Berikut adalah
susunan file KRIPTOGRAFI.doc dalam bentuk heksadesimal yang diuji untuk
dienkripsi.
Gambar 4.3 File KRIPTOGRAFI.doc dalam Heksadesimal
FileKRIPTOGRAFI.doc setelah dienkripsi beri nama enkrip KRIPTOGRAFI.
Berikut adalah file .doc yang sudah terenkripsi.
Gambar 4.4 File enkrip KRIPTOGRAFI dalam Heksadesimal
Pada gambar 4.4, bagian kiri menunjukkan struktur file dalam bentuk
heksadesimal, sedangkan pada bagian kanan merupakan perwujudan bentuk
karakter (ASCII) dari heksadesimal. Dengan begitu file tersebut sudah tidak bisa
dimengerti.
Untuk menguji keberhasilan mengembalikan file menjadi bentuk semula
maka dilakukan pendekripsian file. Nama file asli dibedakan dengan file hasil
dekripsi bertujuan untuk membandingkan keberhasilan dekripsi bahwa apakah
hasil dekripsi sesuai dengan file asli sebelum enkripsi. Nama ekstensi hasil
dekripsi harus sama dengan ekstensi file asli, kalau tidak maka file tidak akan bisa
dibuka. Berikut file .doc yang telah didekripsi, nama file hasil dekripsi adalah
dekrip KRIPTOGRAFI.doc.
Gambar 4.5 File dekrip KRIPTOGRAFI.doc dalam Heksadesimal
Hasil dekripsi menunjukkan bahwa susunan heksadesimalnya sesuai dengan file
asli sebelum enkripsi.
4.4.2 Uji Coba dengan Ekstensi File .exe.
Uji coba kedua yang dilakukan dengan tipe file aplikasi yaitu .exe. Berikut
adalah susunan file QuranInWord.exe dalam bentuk heksadesimal yang diuji
untuk dienkripsi.
Gambar 4.6 File QuranInWord.exe dalam Heksadesimal
FileQuranInWord.exe setelah dienkripsi beri nama enkrip QuranInWord.
Berikut adalah file .exe yang sudah terenkripsi.
Gambar 4.7 File enkrip QuranInWord dalam Heksadesimal
Berikut file .exe yang telah didekripsi, nama file hasil dekripsi adalah dekrip
QuranInWord.exe.
Gambar 4.8 File dekrip QuranInWord.exe dalam Heksadesimal
Hasil dekripsi menunjukkan bahwa susunan heksadesimalnya sesuai dengan file
asli sebelum enkripsi.
4.4.3 Uji Coba dengan Ekstensi File .jpg.
Uji coba selanjutnya dilakukan dengan tipe file gambar yaitu .jpg. Berikut
adalah susunan file Spiderman.jpg dalam bentuk heksadesimal yang diuji untuk
dienkripsi.
Gambar 4.9 File Spiderman.jpg dalam Heksadesimal
FileSpiderman.jpg setelah dienkripsi beri nama enkrip Spiderman. Berikut
adalah file .jpg yang sudah terenkripsi.
Gambar 4.10 File enkrip Spiderman dalam Heksadesimal
Berikut file .jpg yang telah didekripsi, nama file hasil dekripsi adalah dekrip
Spiderman.jpg.
Gambar 4.11 File dekrip Spiderman.jpg dalam Heksadesimal
Hasil dekripsi menunjukkan bahwa susunan heksadesimalnya sesuai dengan file
asli sebelum enkripsi.
4.4.4 Uji Coba dengan Ekstensi File .mp3.
.mp3 merupakan salah satu ekstensi dari file suara yang akan diuji. Berikut
adalah susunan file Firasat.mp3 dalam bentuk heksadesimal yang diuji untuk
dienkripsi.
Gambar 4.12 File Firasat.mp3 dalam Heksadesimal
File Firasat.mp3 setelah dienkripsi beri nama enkrip Firasat. Berikut adalah
file .mp3 yang sudah terenkripsi.
Gambar 4.13 File enkrip Firasat dalam Heksadesimal
Berikut file .mp3 yang telah didekripsi, nama file hasil dekripsi adalah dekrip
Firasat.mp3.
Gambar 4.14 File dekrip Firasat.mp3 dalam Heksadesimal
Hasil dekripsi menunjukkan bahwa susunan heksadesimalnya sesuai dengan file
asli sebelum enkripsi.
4.4.5 Uji Coba dengan Ekstensi File .mp4.
.mp4 merupakan salah satu ekstensi dari file video yang akan diuji.
Berikut adalah susunan file Best in Me.mp4 dalam bentuk heksadesimal yang
diuji untuk dienkripsi.
Gambar 4.15 File Best in Me.mp4 dalam Heksadesimal
File Best in Me.mp4 setelah dienkripsi beri nama enkrip BestInMe. Berikut
adalah file .mp4 yang sudah terenkripsi.
Gambar 4.16 File enkrip BestInMe dalam Heksadesimal
Berikut file .mp4 yang telah didekripsi, nama file hasil dekripsi adalah dekrip
BestInMe.mp4.
Gambar 4.17 File dekrip BestInMe.mp4 dalam Heksadesimal
Hasil dekripsi menunjukkan bahwa susunan heksadesimalnya sesuai dengan file
asli sebelum enkripsi.
4.4.6 Uji Coba Enkripsi-Dekripsi Folder.
Struktur folder berbeda dengan file, di dalam terdapat jumlah file lebih
dari satu. Struktur foder tidak bisa dilihat secara langsung. Berikut adalah
pengujian enkripsi folder dengan nama folder PROPOSAL.
Gambar 4.18 Folder PROPOSAL
Untuk membedakan dengan file yang terenkripsi, maka untuk nama folder yang
sudah terenkripsi diberi nama dengan diakhiri x. Sedangkan untuk penamaan
hasil enkripsi terserah. Penamaan pada folder PROPOSAL menjadi proposalx
Gambar 4.19 Folder enkrip proposalx dalam Heksadesimal
Pada gambar 4.19 merupakan struktur folder yang sudah teracak sehingga folder
tersebut brubah menjadi file yang tidak bisa dimengerti.
Gambar 4.20 Folder dekrip proposal
Pada gambar 4.20 menunjukkan hasil dekripsi dengan dengan nama folder
dekrip proposal. Pada hasil dekripsi tersebut menunjukkan bahwa folder hasil
dekripsi menghasilkan file yang sama dengan folder asli sebelum enkripsi.
4.5 Evaluasi Sistem
Hasil evaluasi yang didapatkan setelah ujicoba yang dilakukan adalah :
a. Twofish merupakan algoritma kriptografi simetris sehingga kunci yang
digunakan pada saat mengenkripsi dan mendekripsi sama.
b. Perangkat lunak yang dibangun berhasil mengenkripsi dan mendekripsi
file maupun folder, rincian hasil enkripsi dan dekripsi dapat dilihat pada
table berikut.
File/Folder Kinerja Enkripsi Kinerja Dekripsi
KRIPTOGRAFI.doc Berhasil Terenkripsi Berhasil Terdekripsi
QuranInWord.exe Berhasil Terenkripsi Berhasil Terdekripsi
Spiderman.jpg Berhasil Terenkripsi Berhasil Terdekripsi
Firasat.mp3 Berhasil Terenkripsi Berhasil Terdekripsi
Best in Me.mp4 Berhasil Terenkripsi Berhasil Terdekripsi
PROPOSAL Berhasil Terenkripsi Berhasil Terdekripsi
Tabel 4.1 Hasil Enkripsi dan Dekripsi
File yang telah dienkripsi berhasil teracak sehingga file tersebut tidak bisa
dimengerti, dan hasil dekripsi sama dengan file asli sebelum dienkripsi.
4.6 Hubungan Kriptografi Dengan Kerahasiaan Menurut Islam
Kriptografi adalah seni untuk mengamankan dan merahasiakan informasi.
Kerahasiaan merupakan aspek yang penting dari ilmu kriptografi sehingga
informasi yang dirahasiakan tetap aman dari orang-orang tidak diperkenankan
untuk mengetahuinya.
Sedangkan kerahasiaan menurut agama Islam merupakan kuasa dari Allah
SWT. Segala rahasia dari yang ada di alam semesta ini merupakan ketentuan dari
Allah SWT. Kelahiran, kematian, rejeki, dan lain-lain sudah ditentukan Allah
SWT yang telah dituliskan di dalam Lauhul Mahfuzh. Namun takdir yang sudah
ditentukanAllah masih bisa dirubah dengan usaha dan doa.
Hasil yang telah diperoleh dari skripsi ini adalah perangkat lunak yang
dibangun telah berhasil mengenkripsi file sehingga tidak file tersebut tidak bisa
dibuka oleh orang yang tidak diperkenankan. Hal ini sudah memenuhi
kerahasiaan yang menjadi salah satu aspek dari kriptografi. Kaitannya dengan
keislaman tentang rahasia bahwa segala yang ada pada alam semesta ini
merupakan rahasia dari Allah SWT yang sudah tertulis di Lauhul Mahfuzh.
BAB V
PENUTUP
5.1 Kesimpulan
Dari hasil penelitian yang didapat maka dapat disimpulkan bahwa:
a. Twofish menggunakan 128 bit setiap blok yang akan dienkripsi. Kunci
yang digunakan dengan panjang maksimal 256 bit dengan menggunakan
kunci simetrik dimana kunci pada saat enkripsi sama dengan dekripsi.
b. Perangkat lunak yang dibangun berhasil mengenkripsi dan mendekripsi
file maupun folder.
c. File yang telah dienkripsi berhasil teracak sehingga file tersebut tidak bisa
dimengerti, dan hasil dekripsi sama dengan file asli sebelum dienkripsi.
5.2 Saran
Untuk pengguna aplikasi ini disarankan untuk mengamankan file yang
dianggap penting untuk keamanan data. Disarankan mengembangkan aplikasi
enkripsi ini dengan menambahkan fitur enkripsi dan dekripsi drive dan dijalankan
pada Local Area Network (LAN) atau jaringan internet.
DAFTAR PUSTAKA
Al-J azairi, Syaikh Abu Bakar J abir. 2009. Tafsir AlQuran Al-Aisar jilid 7.
J akarta: Darus Sunnah Press
Ariyus, Dony. 2006. Kriptografi : Keamanan Data dan Komunikasi. Yogyakarta :
Graha Ilmu
Ariyus, Dony. 2009. Keamanan Multimedia. Yogyakarta : Andi
Dani. Algoritma Twofish Sebagai Finalis AES dan Metode Kriptanalisisnya,
(Online) (http://www.informatika.org/~rinaldi/Kriptografi/2006-
2007/Makalah1 /Makalah1 -006.pdf, diakses 2 Desember 2009)
Kriptografi. (Online), (robby.c.staff.gunadarma.ac.id/Downloads/files/4565
/KRIPTOGRAFI.doc, diakses 25 November 2009)
Mudeng, Denny. Kriptografi Twofish, (Online) (budi.insan.co.id/courses/el7010/
dikmenjur-2004/denny-report.doc, diakses 25 November 2009)
Mukmin, Indra. Algoritma Twofish : kinerja dan implementasinya sebagai salah
satu kandidat algoritma AES (Advanced Encryption Standard), (Online)
(www.informatika.org/~rinaldi/Kriptografi/2006-2007/Makalah1/
Makalah1-006.pdf, diakses 5 November 2009)
Munir, Rinaldi. 2006. Kriptografi. Bandung : Informatika
Octamanullah, Mohamad. Perbandingan Algoritma Kriptografi Kunci Simetrik
BlowFish dan TwoFish, (Online) (http://www.informatika.org/~rinaldi/
Kriptografi/2006-2007/Makalah1/Makalah1-004.pdf, diakses 29
November 2009)
Schneier, Bruce dkk. 1998. Twofish: A128-Bit Block Cipher, (Online)
(http://www.schneier.com/paper-twofish-paper.pdf, diakses 25 November 2009)
Twofish, (Online), (http://prastowo.staff.ugm.ac.id/kuliah/kriptografi/tugas-
akhir/kel7-twofish/kriptoTWOFISH.doc, diakses 25 November 2009)
Lampiran 1
LISTING PROGRAM (MAIN)
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
Buttons, DCPcrypt, UTwofish, ExtCtrls, ComCtrls, ShlObj, FileCtrl;
type
TMainFrm=class(TForm)
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
HashGrp: TGroupBox;
HInFileBox: TEdit;
HInBrowseBtn: TSpeedButton;
HInFileLbl: TLabel;
HOutputLbl: TLabel;
HOutputBox: TEdit;
HHashBtn: TButton;
DCP_twofish1: TDCP_twofish;
OpenDlg: TOpenDialog;
SaveDlg: TSaveDialog;
Shape1: TShape;
StatusBar1: TStatusBar;
Timer1: TTimer;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
CryptGrp: TGroupBox;
CInBrowseBtn: TSpeedButton;
COutBrowseBtn: TSpeedButton;
CAlgorithmLbl: TLabel;
CInFileBox: TEdit;
CAlgorithmCBx: TComboBox;
COutFileBox: TEdit;
CPassphraseBox: TEdit;
CStrings: TMemo;
CEncryptStrBtn: TButton;
CDecryptStrBtn: TButton;
Panel1: TPanel;
Panel5: TPanel;
Panel6: TPanel;
P1: TPanel;
BB2: TBitBtn;
Panel10: TPanel;
TabSheet2: TTabSheet;
Panel11: TPanel;
GroupBox1: TGroupBox;
SpeedButton2: TSpeedButton;
A: TSpeedButton;
Label1: TLabel;
E2: TEdit;
ComboBox1: TComboBox;
E3: TEdit;
E1: TEdit;
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
Panel7: TPanel;
Panel8: TPanel;
Panel9: TPanel;
BTSimpan: TBitBtn;
P2: TPanel;
PB1: TProgressBar;
Pb2: TProgressBar;
CheckBox1: TCheckBox;
H2: TPanel;
H5: TPanel;
Button1: TButton;
SpeedButton1: TSpeedButton;
B: TSpeedButton;
Y: TPanel;
Memo2: TMemo;
E5: TEdit;
L1: TLabel;
Label2: TLabel;
L2: TLabel;
Label4: TLabel;
Tx: TTimer;
procedure FormCreate(Sender: TObject);
procedure CInBrowseBtnClick(Sender: TObject);
procedure COutBrowseBtnClick(Sender: TObject);
procedure HInBrowseBtnClick(Sender: TObject);
procedure CEncryptStrBtnClick(Sender: TObject);
procedure CDecryptStrBtnClick(Sender: TObject);
procedure BB2Click(Sender: TObject);
procedure BTSimpanClick(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure AClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure BClick(Sender: TObject);
procedure TxTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainFrm: TMainFrm;
Waktu:Integer;
implementation
uses
ShellApi, Base64, UFolder, UDeFolder, UTwofish;
{$R *.DFM}
function CompareMem(I1, I2: PByte; Size: integer): boolean;
begin
Result:=true;
repeat
if I1^<>I2^then
begin
Result:=false;
Exit;
end;
Inc(I1);
Inc(I2);
Dec(Size);
until Size=0;
end;
procedure TMainFrm.FormCreate(Sender: TObject);
var
i: integer;
begin
for i:=0 to ComponentCount-1 do
begin
if Components[i] is TDCP_blockcipher then
CAlgorithmCBx.Items.AddObject(TDCP_blockcipher(Components[i]).Algorithm,Components[i])
End;
CAlgorithmCBx.ItemIndex:=0;
HAlgorithmCBx.ItemIndex:=0;
end;
procedure TMainFrm.CInBrowseBtnClick(Sender: TObject);
Var
I: Integer;
Hasil, Jadi, S : String;
begin
If CheckBox1.Checked Then
Begin
Ffolder.ShowModal;
CInFileBox.Text:=Ffolder.DirectoryListBox1.Directory;
Y.Caption:=Ffolder.DirectoryListBox1.Directory;
S:=CInFileBox.Text;
I:=Length( CInFileBox.Text);
Hasil:='';
Repeat
Hasil:=Hasil+S[i];
I:=I-1;
Until ((S[i]='/') Or (S[i]='\') or (I<=1));
Jadi:='';
For I:=Length(Hasil) DownTo 1 Do
BEgin
Jadi:=Jadi+Hasil[i];
End;
H2.Caption:=J adi;
End Else
Begin
if OpenDlg.Execute then
CInFileBox.Text:=OpenDlg.Filename;
End;
end;
procedure TMainFrm.COutBrowseBtnClick(Sender: TObject);
begin
if SaveDlg.Execute then
COutFileBox.Text:=SaveDlg.Filename;
end;
procedure TMainFrm.HInBrowseBtnClick(Sender: TObject);
begin
if OpenDlg.Execute then
HInFileBox.Text:=OpenDlg.Filename;
end;
procedure TMainFrm.CEncryptStrBtnClick(Sender: TObject);
var
i: integer;
Cipher: TDCP_blockcipher;
s: string;
begin
Cipher:=TDCP_blockcipher(CAlgorithmCBx.Items.Objects[CAlgorithmCBx.ItemIndex]);
Cipher.InitStr(CPassphraseBox.Text); // initialize cipher sebagai kuncinya
for i:=0 to CStrings.Lines.Count-1 do
begin
s:=CStrings.Lines[i];
Cipher.EncryptCFB(s[1],s[1],Length(s)); // encrypt semuanya dengan trings
CStrings.Lines[i]:=B64Encode(s);
end;
Cipher.Reset;
Cipher.Burn;
end;
procedure TMainFrm.CDecryptStrBtnClick(Sender: TObject);
var
i: integer;
Cipher: TDCP_blockcipher;
s: string;
begin
Cipher:=TDCP_blockcipher(CAlgorithmCBx.Items.Objects[CAlgorithmCBx.ItemIndex]);
Cipher.InitStr(CPassphraseBox.Text);
for i:=0 to CStrings.Lines.Count-1 do
begin
s:=B64Decode(CStrings.Lines[i]);
Cipher.DecryptCFB(S[1],S[1],Length(S));
CStrings.Lines[i]:=s;
end;
Cipher.Reset;
Cipher.Burn;
end;
procedure TMainFrm.BB2Click(Sender: TObject);
var
Source, Dest: file;
Buffer: array[0..8191] of byte;
Encrypt: TDCP_blockcipher;
Read: integer;
A, B, C : TTime;
begin
Waktu:=0;
Tx.Enabled:=True;
A:=NOw;
if CPassphraseBox.Text='' then
begin
MessageDlg('Masukkan Passwordnya !!',mtInformation,[mbOK],0);
CPassphraseBox.SetFocus;
Exit;
end;
PB2.Position:=5;
Sleep(10);
if CInFileBox.Text='' then
begin
MessageDlg('Masukkan File Input..........',mtInformation,[mbOK],0);
CInFileBox.SetFocus;
Exit;
end
else if COutFileBox.Text='' then
begin
MessageDlg('Masukkan File Output.........',mtInformation,[mbOK],0);
COutFileBox.SetFocus;
Exit;
end
else if COutFileBox.Text=CInFileBox.Text then
begin
MessageDlg('Harus beda dong, file input dan Output....',mtInformation,[mbOK],0);
COutFileBox.SetFocus;
COutFileBox.SelectAll;
Exit;
end;
If CheckBox1.Checked Then
Begin
AssignFile(Source,H5.Caption);
End Else
Begin
AssignFile(Source,CInFileBox.Text);
End;
try
Reset(Source,1);
except
MessageDlg('File tidak bisa dikenali....',mtInformation,[mbOK],0);
Exit;
end;
Application.ProcessMessages;
If CheckBox1.Checked Then
AssignFile(Dest,COutFileBox.text+'x') Else
AssignFile(Dest,COutFileBox.Text);
Application.ProcessMessages;
try
Rewrite(Dest,1);
except
CloseFile(Source);
MessageDlg('Tidak Bisa membuak File Output....',mtInformation,[mbOK],0);
Exit;
end;
Application.ProcessMessages;
PB2.Position:=15;
Sleep(10);
Application.ProcessMessages;
Application.ProcessMessages;
PB2.Position:=25;
Sleep(10);
Application.ProcessMessages;
Encrypt:=TDCP_blockcipher(CAlgorithmCBx.Items.Objects[CAlgorithmCBx.ItemIndex]);
else
PB2.Position:=55;
Sleep(10);
Application.ProcessMessages;
Application.ProcessMessages;
Encrypt.Reset;
repeat
Application.ProcessMessages;
BlockRead(Source,Buffer,Sizeof(Buffer),Read);
Encrypt.EncryptCBC(Buffer,Buffer,Read);
BlockWrite(Dest,Buffer,Read);
until Read<>Sizeof(Buffer);
PB2.Position:=75;
Sleep(10);
Application.ProcessMessages;
Encrypt.Burn;
PB2.Position:=100;
Sleep(10);
Application.ProcessMessages;
CloseFile(Source);
CloseFile(Dest);
B:=NOw;
C:=B-A;
Tx.Enabled:=False;
L1.Caption:=Inttostr(Waktu);
MessageDlg('File Telah Sukses Di Encrypt',mtInformation,[mbOK],0);
CPassphraseBox.Text:='';
CInFileBox.Text:='';
COutFileBox.Text:='';
PB2.Position:=0;
Sleep(10);
end;
Procedure fileCopyx ( sourcefilename, targetfilename:string);
var
s, T:Tfilestream;
begin
s :=TFilestream.Create(sourcefilename,fmopenread);
try
T:=Tfilestream.Create(targetfilename, fmopenwrite or fmcreate);
try
T.CopyFrom(s, s.size);
finally
T.Free;
end;
finally
S.Free;
end;
End;
procedure TMainFrm.BTSimpanClick(Sender: TObject);
var
I : Integer;
Source, Dest: file;
Buffer: array[0..8191] of byte;
Decrypt: TDCP_blockcipher;
Read: integer;
A,B: Pchar;
AA, BB, CC : TTime;
begin
Waktu:=0;
Tx.Enabled:=True;
AA:=Now;
Application.ProcessMessages;
If E3.Visible=True Then
Begin
PB1.Position:=10;
Sleep(10);
if E2.Text='' then
begin
MessageDlg('Masukkan File...',mtInformation,[mbOK],0);
PB1.Position:=0;
E2.SetFocus;
Exit;
end
else if E3.Text='' then
begin
MessageDlg('Masukkan File Output.....',mtInformation,[mbOK],0);
PB1.Position:=0;
E3.SetFocus;
Exit;
end
else if E3.Text=E2.Text then
begin
MessageDlg('Harus beda dong, file input dan Output....',mtInformation,[mbOK],0);
PB1.Position:=0;
E3.SetFocus;
E3.SelectAll;
Exit;
end;
Application.ProcessMessages;
AssignFile(Source,E2.Text);
try
Reset(Source,1);
except
MessageDlg('File Tidak Bisa dikenali.......',mtInformation,[mbOK],0);
PB1.Position:=0;
Exit;
end;
AssignFile(Dest,E3.Text);
try
Rewrite(Dest,1);
except
CloseFile(Source);
MessageDlg('File tidak bisa dibuka',mtInformation,[mbOK],0);
PB1.Position:=0;
Exit;
end;
PB1.Position:=20;
Sleep(10);
Application.ProcessMessages;
Decrypt:=TDCP_blockcipher(CAlgorithmCBx.Items.Objects[CAlgorithmCBx.ItemIndex]);
else
PB1.Position:=50;
Application.ProcessMessages;
Sleep(10);
Application.ProcessMessages;
Decrypt.Reset;
Application.ProcessMessages;
PB1.Position:=80;
Sleep(10);
Application.ProcessMessages;
begin
CloseFile(Source);
CloseFile(Dest);
Application.ProcessMessages;
Decrypt.Burn;
MessageDlg('Password Salah..........',mtInformation,[mbOK],0);
PB1.Position:=0;
Exit;
end;
repeat
BlockRead(Source,Buffer,Sizeof(Buffer),Read);
Decrypt.DecryptCBC(Buffer,Buffer,Read);
BlockWrite(Dest,Buffer,Read);
PB1.Position:=90;
Application.ProcessMessages;
Sleep(10);
until Read<>Sizeof(Buffer);
PB1.Position:=100;
Sleep(10);
Decrypt.Burn;
CloseFile(Source);
Application.ProcessMessages;
CloseFile(Dest);
End Else
Begin
if not DirectoryExists(E5.Text) then
if not CreateDir(E5.Text) then
raise Exception.Create('Tidak bisa membuat folder');
Application.ProcessMessages;
Begin
For I:=0 To Ffolder.FB.Count-1 DO
Begin
Memo2.Lines.Add(Ffolder.FB.Items.GetText);
A:=Pchar(Y.Caption+'\'+Ffolder.FB.Items[i]);
B:=Pchar(E5.Text+'\'+Ffolder.FB.Items[i]);
CopyFile(A,B, True);
Application.ProcessMessages;
End;
End;
End;
Application.ProcessMessages;
E5.Text:='';
BB:=Now;
CC:=BB-AA;
Tx.Enabled:=False;
L2.Caption:=Inttostr(Waktu);
MessageDlg('File Telah Di Decrypt',mtInformation,[mbOK],0);
PB1.Position:=0;
E1.Text:='';
E2.Text:='';
E3.Text:='';
PB1.Position:=0;
end;
procedure TMainFrm.SpeedButton2Click(Sender: TObject);
begin
if OpenDlg.Execute then
E2.Text:=OpenDlg.Filename;
If COpY(E2.Text,Length(E2.Text),1) ='x' then
Begin
A.Visible:=False;
E3.Visible:=False;
B.Visible:=TRue;
E5.Visible:=TRue;
End Else
Begin
A.Visible:=TRue;
E3.Visible:=TRue;
B.Visible:=False;
E5.Visible:=False;
End;
end;
procedure TMainFrm.AClick(Sender: TObject);
begin
if SaveDlg.Execute then
E3.Text:=SaveDlg.Filename;
end;
procedure TMainFrm.Timer1Timer(Sender: TObject);
begin
If P1.Color=clBtnFace Then P1.Color:=clRed Else P1.Color:=clBtnFace;
If P2.Color=clBtnFace Then P2.Color:=clRed Else P2.Color:=clBtnFace;
StatusBar1.Panels[0].Text:=FOrmatDatetIme('Dd/mm/yyyy',Date);
StatusBar1.Panels[1].Text:=FOrmatDatetIme('hh:mm:ss',time);
end;
procedure TMainFrm.FormShow(Sender: TObject);
begin
PageControl1.ActivePageIndex:=0;
Tx.Enabled:=False;
end;
function BrowseForFolder(var Folder: String; Title: String): Boolean;
var
BrowseInfo: TBrowseInfo;
ItemIDList: PItemIDList;
DisplayName: array[0..MAX_PATH] of Char;
begin
Result :=False;
FillChar(BrowseInfo, SizeOf(BrowseInfo), #0);
with BrowseInfo do begin
hwndOwner :=Application.Handle;
pszDisplayName :=@DisplayName[0];
lpszTitle :=PChar(Title);
ulFlags :=BIF_RETURNONLYFSDIRS;
end;
ItemIDList :=SHBrowseForFolder(BrowseInfo);
if Assigned(ItemIDList) then
if SHGetPathFromIDList(ItemIDList, DisplayName) then begin
Folder :=DisplayName;
Result :=True;
end;
end;
procedure TMainFrm.CheckBox1Click(Sender: TObject);
begin
CInFileBox.Text:='';
if CheckBox1.Checked Then
Begin
CInBrowseBtn.Caption:='Folder';
E5.Visible:=True;
End Else
Begin
CInBrowseBtn.Caption:='File';
E5.Visible:=False;
ENd;
end;
procedure TMainFrm.Button1Click(Sender: TObject);
var
NewFileName: string;
Msg: string;
NewFile: TFileStream;
OldFile: TFileStream;
begin
NewFileName :=ExtractFilePath(Application.ExeName) +ExtractFileName(CInFileBox.Text);
Msg :=Format('Copy %s to %s?', [CInFileBox.Text, NewFileName]);
if MessageDlg(Msg, mtCustom, mbOKCancel, 0) =mrOK then
begin
OldFile :=TFileStream.Create(CInFileBox.Text, fmOpenRead or fmShareDenyWrite);
try
NewFile :=TFileStream.Create(NewFileName, fmCreate or fmShareDenyRead);
try
NewFile.CopyFrom(OldFile, OldFile.Size);
finally
FreeAndNil(NewFile);
end;
finally
FreeAndNil(OldFile);
end;
end;
end;
procedure TMainFrm.BClick(Sender: TObject);
begin
FDeFolder.ShowModal;
E5.Text:=FDeFolder.DirectoryListBox1.Directory;
end;
procedure TMainFrm.TxTimer(Sender: TObject);
begin
Waktu:=Waktu+1;
Application.ProcessMessages;
end;
end.
Lampiran 2
LISTING ALGORITMA TWOFISH
Unit UTwofish;
Interface
Procedure AturKunci(const AturKunci:String);
Procedure TambahBit;
Procedure Enkrip_File(const fname1, fname2:string; const KeyWord:String);
Procedure Dekrip_File(const fname1, fname2:string; const KeyWord:String; checking:boolean);
Implementation
Uses
Sysutils, dialogs, forms;
Type
Word =Array[0..3]of byte;
Empword=Array[0..3]of Word;
Block16 =Array[0..3]of LWord;
Mat4x4=Array[0..3, 0..3]of byte;
Mat4x8=Array[0..3, 0..7]of byte;
const
t0q0 : Array[0..15]of Byte=
( $08, $01, $07, $0D, $06, $0F, $03, $02, $00, $0B, $05, $09, $0E, $0C, $0A, $04);
t1q0 : Array[0..15]of Byte=
( $0E, $0C, $0B, $08, $01, $02, $03, $05, $0F, $04, $0A, $06, $07, $00, $09, $0D);
t2q0 : Array[0..15]of Byte=
( $0B, $0A, $05, $0E, $06, $0D, $09, $00, $0C, $08, $0F, $03, $02, $04, $07, $01);
t3q0 : Array[0..15]of Byte=
( $0D, $07, $0F, $04, $01, $02, $06, $0E, $09, $0B, $03, $00, $08, $05, $0C, $0A);
t0q1 : Array[0..15]of Byte=
( $02, $08, $0B, $0D, $0F, $07, $06, $0E, $03, $01, $09, $04, $00, $0A, $0C, $05);
t1q1 : Array[0..15]of Byte=
( $01, $0E, $02, $0B, $04, $0C, $03, $07, $06, $0D, $0A, $05, $0F, $09, $00, $08);
t2q1 : Array[0..15]of Byte=
( $04, $0C, $07, $05, $01, $06, $09, $0A, $00, $0E, $0D, $08, $02, $0B, $03, $0F);
t3q1 : Array[0..15]of Byte=
( $0B, $09, $05, $01, $0C, $03, $0D, $0E, $06, $04, $07, $0F, $02, $00, $08, $0A);
M5B :Array[0..255]of Byte=(
$00, $5B, $B6, $ED, $05, $5E, $B3, $E8, $0A, $51, $BC, $E7, $0F, $54, $B9, $E2,
$14, $4F, $A2, $F9, $11, $4A, $A7, $FC, $1E, $45, $A8, $F3, $1B, $40, $AD, $F6,
$28, $73, $9E, $C5, $2D, $76, $9B, $C0, $22, $79, $94, $CF, $27, $7C, $91, $CA,
$3C, $67, $8A, $D1, $39, $62, $8F, $D4, $36, $6D, $80, $DB, $33, $78, $85, $DE,
$50, $0B, $E6, $BD, $55, $0E, $E3, $B8, $5A, $01, $EC, $B7, $5F, $04, $E9, $B2,
$44, $1F, $F2, $A9, $41, $1A, $F7, $AC, $4E, $15, $F8, $A3, $4B, $10, $FD, $A6,
$78, $23, $CE, $95, $7D, $26, $CB, $90, $72, $29, $C4, $9F, $77, $2C, $C1, $9A,
$6C, $37, $DA, $81, $69, $32, $DF, $84, $66, $3D, $D0, $8B, $63, $38, $D5, $8E,
$A0, $FB, $16, $4D, $A5, $FE, $13, $48, $AA, $F1, $1C, $47, $AF, $F4, $19, $42,
$B4, $EF, $02, $59, $B1, $EA, $07, $5C, $BE, $E5, $08, $53, $BB, $E0, $0D, $56,
$88, $D3, $3E, $65, $8D, $D6, $3B, $60, $82, $D9, $34, $6F, $87, $DC, $31, $6A,
$9C, $C7, $2A, $71, $99, $C2, $2F, $74, $96, $CD, $20, $7B, $93, $C8, $25, $7E,
$F0, $AB, $46, $1D, $F5, $AE, $43, $18, $F4, $A1, $4C, $17, $FF, $A4, $49, $12,
$E4, $BF, $52, $09, $E1, $BA, $57, $0C, $EE, $B5, $58, $03, $EB, $B0, $5D, $06,
$D8, $83, $6E, $35, $DD, $86, $6B, $30, $D2, $89, $64, $3F, $D7, $8C, $61, $3A,
$CC, $97, $7A, $21, $C9, $92, $7F, $24, $C6, $9D, $70, $2B, $C3, $98, $75, $2E);
MEF :Array[0..255]of Byte=(
$00, $EF, $B7, $58, $07, $E8, $B0, $5F, $0E, $E1, $B9, $56, $09, $E6, $BE, $51,
$1C, $F3, $AB, $44, $1B, $F4, $AC, $43, $12, $FD, $A5, $4A, $15, $FA, $A2, $4D,
$38, $D7, $8F, $60, $3F, $D0, $88, $67, $36, $D9, $81, $6E, $31, $DE, $86, $69,
$24, $CB, $93, $7C, $23, $CC, $94, $7B, $2A, $C5, $9D, $72, $2D, $C2, $9A, $75,
$70, $9F, $C7, $28, $77, $98, $C0, $2F, $7E, $91, $C9, $26, $79, $96, $CE, $21,
$6C, $83, $DB, $34, $6B, $84, $DC, $33, $62, $8D, $D5, $3A, $65, $8A, $D2, $3D,
$48, $A7, $FF, $10, $4F, $A0, $F8, $17, $46, $A9, $F1, $1E, $41, $AE, $F6, $19,
$54, $BB, $E3, $0C, $53, $BC, $E4, $0B, $5A, $B5, $ED, $02, $5D, $B2, $EA, $05,
$E0, $0F, $57, $B8, $E7, $08, $50, $BF, $EE, $01, $59, $B6, $E9, $06, $5E, $B1,
$FC, $13, $4B, $A4, $FB, $14, $4C, $A3, $F2, $1D, $45, $AA, $F5, $1A, $42, $AD,
$D8, $37, $6F, $80, $DF, $30, $68, $87, $D6, $39, $61, $8E, $D1, $3E, $66, $89,
$C4, $2B, $73, $9C, $C3, $2C, $74, $9B, $CA, $25, $7D, $92, $CD, $22, $7A, $95,
$90, $7F, $27, $C8, $97, $78, $20, $CF, $9E, $71, $29, $C6, $99, $76, $2E, $C1,
$8C, $63, $3B, $D4, $8B, $64, $3C, $D3, $82, $6D, $35, $DA, $85, $6A, $32, $DD,
$A8, $47, $1F, $F0, $AF, $40, $18, $F7, $A6, $49, $11, $FE, $A1, $4E, $16, $F9,
$B4, $5B, $03, $EC, $B3, $5C, $04, $EB, $BA, $55, $0D, $E2, $BD, $52, $0A, $E5);
RS :Mat4x8=(($01, $A4, $55, $87, $5A, $58, $DB, $9E),
($A4, $56, $82, $F3, $1E, $C6, $68, $E5),
($02, $A1, $FC, $C1, $47, $AE, $3D, $19),
($A4, $55, $87, $5A, $58, $DB, $9E, $03));
var
m : Array[0..31]of byte;
JadKunci : Array[0..39]of LWord;
TambahPanjang : byte;
VectorMe, VectorMo : EmpWord;
VectorS : EmpWord;
Function gf(a,b,p:Lword):Lword;
var
hasil:Lword;
begin
hasil:=0;
while (a<>0) do
begin
if (a and 1)=1 then hasil:=hasil xor b;
a:=a shr 1;
b:=b shl 1;
if (b and $100)=$100 then b:=b xor p;
end;
Result:=hasil and $FF;
end;
procedure Persiapan_VectorM;
var
i, j :byte;
begin
fillchar(VectorMe, sizeof(VectorMe), 0);
fillchar(VectorMo, sizeof(VectorMo), 0);
For i :=0 to PanjangKunci-1 do
For j :=0 to 3 do
begin
VectorMe [i,j] :=m[4*(2*i)+j];
VectorMo [i,j] :=m[4*(2*i+1)+j];
end;
end;
procedure Hitung_VectorS;
var
I, baris, kolom :byte;
begin
fillchar(VectorS, sizeof(VectorS),0);
for i:=0 to PanjangKunci-1 do
for baris:=0 to 3 do
for kolom:=0 to 7 do
VectorS[(PanjangKunci-1)-i,baris]:=VectorS[(PanjangKunci-1)-I,baris] xor gf_mult(RS[baris,
kolom], m[8*i+kolom], 333);
end;
function h(x:LWord; L:EmpWord) :LWord;
var
y, Output :Word;
OutputL :Lword;
q0 : begin
a[0] :=x/16;
b[0] :=x;
a[1] :=a[0] XOR b[0];
b[1] :=a[0] XOR b[0] shr 1 xor 8[a[0]];
a[2] :=t0q0[a[1]];
b[2] : =t1q0[b[1]];
a[3] :=a[2] XOR b[2];
b[3] :=a[2] XOR b[2] shr 1 xor 8[a[2]];
a[4] :=t2q0[a[3]];
b[4] :=t3q0[b[3]];
y :=16[b[4]] +a[4]
end
q1 : begin
a[0] :=x/16;
b[0] :=x;
a[1] :=a[0] XOR b[0];
b[1] :=a[0] XOR b[0] shr 1 xor 8[a[0]];
a[2] :=t0q1[a[1]];
b[2] : =t1q1[b[1]];
a[3] :=a[2] XOR b[2];
b[3] :=a[2] XOR b[2] shr 1 XOR 8[a[2]];
a[4] :=t2q1[a[3]];
b[4] :=t3q1[b[3]];
y :=16[b[4]] +a[4]
end
case PanjangKunci of
2:begin
y[0] :=q1[q0[q0[y[0]XOR L[1,0]]XOR L[0,0]]];
y[1] :=q0[q0[q1[y[1]XOR L[1,0]]XOR L[0,0]]];
y[2] :=q1[q1[q0[y[2]XOR L[1,0]]XOR L[0,0]]];
y[3] :=q0[q1[q1[y[3]XOR L[1,0]]XOR L[0,0]]];
End;
3:begin
y[0] :=q1[q0[q0[q1[y[0] XOR L[2,0]]XOR L[1,0]]XOR L[0,0]]];
y[1] :=q0[q0[q1[q1[y[1] XOR L[2,0]]XOR L[1,0]]XOR L[0,0]]];
y[2] :=q1[q1[q0[q0[y[2] XOR L[2,0]]XOR L[1,0]]XOR L[0,0]]];
y[3] :=q0[q1[q1[q0[y[3] XOR L[2,0]]XOR L[1,0]]XOR L[0,0]]];
end;
4:begin
y[0] :=q1[q0[q0[q1[q1[y[0] XOR L[3,0]] XOR L[2,0]] XOR L[1,0]] XOR L [0,0]]];
y[1] :=q0[q0[q1[q1[q0[y[1] XOR L[3,0]] XOR L[2,0]] XOR L[1,0]] XOR L [0,0]]];
y[2] :=q1[q1[q0[q0[q0[y[2] xor L[3,0]] XOR L[2,0]] XOR L[1,0]] XOR L [0,0]]];
y[3] :=q0[q1[q1[q0[q1[y[3] xor L[3,0]] XOR L[2,0]] XOR L[1,0]] XOR L [0,0]]];
end;
end;
fillchar(Output, sizeof(Output), 0);
Output[0] :=(y[0] XOR (MEF[y[1]]) XOR (M5B[y[2]]) XOR (M5B[y[3]]));
Output[1] :=(M5B[y[0]] XOR (MEF[y[1]]) XOR (MEF[y[2]]) XOR (y[3]));
Output[2] :=(MEF[y[0]] XOR M5B[y[1]]) XOR y[2] XOR (MEF[y[3]]);
Output[3] :=(MEF[y[0]] XOR y[1] XOR (MEF[y[2]]) XOR (M5B[y[3]]));
move(Output[0], OutputL, 4);
Result :=OutputL;
end;
Function RoL (x:LWord; n:byte) :LWord;
begin
RoL:=(x shl n) OR (x shr (32-n));
end;
Function RoR (x:LWord; n:byte) :LWord;
begin
RoR:=(x shr n) OR (x shl (32-n));
end;
procedure Hitung_JadKunci;
var
p :LWord;
Ai, Bi, K2i, K2i1 :LWord;
i :byte;
begin
fillchar(K2i, sizeof(K2i),0);
fillchar(K2i1, sizeof(K2i1),0);
p:=0;
for i:=0 to 19 do
begin
fillchar(p,sizeof(p),0);
p:=p+$01010101;
Ai:=h(p, VectorMe);
p:=p+$01010101;
Bi:=RoL(h(p, VectorMo), 8);
JadKunci[i+i]:=Ai+Bi;
JadKunci[i+i+1]:=RoL(Bi+Bi+Ai, 9);
end;
end;
procedure AturKunci(const KeyWord:String);
begin
fillchar(m, sizeof(m), 0);
move(KeyWord[1], m[0], Length(KeyWord));
case Length(KeyWord) of
0..16 :TambahPanjang:=2;
17..24 :TambahPanjang:=3;
25..32 :TambahPanjang:=4;
end;
Persiapan_VectorM;
Hitung_VectorS;
Hitung_JadKunci;
end;
procedure TambahBit;
begin
fillchar(m, sizeof(m), 0);
fillchar(VectorMe, sizeof(VectorMe), 0);
fillchar(VectorMo, sizeof(VectorMo), 0);
fillchar(VectorS, sizeof(VectorS), 0);
fillchar(JadKunci, sizeof(JadKunci), 0);
end;
procedure InputWhitening(var Output:Block16);
begin
Output[0] :=Output[0] XOR JadKunci[0];
Output[1] :=Output[1] XOR JadKunci[1];
Output[2] :=Output[2] XOR JadKunci[2];
Output[3] :=Output[3] XOR JadKunci[3];
end;
procedure OutputWhitening(var Output:Block16);
begin
Output[0] :=Output[0] XOR JadKunci[4];
Output[1] :=Output[1] XOR JadKunci[5];
Output[2] :=Output[2] XOR JadKunci[6];
Output[3] :=Output[3] XOR JadKunci[7];
end;
procedure SwapBlock(var Blok:Block16);
var
Temp :Array[0..1]of LWord;
begin
Temp[0] :=Blok[0];
Temp[1] :=Blok[1];
Blok[0] :=Blok[2];
Blok[1] :=Blok[3];
Blok[2] :=Temp[0];
Blok[3] :=Temp[1];
end;
Function Enc_Block(Blok:Block16) :Block16;
var
i :byte;
T0, T1 :LWord;
begin
InputWhitening(Blok);
for i:=0 to 7 do
begin
T0 :=h(Blok[0], Vectors);
T1 :=h(RoL(Blok[1], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+8];
F1 :=T0+T1+T1+J adKunci[4*i+9];
blok[2] :=RoR (T0 xor blok[2], 1);
blok[3] :=T1 xor RoL (blok[3], 1);
T0 :=h(blok[2], VectorS);
T1 :=h(RoL(Blok[3], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+10];
F1 :=T0+T1+T1+J adKunci[4*i+11];
blok[0] :=RoR (T0 xor blok[0], 1);
blok[1] :=T1 xor RoL (blok[1], 1);
end;
SwapBlock(Blok);
OutputWhitening(Blok);
BlokEnkrip:=Blok;
end;
Function Dec_Block(Blok:Block16) :Block16;
var
i :byte;
T0, T1 :LWord;
begin
OutputWhitening(Blok);
for i :=7 downto 0 do
begin
T0 :=h(Blok[0], VectorS);
T1 :=h(RoL(Blok[1], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+10];
F1 :=T0+T1+T1+J adKunci[4*i+11];
blok[2] :=RoL (blok[2], 1) xor T0;
blok[3] :=RoR ((blok[3] xor T1), 1);
T0 :=h(blok[2], VectorS);
T1 :=h(RoL(Blok[3], 8), VectorS);
F0 :=T0+T1+J adKunci[4*i+8];
F1 :=T0+T1+T1+J adKunci[4*i+9];
blok[0] :=RoL (blok[0], 1) xor T0;
blok[1] :=RoR ((blok[1] xor T1), 1);
end;
SwapBlock(Blok);
InputWhitening(Blok);
BlokDekrip:=Blok;
end;