Algoritma TTVC (Triple Transposition Vigenere Cipher) adalah salah satu algoritma yang dapat digunakan untuk melakukan enkripsi data sehingga data asli hanya dapat dibaca oleh seseorang yang memiliki kunci enkripsi tersebut. Contoh yang dibahas kali ini adalah mengenai enkripsi dan dekripsi dari sebuah kalimat.
Algoritma ini merupakan modifikasi Algoritma Vigenere Cipher. Modifikasi yang dilakukan adalah menambahkan proses transposisi teks input sebelum proses substitusi sebagai proses utama dari algoritma Vigenere Cipher, dan kemudian mengulangi proses transposisi-substitusi sebanyak 3 kali untuk mendapatkan jawaban.
Langkah-langkah penggunaan algoritma ini adalah
1. Tentukan kalimat yang akan dienkrip
Console.WriteLine("Masukkan kalimat yang akan dienkrip: ") Dim input As String = Console.ReadLine
2. Tentukan kata kunci enkripsi yang digunakan
Console.WriteLine("Masukkan kata kunci enkripsi: ") Dim kataKunci As String = Console.ReadLine
3. Lakukan inisialisasi variabel yang digunakan oleh metode ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim ttvc As New TTVC()
4. Lakukan enkripsi kalimat awal menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 4a – 4c)
Dim hasilEnkripsi As String = ttvc.enkripsi(input, kataKunci)
4a. Dapatkan nilai panjang kunci secara acak untuk digunakan sebagai jumlah kolom pada saat proses transposisi
Nilai panjang kunci harus kurang dari panjang kata kunci dan panjang pesan
Dim jumlahKolom As Integer = 0 If kataKunci.Length = 1 Then jumlahKolom = 1 Else jumlahKolom = rnd.Next(1, kataKunci.Length) End If
* Lakukan proses transposisi dan substitusi secara bergantian sebanyak 3 kali
Penjelasan lebih detail tentang masing-masing fungsi dapat dilihat pada penjelasan skrip dibawah ini (poin 4b dan 4c)
Dim hasil As String = teks For i As Integer = 0 To 2 hasil = transposisi(hasil, jumlahKolom) hasil = substitusi(hasil, kataKunci) Next
* Implementasi fungsi transposisi adalah sebagai berikut
4b1. Lakukan pembagian teks ke dalam matriks karakter
Jika terdapat sel matriks yang tidak memiliki isi, maka beri nilai untuk karakter tersebut dengan karakter kosong
Dim jumlahBaris As Integer = Math.Truncate(teks.Length / jumlahKolom) + IIf(teks.Length Mod jumlahKolom > 0, 1, 0) Dim idxTeks As Integer = 0 Dim matriks(jumlahBaris - 1)() As Char For i As Integer = 0 To jumlahBaris - 1 matriks(i) = New Char(jumlahKolom - 1) {} For j As Integer = 0 To jumlahKolom - 1 If idxTeks > teks.Length - 1 Then matriks(i)(j) = Chr(10) Else matriks(i)(j) = teks(idxTeks) idxTeks += 1 End If Next Next
4b2. Lakukan transposisi matriks karakter tersebut
Dim hasil As String = "" For i As Integer = 0 To jumlahKolom - 1 For j As Integer = 0 To jumlahBaris - 1 hasil &= matriks(j)(i) Next Next
* Implementasi fungsi substitusi adalah sebagai berikut
4c1. Lakukan penggandaan kata kunci apabila panjang kata kunci kurang dari panjang pesan
Kata kunci akan digandankan sampai jumlah karakternya sama dengan panjang pesan
Dim kelipatan As Integer = Math.Truncate(teks.Length / katakunci.Length) + IIf(teks.Length Mod katakunci.Length > 0, 1, 0) Dim duplikasiKataKunci As String = "" For i As Integer = 0 To kelipatan - 1 duplikasiKataKunci &= katakunci Next katakunci = duplikasiKataKunci.Substring(0, teks.Length)
4c2. Dapatkan nilai byte dari pesan dan kata kunci
Dim byteTeks() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(teks) Dim byteKataKunci() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(katakunci)
4c3. Lakukan penggantian indeks byte dari pesan dan kata kunci
dengan cara mengurangi setiap byte dengan 20h sebagai nilai terendah dari urutan printable character pada tabel ascii
tetapi perlu diingat untuk karakter Ah harus berada pada indeks pertama
sehingga semua byte akan ditambah angka 1 kecuali karakter Ah tersebut
For i As Integer = 0 To byteTeks.Length - 1 If byteTeks(i) - Convert.ToInt32("20", 16) + 2 < 0 Then byteTeks(i) = 1 Else byteTeks(i) = byteTeks(i) - Convert.ToInt32("20", 16) + 2 End If Next For i As Integer = 0 To byteKataKunci.Length - 1 If byteKataKunci(i) - Convert.ToInt32("20", 16) + 2 < 0 Then byteKataKunci(i) = 1 Else byteKataKunci(i) = byteKataKunci(i) - Convert.ToInt32("20", 16) + 2 End If Next
4c4. Dapatkan jumlah maksimum karakter yang tersedia yaitu karakter Ah dan karakter 20h - 7Eh
Dim maksIdxKarakter As Byte = Convert.ToInt32("7E", 16) - Convert.ToInt32("20", 16) + 2
4c5. Lakukan pergeseran indeks pesan dengan cara menambahkan indeks pesan dengan indeks kata kunci
Tetapi apabila nilai indeks berada diluar dari jumlah maksimum karakter yang tersedia,
maka kembalikan nilai indeksnya menjadi indeks awal
Dim byteSubstitusi(teks.Length - 1) As Byte For i As Integer = 0 To teks.Length - 1 If byteTeks(i) + byteKataKunci(i) > maksIdxKarakter Then byteSubstitusi(i) = byteTeks(i) + byteKataKunci(i) - maksIdxKarakter Else byteSubstitusi(i) = byteTeks(i) + byteKataKunci(i) End If Next
4c6. Lakukan pengembalian indeks pesan kembali menjadi indeks pesan semula
dengan cara menambahkan setiap indeks dengan 20h sebagai nilai terendah dari urutan printable character pada tabel ascii
tetapi perlu diingat apabila indeks karakter tersebut berada diluar rentang dari karakter 20h - 7Eh,
maka indeks karakter tersebut akan dikembalikan menjadi indeks karakter pertama, yaitu karakter Ah.
For i As Integer = 0 To byteSubstitusi.Length - 1 If byteSubstitusi(i) + Convert.ToInt32("20", 16) - 2 > Convert.ToInt32("7E", 16) Then byteSubstitusi(i) = Convert.ToInt32("A", 16) Else byteSubstitusi(i) = byteSubstitusi(i) + Convert.ToInt32("20", 16) - 2 End If Next
4c7. Dapatkan posisi dimana karakter kosong ditemukan
dan biarkan posisi karakter ini adalah karakter kosong (karena karakter ini terkena proses substitusi diatas)
For i As Integer = 0 To byteSubstitusi.Length - 1 If teks(i) = Chr(10) Then byteSubstitusi(i) = 10 Next
5. Lakukan dekripsi dari kalimat yang telah terenkripsi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini (poin 5a - 5d)
Dim hasilDekripsi As String = ttvc.dekripsi(hasilEnkripsi, kataKunci)
5a. Dapatkan nilai panjang kunci secara acak untuk digunakan sebagai jumlah kolom pada saat proses transposisi
Nilai panjang kunci harus kurang dari panjang kata kunci dan panjang pesan
Dim jumlahKolom As Integer = 0 If kataKunci.Length = 1 Then jumlahKolom = 1 Else jumlahKolom = rnd.Next(1, kataKunci.Length) End If
* Lakukan proses de-substitusi dan de-transposisi secara bergantian sebanyak 3 kali
Penjelasan lebih detail tentang masing-masing fungsi dapat dilihat pada penjelasan skrip dibawah ini (poin 5b dan 5c)
Dim hasil As String = teks For i As Integer = 0 To 2 hasil = desubstitusi(hasil, kataKunci) hasil = detransposisi(hasil, jumlahKolom) Next
* Implementasi fungsi de-substitusi adalah sebagai berikut
5b1. Lakukan penggandaan kata kunci apabila panjang kata kunci kurang dari panjang pesan
Kata kunci akan digandankan sampai jumlah karakternya sama dengan panjang pesan
Dim kelipatan As Integer = Math.Truncate(teks.Length / katakunci.Length) + IIf(teks.Length Mod katakunci.Length > 0, 1, 0) Dim duplikasiKataKunci As String = "" For i As Integer = 0 To kelipatan - 1 duplikasiKataKunci &= katakunci Next katakunci = duplikasiKataKunci.Substring(0, teks.Length)
5b2. Dapatkan nilai byte dari pesan dan kata kunci
Dim byteTeks() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(teks) Dim byteKataKunci() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(katakunci)
5b3. Lakukan penggantian indeks byte dari pesan dan kata kunci
dengan cara mengurangi setiap byte dengan 20h sebagai nilai terendah dari urutan printable character pada tabel ascii
tetapi perlu diingat untuk karakter Ah harus berada pada indeks pertama
sehingga semua byte akan ditambah angka 1 kecuali karakter Ah tersebut
For i As Integer = 0 To byteTeks.Length - 1 If byteTeks(i) - Convert.ToInt32("20", 16) + 2 < 0 Then byteTeks(i) = 1 Else byteTeks(i) = byteTeks(i) - Convert.ToInt32("20", 16) + 2 End If Next For i As Integer = 0 To byteKataKunci.Length - 1 If byteKataKunci(i) - Convert.ToInt32("20", 16) + 2 < 0 Then byteKataKunci(i) = 1 Else byteKataKunci(i) = byteKataKunci(i) - Convert.ToInt32("20", 16) + 2 End If Next
5b4. Dapatkan jumlah maksimum karakter yang tersedia yaitu karakter Ah dan karakter 20h - 7Eh
Dim maksIdxKarakter As Byte = Convert.ToInt32("7E", 16) - Convert.ToInt32("20", 16) + 2
5b5. Lakukan pergeseran indeks pesan dengan cara mengurangi indeks pesan dengan indeks kata kunci
Tetapi apabila nilai indeks berada diluar dari jumlah maksimum karakter yang tersedia,
maka kembalikan nilai indeksnya menjadi indeks awal
Dim byteSubstitusi(teks.Length - 1) As Byte For i As Integer = 0 To teks.Length - 1 If Convert.ToInt32(byteTeks(i)) - Convert.ToInt32(byteKataKunci(i)) < 1 Then byteSubstitusi(i) = Convert.ToInt32(byteTeks(i)) - Convert.ToInt32(byteKataKunci(i)) + maksIdxKarakter Else byteSubstitusi(i) = byteTeks(i) - byteKataKunci(i) End If Next
5b6. Lakukan pengembalian indeks pesan kembali menjadi indeks pesan semula
dengan cara menambahkan setiap indeks dengan 20h sebagai nilai terendah dari urutan printable character pada tabel ascii
tetapi perlu diingat apabila indeks karakter tersebut berada diluar rentang dari karakter 20h - 7Eh,
maka indeks karakter tersebut akan dikembalikan menjadi indeks karakter pertama, yaitu karakter Ah.
For i As Integer = 0 To byteSubstitusi.Length - 1 If byteSubstitusi(i) + Convert.ToInt32("20", 16) - 2 > Convert.ToInt32("7E", 16) Then byteSubstitusi(i) = Convert.ToInt32("A", 16) Else byteSubstitusi(i) = byteSubstitusi(i) + Convert.ToInt32("20", 16) - 2 End If Next
5b7. Dapatkan posisi dimana karakter kosong ditemukan
dan biarkan posisi karakter ini adalah karakter kosong (karena karakter ini terkena proses substitusi diatas)
For i As Integer = 0 To byteSubstitusi.Length - 1 If teks(i) = Chr(10) Then byteSubstitusi(i) = 10 Next
* Implementasi fungsi de-transposisi adalah sebagai berikut
5c1. Lakukan pembagian teks ke dalam matriks karakter
Jika terdapat sel matriks yang tidak memiliki isi, maka beri nilai untuk karakter tersebut dengan karakter kosong
Dim jumlahBaris As Integer = Math.Truncate(teks.Length / jumlahKolom) + IIf(teks.Length Mod jumlahKolom > 0, 1, 0) Dim idxTeks As Integer = 0 Dim matriks(jumlahKolom - 1)() As Char For i As Integer = 0 To jumlahKolom - 1 matriks(i) = New Char(jumlahBaris - 1) {} For j As Integer = 0 To jumlahBaris - 1 If idxTeks > teks.Length - 1 Then matriks(i)(j) = Chr(10) Else matriks(i)(j) = teks(idxTeks) idxTeks += 1 End If Next Next
5c2. Lakukan transposisi matriks karakter tersebut
Dim hasil As String = "" For i As Integer = 0 To jumlahBaris - 1 For j As Integer = 0 To jumlahKolom - 1 hasil &= matriks(j)(i) Next Next
5d. Hapus semua karakter kosong yang telah ditambahkan ke dalam proses
hasil = hasil.Replace(Chr(10), "")
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.