Algoritma Skipjack


Algoritma Skipjack 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. Skipjack adalah algoritma yang dikembangkan oleh NSA (National Security Agency), tetapi sekarang sudah tidak dipakai lagi karena sudah dianggap kurang memenuhi syarat keamanan NSA; menggunakan key 80 bit untuk melakukan enkripsi dan dekripsi blok 64 bit, dan menggunakan struktur jaringan Feistel dengan jumlah round 32 kali. Algoritma ini dulunya digunakan untuk mengirimkan paket data pada saat melakukan percakapan di telepon.


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 Skipjack. 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 Skipjack()
	End Sub

	. . .
End Class

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

Public Class Skipjack
    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 Skipjack adalah sebagai berikut

Protected Sub blokEncrypt(ByRef ByteArray As Byte())
	Dim i As Long
	Dim K As Long
	Dim Temp As Byte
	Dim Round As Long
	Dim Offset As Long
	Dim panjangByteSebenarnya As Long
	Dim Counter As Long
	Dim G(0 To 5) As Byte
	Dim panjangCipher As Long
	Dim w(0 To 3, 0 To 32) As UInt16

	'Masukkan key yang baru jika diperlukan
	If (Key.Length > 0) Then Me.Key = Key

	'Simpan panjang byte sebenarnya untuk digunakan pada perhitungan nantinya
	panjangByteSebenarnya = UBound(ByteArray) + 1

	'Tambahkan 12 byte data sebelum byte sebenarnya (8 byte untuk hasil perhitungan dan 4 byte untuk jumlah data)
	'setelah itu tambahkan byte agar jumlah data merupakan kelipatan 8 byte
	panjangCipher = panjangByteSebenarnya + 12
	If (panjangCipher Mod 8 <> 0) Then
		panjangCipher = panjangCipher + 8 - (panjangCipher Mod 8)
	End If
	ReDim Preserve ByteArray(panjangCipher - 1)
	For ii As Integer = panjangByteSebenarnya - 1 To 0 Step -1
		ByteArray(ii + 12) = ByteArray(ii)
	Next

	'Simpan jumlah data pada byte ke 9 - 12
	Dim tmpByte() As Byte = BitConverter.GetBytes(panjangByteSebenarnya)
	For ii As Integer = 0 To 3
		ByteArray(ii + 8) = tmpByte(ii)
	Next

	'Masukkan byte acak pada byte ke 1 - 8
	Dim rnd As New Random(0)
	Dim tmpByte2() As Byte = BitConverter.GetBytes(rnd.NextDouble * UInt16.MaxValue)
	For ii As Integer = 0 To 7
		ByteArray(ii + 0) = tmpByte2(ii)
	Next

	'Tukar semua byte ganjil (byte) dengan byte genap (integer)
	For Offset = 0 To (panjangCipher - 1) Step 2
		Temp = ByteArray(Offset)
		ByteArray(Offset) = ByteArray(Offset + 1)
		ByteArray(Offset + 1) = Temp
	Next

	'Lakukan enkripsi data 8 byte dalam sekali waktu
	For Offset = 0 To (panjangCipher - 1) Step 8
		'baca 4 integer dari array byte
		For ii As Integer = 0 To 7 Step 2
			Dim tmpByte3() As Byte = {ByteArray(ii + Offset), ByteArray(ii + Offset + 1)}
			w(ii / 2, 0) = BitConverter.ToUInt16(tmpByte3, 0)
		Next

		'Lakukan proses XOR dengan nilai cipher pada proses sebelumnya
		w(0, 0) = w(0, 0) Xor w(0, 32)
		w(1, 0) = w(1, 0) Xor w(1, 32)
		w(2, 0) = w(2, 0) Xor w(2, 32)
		w(3, 0) = w(3, 0) Xor w(3, 32)

		K = 0
		Counter = 1

		For Round = 1 To 2
			'Jalankan RULE A
			For i = 1 To 8
				Dim tmpByte4() As Byte = BitConverter.GetBytes(w(0, K))
				For ii As Integer = 0 To 1
					G(ii) = tmpByte4(ii)
				Next

				G(2) = m_F(G(0) Xor m_Key(4 * K)) Xor G(1)
				G(3) = m_F(G(2) Xor m_Key(4 * K + 1)) Xor G(0)
				G(5) = m_F(G(3) Xor m_Key(4 * K + 2)) Xor G(2)
				G(4) = m_F(G(5) Xor m_Key(4 * K + 3)) Xor G(3)

				Dim tmpByte5() As Byte = {G(4), G(5)}
				w(1, K + 1) = BitConverter.ToUInt16(tmpByte5, 0)

				w(0, K + 1) = w(1, K + 1) Xor w(3, K) Xor Counter
				w(2, K + 1) = w(1, K)
				w(3, K + 1) = w(2, K)
				Counter = Counter + 1
				K = K + 1
			Next

			'Jalankan RULE B
			For i = 1 To 8
				Dim tmpByte4() As Byte = BitConverter.GetBytes(w(0, K))
				For ii As Integer = 0 To 1
					G(ii) = tmpByte4(ii)
				Next

				G(2) = m_F(G(0) Xor m_Key(4 * K)) Xor G(1)
				G(3) = m_F(G(2) Xor m_Key(4 * K + 1)) Xor G(0)
				G(5) = m_F(G(3) Xor m_Key(4 * K + 2)) Xor G(2)
				G(4) = m_F(G(5) Xor m_Key(4 * K + 3)) Xor G(3)

				Dim tmpByte5() As Byte = {G(4), G(5)}
				w(1, K + 1) = BitConverter.ToUInt16(tmpByte5, 0)

				w(0, K + 1) = w(3, K)
				w(2, K + 1) = w(0, K) Xor w(1, K) Xor Counter
				w(3, K + 1) = w(2, K)
				Counter = Counter + 1
				K = K + 1
			Next
		Next

		'Simpan nilai integer baru menjadi nilai byte
		For ii As Integer = 0 To 7 Step 2
			Dim tmpByte6() As Byte = BitConverter.GetBytes(w(ii / 2, 32))
			Buffer.BlockCopy(tmpByte6, 0, ByteArray, ii + Offset, 2)
		Next
	Next

	'Tukar semua byte ganjil (integer) dengan byte genap (byte)
	For Offset = 0 To (panjangCipher - 1) Step 2
		Temp = ByteArray(Offset)
		ByteArray(Offset) = ByteArray(Offset + 1)
		ByteArray(Offset + 1) = Temp
	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 Skipjack adalah sebagai berikut

Protected Sub blokDecrypt(ByRef ByteArray As Byte())
	Dim i As Long
	Dim u As Long
	Dim K As Long
	Dim Temp As Byte
	Dim Round As Long
	Dim Offset As Long
	Dim panjangByteSebenarnya As Long
	Dim panjangCipher As Long
	Dim G(0 To 5) As Byte
	Dim Counter(0 To 32) As Byte
	Dim w(0 To 3, 0 To 33) As UInt16

	'Masukkan key yang baru jika diperlukan
	If (Key.Length > 0) Then Me.Key = Key

	'Simpan panjang cipher untuk digunakan pada perhitungan nantinya
	panjangCipher = UBound(ByteArray) + 1

	'Tukar semua byte ganjil (byte) dengan byte genap (integer)
	For Offset = 0 To (panjangCipher - 1) Step 2
		Temp = ByteArray(Offset)
		ByteArray(Offset) = ByteArray(Offset + 1)
		ByteArray(Offset + 1) = Temp
	Next

	'Lakukan dekripsi data 8 byte dalam sekali waktu
	For Offset = 0 To (panjangCipher - 1) Step 8
		'baca 4 integer dari array byte
		For ii As Integer = 0 To 7 Step 2
			Dim tmpByte() As Byte = {ByteArray(ii + Offset), ByteArray(ii + Offset + 1)}
			w(ii / 2, 32) = BitConverter.ToUInt16(tmpByte, 0)
		Next

		K = 32
		u = 31
		For i = 0 To 32
			Counter(i) = i + 1
		Next

		For Round = 1 To 2
			'Jalankan RULE invers B
			For i = 1 To 8
				Dim tmpByte2() As Byte = BitConverter.GetBytes(w(1, K))
				For ii As Integer = 0 To 1
					G(ii + 4) = tmpByte2(ii)
				Next

				G(3) = m_F(G(5) Xor m_Key(4 * u + 3)) Xor G(4)
				G(2) = m_F(G(3) Xor m_Key(4 * u + 2)) Xor G(5)
				G(0) = m_F(G(2) Xor m_Key(4 * u + 1)) Xor G(3)
				G(1) = m_F(G(0) Xor m_Key(4 * u)) Xor G(2)

				Dim tmpByte3() As Byte = {G(0), G(1)}
				w(0, K - 1) = BitConverter.ToUInt16(tmpByte3, 0)

				w(1, K - 1) = w(0, K - 1) Xor w(2, K) Xor Counter(K - 1)
				w(2, K - 1) = w(3, K)
				w(3, K - 1) = w(0, K)
				u = u - 1
				K = K - 1
			Next
			
			'Jalankan RULE invers A
			For i = 1 To 8
				Dim tmpByte2() As Byte = BitConverter.GetBytes(w(1, K))
				For ii As Integer = 0 To 1
					G(ii + 4) = tmpByte2(ii)
				Next

				G(3) = m_F(G(5) Xor m_Key(4 * u + 3)) Xor G(4)
				G(2) = m_F(G(3) Xor m_Key(4 * u + 2)) Xor G(5)
				G(0) = m_F(G(2) Xor m_Key(4 * u + 1)) Xor G(3)
				G(1) = m_F(G(0) Xor m_Key(4 * u)) Xor G(2)

				Dim tmpByte3() As Byte = {G(0), G(1)}
				w(0, K - 1) = BitConverter.ToUInt16(tmpByte3, 0)

				w(1, K - 1) = w(2, K)
				w(2, K - 1) = w(3, K)
				w(3, K - 1) = w(0, K) Xor w(1, K) Xor Counter(K - 1)
				u = u - 1
				K = K - 1
			Next
		Next

		'Lakukan proses XOR dengan nilai cipher pada proses sebelumnya
		w(0, 0) = w(0, 0) Xor w(0, 33)
		w(1, 0) = w(1, 0) Xor w(1, 33)
		w(2, 0) = w(2, 0) Xor w(2, 33)
		w(3, 0) = w(3, 0) Xor w(3, 33)

		'Simpan nilai integer baru menjadi nilai byte
		For ii As Integer = 0 To 7 Step 2
			Dim tmpByte4() As Byte = BitConverter.GetBytes(w(ii / 2, 0))
			Buffer.BlockCopy(tmpByte4, 0, ByteArray, ii + Offset, 2)
		Next

		'Simpan nilai cipher untuk digunakan pada proses XOR blok selanjutnya
		For ii As Integer = 0 To 3
			w(ii, 33) = w(ii, 32)
		Next
	Next

	'Tukar semua byte ganjil (integer) dengan byte genap (byte)
	For Offset = 0 To (panjangCipher - 1) Step 2
		Temp = ByteArray(Offset)
		ByteArray(Offset) = ByteArray(Offset + 1)
		ByteArray(Offset + 1) = Temp
	Next

	'Hitung panjang dari byte sebenarnya
	Dim tmpByte5(3) As Byte
	For ii As Integer = 0 To 3
		tmpByte5(ii) = ByteArray(ii + 8)
	Next
	panjangByteSebenarnya = BitConverter.ToUInt16(tmpByte5, 0)

	'Pastikan panjang byte sebenarnya tidak berselisih terlalu banyak dengan panjang cipher
	'Jika menggunakan key yang salah maka, perhitungan blok berikutnya juga akan salah
	If (panjangCipher - panjangByteSebenarnya > 19) Or (panjangCipher - panjangByteSebenarnya < 12) Then
		Call Err.Raise(vbObjectError, , "Pada proses dekripsi, panjang byte sebenarnya tidak sesuai dengan aturan")
	End If

	'Ubah ukuran byte sehingga hanya memuat teks sebenarnya (hapus semua informasi tambahan yang terdapat dalam byte tersebut)
	For ii As Integer = 0 To panjangByteSebenarnya - 1
		ByteArray(ii) = ByteArray(ii + 12)
	Next
	ReDim Preserve ByteArray(panjangByteSebenarnya - 1)
