Sabtu, 17 Oktober 2009

Transposition Cipher

Transposition ciphers mengatur ulang huruf-huruf dari plaintext tanpa menggantinya. Sebagai contoh, transposition cipher yang sangat sederhana adalah the rail fence, di mana plaintext ditulis per huruf dalam dua baris dan kemudian dibaca per baris untuk dijadikan ciphertext.

The rail fence adalah contoh sederhana dari jenis transposition ciphers yang disebut juga dengan route ciphers. Umumnya, di route ciphers elemen-elemen plaintext (biasanya per huruf) ditulis ke dalam bentuk matriks yang disetujui oleh pengirim (transmitter) dan penerima (receiver).

Contoh berikut ini menggunakan kunci kata CIPHER, sebuah matriks dapat ditulis seperti berikut ini:


C I P H E R
1 4 5 3 2 6
B U K U
P
E S A N A N

T E L A H
D I K I R I
M





Tidak seperti sebelumnya, plaintext ditulis secara normal dari kiri ke kanan, dan ciphertext-nya akan dibaca dari atas ke bawah (per kolom). Urutan di mana kolom akan ditulis dari ciphertext disesuaikan dengan urutan kuncinya. Matriks di atas akan menghasilkan ciphertext: BE DM AAR UNLI USTIKAEK.

Kolom pertama C dalah pendahulu dalam urutan alphabet dibanding dengan huruf-huruf lainnya dalam kata “CIPHER”. Diikuti dengan kolom kedua E, dan seterusnya. Keamanan dalam metode enkripsi ini dapat ditingkatkan dengan enkripsi ulang hasil cipher dengan menggunakan transposisi lain. Hal itu dimungkinkan karena setiap hasil transposisi yang berupa ciphertext dapat ditransposisi dengan kunci lainnya untuk menghasilkan ciphertext berikutnya.


Berikut penerapannya dalam Visual Basic




Private Sub cmdDekripsi_Click()
'koneksi database
Adodc1.RecordSource = "select * from posisi"
Adodc1.Refresh

'hitung jumlah karakter pesan
p = Len(Trim(txtCipher.Text))
dpesan.Text = p

'hitung jumlah karakter kunci
k = Len(Trim(txtKunci.Text))
dkunci.Text = k

'hitung npembagi
npembagi = p / k
sisabagi = p Mod k
If sisabagi > 0 Then
npembagi = npembagi + 1
End If

'hitung jumlah record
jumlahrecord = Adodc1.Recordset.RecordCount

'hapus jika record telah berisi data
If jumlahrecord > 0 Then
For c = 1 To jumlahrecord
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
Next c
End If

'MEMASUKKAN KE DALAM DATABASE
'Menulis secara Horisontal/Berdasarkan record
'masukkan kata kunci dalam database
a = 1
For i = 1 To k
Adodc1.Recordset.AddNew
karkunci = Mid(txtKunci.Text, a, 1)
Adodc1.Recordset.Fields(1) = karkunci
a = a + 1
Adodc1.Recordset.Update
Next i
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.MoveNext

'Mengurutkan Kunci secara Ascending
Adodc1.RecordSource = "SELECT * FROM posisi ORDER BY 2 ASC"
Adodc1.Refresh


'Memasukkan CipherText dalam database
Adodc1.Recordset.MoveFirst
b = 1
For d = 1 To k
For e = 2 To npembagi + 1
Data = Mid(txtCipher.Text, b, 1)
Adodc1.Recordset.Fields(e) = Data
b = b + 1
Cipher = Cipher + Data
Next e
Adodc1.Recordset.MoveNext
Adodc1.Recordset.Update
On Error Resume Next
Next d

'Mengurutkan index secara Ascending
Adodc1.RecordSource = "SELECT * FROM posisi ORDER BY 1 ASC"
Adodc1.Refresh
'MEMBACA DATABASE
'Membaca secara Vertikal
'Perulangan untuk pengambilan karakter enkripsi
Adodc1.Refresh
For d = 2 To npembagi + 1
For e = 1 To Adodc1.Recordset.RecordCount
If Adodc1.Recordset.Fields(d) = " " Then
Data = " "
Else
Data = Adodc1.Recordset.Fields(d)
End If
pesan = pesan + Data
Adodc1.Recordset.MoveNext

'Masukkan hasil enkripsi ke CipherText
txtPesan2.Text = pesan
Next e
Adodc1.Recordset.MoveFirst
Next d
End Sub

Private Sub cmdEnkripsi_Click()
'koneksi database
Adodc1.RecordSource = "select * from posisi"
Adodc1.Refresh

'hitung jumlah karakter pesan
p = Len(Trim(txtPesan.Text))
epesan.Text = p

'hitung jumlah karakter kunci
k = Len(Trim(txtKunci.Text))
ekunci.Text = k

'hitung npembagi
npembagi = p / k
sisabagi = p Mod k
If sisabagi > 0 Then
npembagi = npembagi + 1
End If

'hitung jumlah record
jumlahrecord = Adodc1.Recordset.RecordCount

'hapus jika record telah berisi data
If jumlahrecord > 0 Then
For c = 1 To jumlahrecord
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveNext
Next c
End If

'MEMASUKKAN KE DALAM DATABASE
'Penulisan Secara Vertikal
'masukkan kata kunci dalam database
a = 1
For i = 1 To k
Adodc1.Recordset.AddNew
karkunci = Mid(txtKunci.Text, a, 1)
Adodc1.Recordset.Fields(1) = karkunci
a = a + 1
Adodc1.Recordset.Update
Next i

'masukkan kata pesan dalam database
Adodc1.Recordset.MoveFirst
a = 1
For i = 2 To npembagi + 2
For j = 1 To k
'Isi sebagai data kosong ketika pesan telah habis
If a <= p Then
karkunci = Mid(txtPesan.Text, a, 1)
Adodc1.Recordset.Fields(i) = karkunci
a = a + 1
Else
karkunci = " "
Adodc1.Recordset.Fields(i) = karkunci
End If

'Memasukkan data
If j < k Then
Adodc1.Recordset.Update
Adodc1.Recordset.MoveNext
Else
Adodc1.Recordset.Update
End If
Next j
Adodc1.Recordset.MoveFirst
Next i

'Mengurutkan Kunci secara Ascending
Adodc1.RecordSource = "SELECT * FROM posisi ORDER BY 2 ASC"
Adodc1.Refresh

'MEMBACA DATABASE
'Membaca Database secara Horisontal(Membaca masing-masing record)
k = Len(Trim(txtKunci.Text))

'perulangan untuk record berikutnya
For c = 1 To k
For d = 2 To npembagi + 2
If Adodc1.Recordset.Fields(d) = " " Then
Data = " "
Else
Data = Adodc1.Recordset.Fields(d)
End If
pesan = pesan + Data
txtCipher.Text = pesan
Next d
Adodc1.Recordset.MoveNext
Next c
Adodc1.Recordset.MoveFirst

End Sub

Private Sub txtKunci_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub

Private Sub txtPesan_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub

Private Sub txtCipher_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub