Algoritma Twofish 7


Algoritma Twofish 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 menggunakan teknik cipher blok dengan key simetris. Twofish memiliki ukuran blok 128 bit dan panjang key sampai pada 256 bit. Fitur unik dari Twofish adalah penggunaan parameter SBOX yang sangat besar dan bergantung dari key. Setengah bagian dari bit key akan digunakan sebagai key enkripsi dan setengah sisanya akan digunakan untuk memodifikasi data pada proses enkripsi. Twofish juga banyak menggunakan elemen lain seperti teknik PHT (pseudo-Hadamard Transform), struktur Feistel, dan matriks MDS (Maximum Distance Seperable)


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 xc As New CryptCore()
xc.InitCore()
xc.Key = kataKunci

* Skrip tersebut akan melakukan inisialisasi pada Class CryptCore. Class ini adalah inti class untuk pemanggilan fungsi enkripsi dan dekripsi yang mengacu pada algoritma Twofish. Deklarasi Class CryptCore adalah sebagai berikut:

Public Class CryptCore
    Private _key As String = Nothing
    Public Property Key() As String
        Get
            Return _key
        End Get
        Set(value As String)
            _key = Me.formatKey(value)
        End Set
    End Property

    Private Function formatKey(key As String) As String
        If key Is Nothing OrElse key.Length = 0 Then
            Return Nothing
        End If
        Return key.Trim()
    End Function

    Private DefaultKey As String = ""

    Public Sub New()
        DefaultKey = "enkripsi"
    End Sub

    Private _coreSymmetric As CoreAlgoritmaSymmetric

    Public Function InitCore() As Boolean
        _coreSymmetric = New CoreAlgoritmaSymmetric()
        Return True
    End Function
	
	. . .
End Class

* Pada saat melakukan proses InitCore, maka proses tersebut akan melakukan inisialisasi pada Class CoreAlgoritmaSymmetric. Pemanggilan fungsi enkripsi / dekripsi pada Class sebelumnya akan mengarah pada Class ini untuk selanjutnya dilakukan perhitungan enkripsi / dekripsi yang sebenarnya. Deklarasi Class CoreAlgoritmaSymmetric adalah sebagai berikut:

Public Class CoreAlgoritmaSymmetric
	Private metodeEncode As System.Security.Cryptography.SymmetricAlgorithm

	Public Sub New()
		metodeEncode = New Twofish()
		metodeEncode.Mode = System.Security.Cryptography.CipherMode.CBC
		metodeEncode.GenerateKey()
		metodeEncode.GenerateIV()
	End Sub

	. . .
End Class

* Pada saat menginisialisasi variabel metodeEncode, maka proses tersebut akan melakukan inisialisasi pada Class Twofish. Class ini berisi tentang beberapa properti dan fungsi yang menggantikan properti dan fungsi yang diturunkan dari Class SymmetricAlgorithm. Deklarasi Class Twofish adalah sebagai berikut:

Public NotInheritable Class Twofish
    Inherits System.Security.Cryptography.SymmetricAlgorithm

    Public Sub New()
        'ukuran legal key, dengan kemungkinan 128, 192, dan 256 bit
        Me.LegalKeySizesValue = New System.Security.Cryptography.KeySizes() {New System.Security.Cryptography.KeySizes(128, 256, 64)}

        'ukuran legal blok, dengan ukuran selalu 128 bit / 16 bytes
        Me.LegalBlockSizesValue = New System.Security.Cryptography.KeySizes() {New System.Security.Cryptography.KeySizes(128, 128, 0)}

        'ukuran blok, selalu berukuran 128 bit / 16 bytes
        Me.BlockSize = 128

        'ukuran key, dapat berukuran 128 / 192 / 256 bit
        Me.KeySize = 128

        'teknik padding blok, selalu menambahkan angka 0 untuk melengkapi blok
        Me.Padding = System.Security.Cryptography.PaddingMode.Zeros

        'Mode cipher teks, dengan nilai ECB / CBC
        Me.Mode = System.Security.Cryptography.CipherMode.ECB
    End Sub

	. . .
End Class

4. Lakukan enkripsi kalimat awal menggunakan algoritma ini
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasilEnkripsi As String = xc.Encrypt(input)

* Skrip tersebut akan menjalankan proses enkripsi yang terdapat dalam Class CoreAlgoritmaSymmetric.