End Sub

* Secara keseluruhan, skrip ini membutuhkan 2 Class tambahan yaitu Class SkipjackBase dan Class SkipjackAlgoritma. Class SkipjackBase berisi tentang ukuran blok, key, tabel F, dan fungsi utama enkripsi dan dekripsi dengan metode Skipjack. Class SkipjackAlgoritma adalah hasil implementasi Class Skipjack yang berisi tentang beberapa properti dan fungsi yang menggantikan properti dan fungsi yang diturunkan dari Class SkipjackBase dan SymmetricAlgorithm. Deklarasi kedua Class tersebut adalah sebagai berikut:

Friend Class SkipjackBase
    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}

    Private m_F(0 To 255) As Byte
    Private m_Key(0 To 127) As Byte

    Public Sub New(key As Byte(), arahCrypt As EnumArahCrypt)
        'Inisialisasi nilai tabel F
        m_F = { _
            &HA3, &HD7, &H9, &H83, &HF8, &H48, &HF6, &HF4, &HB3, &H21, &H15, &H78, &H99, &HB1, &HAF, &HF9, _
            &HE7, &H2D, &H4D, &H8A, &HCE, &H4C, &HCA, &H2E, &H52, &H95, &HD9, &H1E, &H4E, &H38, &H44, &H28, _
            &HA, &HDF, &H2, &HA0, &H17, &HF1, &H60, &H68, &H12, &HB7, &H7A, &HC3, &HE9, &HFA, &H3D, &H53, _
            &H96, &H84, &H6B, &HBA, &HF2, &H63, &H9A, &H19, &H7C, &HAE, &HE5, &HF5, &HF7, &H16, &H6A, &HA2, _
            &H39, &HB6, &H7B, &HF, &HC1, &H93, &H81, &H1B, &HEE, &HB4, &H1A, &HEA, &HD0, &H91, &H2F, &HB8, _
            &H55, &HB9, &HDA, &H85, &H3F, &H41, &HBF, &HE0, &H5A, &H58, &H80, &H5F, &H66, &HB, &HD8, &H90, _
            &H35, &HD5, &HC0, &HA7, &H33, &H6, &H65, &H69, &H45, &H0, &H94, &H56, &H6D, &H98, &H9B, &H76, _
            &H97, &HFC, &HB2, &HC2, &HB0, &HFE, &HDB, &H20, &HE1, &HEB, &HD6, &HE4, &HDD, &H47, &H4A, &H1D, _
            &H42, &HED, &H9E, &H6E, &H49, &H3C, &HCD, &H43, &H27, &HD2, &H7, &HD4, &HDE, &HC7, &H67, &H18, _
            &H89, &HCB, &H30, &H1F, &H8D, &HC6, &H8F, &HAA, &HC8, &H74, &HDC, &HC9, &H5D, &H5C, &H31, &HA4, _
            &H70, &H88, &H61, &H2C, &H9F, &HD, &H2B, &H87, &H50, &H82, &H54, &H64, &H26, &H7D, &H3, &H40, _
            &H34, &H4B, &H1C, &H73, &HD1, &HC4, &HFD, &H3B, &HCC, &HFB, &H7F, &HAB, &HE6, &H3E, &H5B, &HA5, _
            &HAD, &H4, &H23, &H9C, &H14, &H51, &H22, &HF0, &H29, &H79, &H71, &H7E, &HFF, &H8C, &HE, &HE2, _
            &HC, &HEF, &HBC, &H72, &H75, &H6F, &H37, &HA1, &HEC, &HD3, &H8E, &H62, &H8B, &H86, &H10, &HE8, _
            &H8, &H77, &H11, &HBE, &H92, &H4F, &H24, &HC5, &H32, &H36, &H9D, &HCF, &HF3, &HA6, &HBB, &HAC, _
            &H5E, &H6C, &HA9, &H13, &H57, &H25, &HB5, &HE3, &HBD, &HA8, &H3A, &H1, &H5, &H59, &H2A, &H46}

        'Inisialisasi nilai key
        For nI = 0 To 127
            m_Key(nI) = key(nI Mod key.Length)
        Next

        'Pada saat enkripsi, hasil enkripsi akan menjadi 2 kali ukuran semula
        'Pada saat dekripsi, hasil dekripsi akan menjadi 1/2 kali ukuran semula
        If arahCrypt = EnumArahCrypt.Enkripsi Then
            outputBlockSize = BLOCK_SIZE / 4
        ElseIf arahCrypt = EnumArahCrypt.Dekripsi Then
            inputBlockSize = BLOCK_SIZE / 4
        End If
    End Sub

	. . .
End Class

Friend Class SkipjackAlgoritma
    Inherits SkipjackBase
    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, arahCrypt)

        '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.arahCrypt = arahCrypt
    End Sub

	. . .


Hasil akhir adalah: (klik untuk perbesar gambar)

cmd119a

cmd119b


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 *