Algoritma RC4 (Ron’s Code / Rivest’s 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 pengembangan dari RC2 dan dikembangkan oleh penemu algoritma tersebut yaitu Ronald Rivest. Perbedaan dengan algoritma sebelumnya adalah ukuran blok, ukuran key, dan jumlah round yang dilakukan, dengan nilai yang direkomendasikan adalah ukuran blok 64 bit, ukuran key 128 bit, dan jumlah round 12 kali.
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 RC4. 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 RC4() End Sub . . . End Class
* Pada saat menginisialisasi variabel metodeEncode, maka proses tersebut akan melakukan inisialisasi pada Class RC4. Class ini berisi tentang beberapa properti dan fungsi yang menggantikan properti dan fungsi yang diturunkan dari Class SymmetricAlgorithm. Deklarasi Class RC4 adalah sebagai berikut:
Public Class RC4
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
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)
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 RC4 adalah sebagai berikut
Protected Sub blokEncrypt(ByRef x As Byte()) Dim i As Long Dim j As Long Dim Temp As Byte Dim Offset As Long Dim OrigLen As Long Dim CipherLen As Long Dim sBox(0 To 255) As Integer 'Masukkan key yang baru jika diperlukan If (Key.Length > 0) Then Me.Key = Key 'Salin nilai SBOX ke dalam variabel lokal untuk mempercepat perhitungan Buffer.BlockCopy(m_sbox, 0, sBox, 0, 512) 'Hitung ukuran dari array data OrigLen = UBound(x) + 1 CipherLen = OrigLen 'Lakukan enkripsi For Offset = 0 To (OrigLen - 1) i = (i + 1) Mod 256 j = (j + sBox(i)) Mod 256 Temp = sBox(i) sBox(i) = sBox(j) sBox(j) = Temp x(Offset) = x(Offset) Xor (sBox((sBox(i) + sBox(j)) Mod 256)) 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)
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 RC4 adalah sebagai berikut
Protected Sub blokDecrypt(ByRef x As UInteger()) 'Proses dekripsi sama seperti proses enkripsi Call blokEncrypt(x) End Sub
* Secara keseluruhan, skrip ini membutuhkan 2 Class tambahan yaitu Class RC4Base dan Class RC4Algoritma. Class RC4Base berisi tentang ukuran blok, key, SBOX, dan fungsi utama enkripsi dan dekripsi dengan metode RC4. Class RC4Algoritma adalah hasil implementasi Class RC4 yang berisi tentang beberapa properti dan fungsi yang menggantikan properti dan fungsi yang diturunkan dari Class RC4Base dan SymmetricAlgorithm. Deklarasi kedua Class tersebut adalah sebagai berikut:
Friend Class RC4Base
Public Enum EnumArahCrypt
Enkripsi
Dekripsi
End Enum
Private Shared ReadOnly BLOCK_SIZE As Integer = 128 'Jumlah bit per blok
Protected inputBlockSize As Integer = BLOCK_SIZE / 8
Protected outputBlockSize As Integer = BLOCK_SIZE / 8
'key berukuran MAX_KEY_BITS / 32
Protected Key As UInteger() = {0, 0, 0, 0, 0, 0, 0, 0}
'matriks nilai SBOX sepanjang 256 bit
Const jumlahInputSBOX As Integer = 256
Private m_sbox As UInteger()
Public Sub New(key As Byte())
'Inisialisasi nilai SBOX
m_sbox = New UInteger(jumlahInputSBOX - 1) {}
For nI = 0 To jumlahInputSBOX - 1
m_sbox(nI) = nI
Next
Dim a As Long
Dim b As Long
Dim Temp As Byte
For a = 0 To 255
b = (b + m_sbox(a) + key(a Mod key.Length)) Mod 256
Temp = m_sbox(a)
m_sbox(a) = m_sbox(b)
m_sbox(b) = Temp
Next
End Sub
. . .
End Class
Friend Class RC4Algoritma
Inherits RC4Base
Implements System.Security.Cryptography.ICryptoTransform
Private m_canReuseTransform As Boolean = True
Private m_canTransformMultipleBlocks As Boolean = False
Public Sub New(ByRef key As Byte(), arahCrypt As EnumArahCrypt)
MyBase.New(key)
'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
End Sub
. . .
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
[sdm_download id="2927" fancy="0"]
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.