Public Function ProsesEncrypt(Source As String, Key As String) As String
	If Source Is Nothing OrElse Key Is Nothing OrElse Source.Length = 0 OrElse Key.Length = 0 Then
		Return Nothing
	End If

	If metodeEncode Is Nothing Then
		Return Nothing
	End If

	Dim lPanjangStream As Long
	Dim jumlahBufferTerbaca As Integer
	Dim byteBuffer As Byte() = New Byte(2) {}
	Dim srcData As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(Source)
	Dim encData As Byte()
	Dim streamInput As New System.IO.MemoryStream()
	streamInput.Write(srcData, 0, srcData.Length)
	streamInput.Position = 0
	Dim streamOutput As New System.IO.MemoryStream()
	Dim streamEncrypt As System.Security.Cryptography.CryptoStream

	metodeEncode.Key = GetValidKey(Key)
	metodeEncode.IV = GetValidIV(Key, metodeEncode.IV.Length)

	streamEncrypt = New System.Security.Cryptography.CryptoStream(streamOutput, metodeEncode.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write)
	lPanjangStream = streamInput.Length

	Dim totalBufferTerbaca As Integer = 0
	While totalBufferTerbaca < lPanjangStream
		jumlahBufferTerbaca = streamInput.Read(byteBuffer, 0, byteBuffer.Length)
		streamEncrypt.Write(byteBuffer, 0, jumlahBufferTerbaca)
		totalBufferTerbaca += jumlahBufferTerbaca
	End While
	streamEncrypt.Close()

	encData = streamOutput.ToArray()

	'Konversi menjadi base64 agar hasil dapat digunakan dalam xml
	Return Convert.ToBase64String(encData)
End Function

* Sedangkan proses enkripsi utama algoritma Twofish adalah sebagai berikut

Protected Sub blokEncrypt(ByRef x As UInteger())
	Dim t0 As UInteger, t1 As UInteger, tmp As UInteger

	'Salin ke dalam blok, dan tambahkan proses whitening
	For i As Integer = 0 To BLOCK_SIZE / 32 - 1
		x(i) = x(i) Xor subKeys(INPUT_WHITEN + i)
		If cipherMode = System.Security.Cryptography.CipherMode.CBC Then
			x(i) = x(i) Xor IV(i)
		End If
	Next

	'Proses utama enkripsi Twofish
	For r As Integer = 0 To rounds - 1  'rounds = 16
#If FEISTEL Then
		t0 = f32(ROR(x(0), (r + 1) / 2), sboxKeys, keyLength)
		t1 = f32(ROL(x(1), 8 + (r + 1) / 2), sboxKeys, keyLength) 'PHT

		x(2) = x(2) Xor ROL(t0 + t1 + subKeys(ROUND_SUBKEYS + 2 * r), r / 2)
		x(3) = x(3) Xor ROR(t0 + 2 * t1 + subKeys(ROUND_SUBKEYS + 2 * r + 1), (r + 2) / 2)

#Else
		t0 = f32(x(0), sboxKeys, panjangKey)
		t1 = f32(ROL(x(1), 8), sboxKeys, panjangKey)

		x(3) = ROL(x(3), 1)
		x(2) = x(2) Xor t0 + t1 + subKeys(ROUND_SUBKEYS + 2 * r) 'PHT

		x(3) = x(3) Xor t0 + 2 * t1 + subKeys(ROUND_SUBKEYS + 2 * r + 1)
		x(2) = ROR(x(2), 1)
#End If
		'Tukar posisi untuk round berikutnya
		If r < rounds - 1 Then
			tmp = x(0)
			x(0) = x(2)
			x(2) = tmp
			tmp = x(1)
			x(1) = x(3)
			x(3) = tmp
		End If
	Next

#If FEISTEL Then
	'Permutasi terakhir
	x(0) = ROR(x(0), 8)
	x(1) = ROL(x(1), 8)
	x(2) = ROR(x(2), 8)
	x(3) = ROL(x(3), 8)
#End If

	'Salin hasil jawaban, dan tambahkan proses whitening
	For i As Integer = 0 To BLOCK_SIZE / 32 - 1
		x(i) = x(i) Xor subKeys(OUTPUT_WHITEN + i)
		If cipherMode = System.Security.Cryptography.CipherMode.CBC Then
			IV(i) = x(i)
		End If
	Next
