Algoritma TTVC (Triple Transposition Vigenere Cipher)


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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *