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

Komentar ini telah dihapus oleh administrator blog.
BalasHapusgk jelas
BalasHapus