End Sub

5. Lakukan dekripsi dari kalimat yang telah terenkripsi
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini

Dim hasilDekripsi As String = xc.Decrypt(hasilEnkripsi)

* Skrip tersebut akan menjalankan proses dekripsi yang terdapat dalam Class CoreAlgoritmaSymmetric.

Public Function ProsesDecrypt(Source As String, Key As String) As String
	If Source Is Nothing OrElse Key Is Nothing OrElse Source.Length = 0 OrElse Key.Length = 0 Then
		Return Nothing
	End If

	If metodeEncode Is Nothing Then
		Return Nothing
	End If

	Dim lPanjangStream As Long
	Dim jumlahBufferTerbaca As Integer
	Dim byteBuffer As Byte() = New Byte(2) {}
	Dim encData As Byte() = Convert.FromBase64String(Source)
	Dim decData As Byte()
	Dim streamInput As New System.IO.MemoryStream(encData)
	Dim streamOutput As New System.IO.MemoryStream()
	Dim streamDecrypt As System.Security.Cryptography.CryptoStream

	metodeEncode.Key = GetValidKey(Key)
	metodeEncode.IV = GetValidIV(Key, metodeEncode.IV.Length)

	streamDecrypt = New System.Security.Cryptography.CryptoStream(streamInput, metodeEncode.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Read)
	lPanjangStream = streamInput.Length

	Dim totalBufferTerbaca As Integer = 0
	While totalBufferTerbaca < lPanjangStream
		jumlahBufferTerbaca = streamDecrypt.Read(byteBuffer, 0, byteBuffer.Length)
		If 0 = jumlahBufferTerbaca Then
			Exit While
		End If

		streamOutput.Write(byteBuffer, 0, jumlahBufferTerbaca)
		totalBufferTerbaca += jumlahBufferTerbaca
	End While
	streamDecrypt.Close()

	decData = streamOutput.ToArray()
	For i As Integer = 0 To decData.Length - 1
		If decData(i) < 8 Then decData(i) = 0
	Next

	Dim encodeASCII As New System.Text.ASCIIEncoding()
	Return encodeASCII.GetString(decData)
End Function

* Sedangkan proses dekripsi utama algoritma Twofish adalah sebagai berikut

Protected Sub blokDecrypt(ByRef x As UInteger())
	Dim t0 As UInteger, t1 As UInteger
	Dim xtemp As UInteger() = New UInteger(3) {}

	If cipherMode = System.Security.Cryptography.CipherMode.CBC Then
		x.CopyTo(xtemp, 0)
	End If

	'Salin ke dalam blok, dan tambahkan proses whitening
	For i As Integer = 0 To BLOCK_SIZE / 32 - 1
		x(i) = x(i) Xor subKeys(OUTPUT_WHITEN + i)
	Next

	'Proses utama dekripsi Twofish
	For r As Integer = rounds - 1 To 0 Step -1
		t0 = f32(x(0), sboxKeys, panjangKey)
		t1 = f32(ROL(x(1), 8), sboxKeys, panjangKey)

		x(2) = ROL(x(2), 1)
		x(2) = x(2) Xor t0 + t1 + subKeys(ROUND_SUBKEYS + 2 * r) 'PHT
		x(3) = x(3) Xor t0 + 2 * t1 + subKeys(ROUND_SUBKEYS + 2 * r + 1)
		x(3) = ROR(x(3), 1)

		'Tukar posisi, kecuali untuk round terakhir
		If r > 0 Then
			t0 = x(0)
			x(0) = x(2)
			x(2) = t0
			t1 = x(1)
			x(1) = x(3)
			x(3) = t1
		End If
	Next

	'Salin hasil jawaban, dan tambahkan proses whitening
	For i As Integer = 0 To BLOCK_SIZE / 32 - 1
		x(i) = x(i) Xor subKeys(INPUT_WHITEN + i)
		If cipherMode = System.Security.Cryptography.CipherMode.CBC Then
			x(i) = x(i) Xor IV(i)
			IV(i) = xtemp(i)
		End If
	Next
End Sub

