Enkripsi RC5

Dalam kriptografi, RC5 adalah algoritma cipher blok yang terkenal karena sederhana. Dirancang oleh Ronald Rivest pada tahun 1994, RC adalah singkatan dari "Rivest Cipher", atau sebagai alternatif, "Ron's Code".Sejak dipublikasikan, RC5 menarik perhatian banyak para ahli di dalam komunitas kriptographi dalam upaya memberikan akses keamanan secara akurat.

## Deskripsi

RC5 memiliki ukuran blok variabel (32, 64 atau 128 bit), ukuran kunci (0 hingga 2040 bit) dan jumlah putaran (0 hingga 255). Pilihan parameter yang disarankan adalah ukuran blok 64 bit, kunci 128-bit, dan 12 putaran.
Fitur utama RC5 adalah penggunaan rotasi yang bergantung pada data; salah satu tujuan RC5 adalah untuk mendorong studi dan evaluasi operasi seperti Cryptographic primitive. RC5 juga terdiri dari tambahan modular dan eXclusive OR (XOR). Enkripsi dan dekripsi dapat ditentukan dalam beberapa baris kode. RC5 pada dasarnya dilambangkan sebagai RC5-w/r/b di mana w = ukuran kata dalam bit, r = jumlah putaran, b = jumlah byte 8-bit pada kunci
----

## Syarat-syarat RC5

* RC5 harus dirancang menjadi algoritma cipher simetri
* RC5 harus cocok untuk digunakan pada hardware dan software. Hal ini berarti RC5 hanya boleh menggunakan primitif-primitif komputasi yang umum ditemukan pada mikroprosessor
* RC5 harus berkecepatan tinggi. Berarti algoritma RC5 harus berorientasi word. Operasi-operasi RC5 harus dapat memproses 1 word penuh data
* RC5 harus dapat beradaptasi pada berbagai panjang word. Contohnya, pada prosessor terbaru 64-bit, panjang word-nya lebih panjang daripada prosessor 32-bit
* RC5 harus dapat memanfaatkan ini, oleh karena itu RC5 memiliki parameter w yang menandakan panjang word.
* RC5 harus dapat beroperasi dalam berbagai jumlah round. Jumlah round yang bervariasi memungkinkan pengguna untuk memanipulasi RC5 untuk menjadi lebih cepat atau lebih aman · RC5 harus dapat beroperasi dalam berbagai panjang kunci. Hal ini mengakibatkan panjang kunci b menjadi parameter dalam algoritma RC5
* RC5 harus berstruktur sederhana. Struktur yang sederhana belum tentu menghasilkan keamanan yang rendah. Struktur yang sederhana akan memungkinkan analisis dan evaluasi yang cepat untuk menentukan kekuatan algoritma RC5
* RC5 harus hemat dalam pemakaian memori. Hal ini akan memungkinkan implementasi RC5 ke dalam smart-card atau perangkat lain yang memiliki keterbatasan memori
* RC5 harus mengimplementasikan metode data-dependent rotations. Metode ini adalah primitif kriptografi yang merupakan sasaran pengkajian RC5. Data-dependent rotations adalah suatu teknik yang merotasi data yang sekarang diproses secara sirkuler sebanyak N, di mana besarnya N tergantung data yang lain

----

## Algoritma

Enkripsi dan dekripsi RC5 memperluas kunci secara acak menjadi 2 (r + 1), kata yang akan digunakan secara berurutan (dan hanya masing-masing satu kali) selama proses enkripsi dan dekripsi.

----

## Pembacaan sandi

RC5 12-putaran (blok 64-bit) rentan terhadap serangan diferensial menggunakan 244 plaintext yang dipilih. 18-20 putaran disarankan sebagai perlindungan yang memadai.

----

## Ekspansi kunci
Algoritma ekspansi kunci diilustrasikan seperti di bawah ini
Mengikuti skema dalam The RC5 Encryption Algorithm.

* w - Panjang kata dalam bit, biasanya 16, 32 atau 64. Enkripsi dilakukan dalam blok 2 kata.
* u = w / 8 - Panjang kata dalam byte.
* b - Panjang kunci dalam byte.
* K [] - Kuncinya, dianggap sebagai array byte (menggunakan pengindeksan berbasis 0).
* c - Panjang kunci dalam kata-kata (atau 1, jika b = 0).
* L [] - Array kerja sementara yang digunakan selama penjadwalan kunci. diinisialisasi ke tombol kata-kata.
* r - Jumlah putaran yang digunakan saat mengenkripsi data.
* t = 2 (r + 1) - jumlah subkunci putaran yang diperlukan.
* S [] - Kata-kata kunci subkunci bulat.
* Pw - Konstanta sulap pertama, didefinisikan sebagai {\ displaystyle Odd ((e-2) * 2 ^ {w})} Odd ((e-2) * 2 ^ {w}), di mana Odd adalah bilangan bulat ganjil terdekat dari input yang diberikan, e adalah basis dari logaritma natural, dan w didefinisikan di atas. Untuk nilai umum w, nilai terkait Pw diberikan di sini dalam heksadesimal: w = 16: 0xB7E1, w = 32: 0xB7E15163, w = 64: 0xB7E151628AED2A6B
* Qw - Konstanta sulap kedua, didefinisikan sebagai {\ displaystyle Odd ((\ phi -1) * 2 ^ {w})} Odd ((\ phi - 1) * 2 ^ w), di mana Odd adalah bilangan bulat ganjil terdekat dari input yang diberikan, di mana {\ displaystyle \ phi} \ phi adalah rasio emas, dan w didefinisikan di atas. Untuk nilai umum w, nilai terkait Qw diberikan di sini dalam heksadesimal: w = 16: 0x9E37, w = 32: 0x9E3779B9, w = 64: 0x9E3779B97F4A7C15


```python
# Break K into words
# u = w / 8
c = ceiling( max(b, 1) / u )
# L is initially a c-length list of 0-valued w-length words
for i = b-1 down to 0 do:
    L[i/u] = (L[i/u] <<< 8) + K[i]
     
# Initialize key-independent pseudorandom S array
# S is initially a t=2(r+1) length list of undefined w-length words
S[0] = P_w
for i = 1 to t-1 do:
    S[i] = S[i-1] + Q_w
    
# The main key scheduling loop
i = j = 0
A = B = 0
do 3 * max(t, c) times:
    A = S[i] = (S[i] + A + B) <<< 3
    B = L[j] = (L[j] + A + B) <<< (A + B)
    i = (i + 1) % t
    j = (j + 1) % c

# return S
```


----

## Enkripsi

Enkripsi yaitu suatu proses pengaman suatu data yang disembunyikan atau proses konversi data ( plaintext ) menjadi bentuk yang tidak dapat dibaca/ dimengerti. Dalam RC5 Enkripsi melibatkan beberapa fungsi putaran sederhana. putaran 12 atau 20 putaran ini yang direkomendasikan, tergantung pada kebutuhan keamanan dan pertimbangan waktu. Di luar variabel yang digunakan di atas, variabel berikut digunakan dalam algoritma ini:
A, B - Dua kata yang menyusun blok plaintext untuk dienkripsi.
Contoh enkripsi dengan bahasa pemrograman python:

```python
A = A + S[0]
B = B + S[1]
for i = 1 to r do:
    A = ((A ^ B) <<< B) + S[2 * i]
    B = ((B ^ A) <<< A) + S[2 * i + 1]

return A, B
```

----

## Dekripsi

Dekripsi adalah kebalikan dari proses enkripsi yaitu proses konversi data yang sudah dienkripsi ( ciphertext ) kembali menjadi data aslinya ( Original Plaintext ) sehingga dapat dibaca/ dimengerti kembali.


```python
for i = r down to 1 do:
    B = ((B - S[2 * i + 1]) >>> A) ^ A
    A = ((A - S[2 * i]) >>> B) ^ B
B = B - S[1]
A = A - S[0]

return A, B
```

----

## Referensi