* Secara keseluruhan, skrip ini membutuhkan 2 Class tambahan yaitu Class TwofishBase dan Class TwofishAlgoritma. Class TwofishBase berisi tentang key yang digunakan SBOX, subkey, IV, round, dan fungsi utama enkripsi dan dekripsi dengan metode Twofish. Class TwofishAlgoritma adalah hasil implementasi Class Twofish yang berisi tentang beberapa properti dan fungsi yang menggantikan properti dan fungsi yang diturunkan dari Class TwofishBase dan SymmetricAlgorithm. Deklarasi kedua Class tersebut adalah sebagai berikut:

Friend Class TwofishBase
    Public Enum EnumArahCrypt
        Enkripsi
        Dekripsi
    End Enum

    Protected inputBlockSize As Integer = BLOCK_SIZE / 8
    Protected outputBlockSize As Integer = BLOCK_SIZE / 8

    'key yang digunakan oleh SBOX
    Protected sboxKeys As UInteger() = New UInteger(MAX_KEY_BITS / 64 - 1) {}

    'subkey / bit untuk digunakan dalam proses whitening input-output
    Protected subKeys As UInteger() = New UInteger(TOTAL_SUBKEYS - 1) {}

    'key berukuran MAX_KEY_BITS / 32
    Protected Key As UInteger() = {0, 0, 0, 0, 0, 0, 0, 0}

    'vektor inisialisasi dengan ukuran 1 blok
    Protected IV As UInteger() = {0, 0, 0, 0}

    Private panjangKey As Integer
    Private rounds As Integer
    Protected cipherMode As System.Security.Cryptography.CipherMode = System.Security.Cryptography.CipherMode.ECB

    Private jumlahRound As Integer() = {0, ROUNDS_128, ROUNDS_192, ROUNDS_256}
	
	. . .
	
	Public Sub New(key As Byte())
    End Sub

	. . .
End Class

Friend Class TwofishAlgoritma
    Inherits TwofishBase
    Implements System.Security.Cryptography.ICryptoTransform

    Private m_canReuseTransform As Boolean = True
    Private m_canTransformMultipleBlocks As Boolean = False

    Public Sub New(keyLen As Integer, ByRef key As Byte(), ByRef iv As Byte(), cipher As System.Security.Cryptography.CipherMode, arahCrypt As EnumArahCrypt)
        'Konversi key menjadi array integer
        For i As Integer = 0 To key.Length / 4 - 1
            Me.Key(i) = CUInt(key(i * 4 + 3) << 24) Or CUInt(key(i * 4 + 2) << 16) Or CUInt(key(i * 4 + 1) << 8) Or CUInt(key(i * 4 + 0))
        Next

        Me.cipherMode = cipher

        'Jika menggunakan teknik cipher CBC, maka nilai vektor inisialisasi perlu dikonversi juga
        If Me.cipherMode = System.Security.Cryptography.CipherMode.CBC Then
            For i As Integer = 0 To 3
                Me.IV(i) = CUInt(iv(i * 4 + 3) << 24) Or CUInt(iv(i * 4 + 2) << 16) Or CUInt(iv(i * 4 + 1) << 8) Or CUInt(iv(i * 4 + 0))
            Next
        End If

        Me.arahCrypt = arahCrypt

        InitKeyDariKey32(keyLen, Me.Key)
    End Sub

	. . .


Hasil akhir adalah: (klik untuk perbesar gambar)

cmd113a

cmd113b


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 *

7 pemikiran di “Algoritma Twofish

    • pip Penulis

      Skrip yang saya bagikan adalah skrip console, sehingga silahkan membuat proyek console yang baru dan kemudian menimpa file Module1.vb dengan file yang saya bagikan

        • pip Penulis

          Saya sudah menjalankan skrip ini kembali dan hasil akhirnya masih sama seperti screenshot yang saya bagikan diatas. Jika anda sudah menggunakan proyek bertipe console maka seharusnya tidak terjadi kesalahan. Jenis perangkat lunak apakah yang anda miliki?

    • pip Penulis

      Pada saat menjalankan skrip tersebut, maka pengguna harus memasukkan input teks yang akan mengalami proses enkripsi dan dekripsi. Pada contoh gambar diatas saya menggunakan teks “twofish” dan “ini adalah algoritma twofish”. Tentu saja anda dapat menggunakan teks dan kata kunci sesuai dengan yang anda inginkan