source code rabbit

•December 28, 2007 • Leave a Comment

A ANSI C Source Code
ANSI C source code untuk Rabbit.

rabbit.h
Di bawah header file rabbit.h tercantum:
#ifndef _RABBIT_H
#define _RABBIT_H
#include <stddef.h>
// Ketik deklarasi dari 32-bit dan 8-bit unsigned integers
typedef unsigned int uint32;
typedef unsigned char byte;
// Structure untuk menyimpan data (internal state)
typedef struct
{
uint32 x[8];
uint32 c[8];
uint32 carry;
} t_instance;
void key_setup(t_instance *p_instance, const byte *p_key);
void cipher(t_instance *p_instance, const byte *p_src,
byte *p_dest, size_t data_size);
#endif
rabbit.c
Dalam file C, rabbit.c, fungsi rotasi logis, _rotl, digunakan, bagaimanapun juga, untuk beberapa compiler
mungkin tidak didefinisikan. Pada beberapa kasus, fungsi rotasi logis dapat didefinisikan sebagai:
uint32 _rotl(uint32 x, int rot) { return (x<<rot) | (x>>(32-rot)); }
Di bawah file rabbit.c file tercantum:
#include <stdlib.h>
#include “rabbit.h”
// Kalikan sebuah bilangan 32-bit untuk mendapatkan hasil 64-bit result lalu kembali
// Semakin tinggi XOR 32 bit semakin rendah 32 bit
uint32 g_func(uint32 x)
{
// Buat argumen tinggi dan rendah untuk perpangkatan
uint32 a = x&0xFFFF;
uint32 b = x>>16;
// Hitung hasil yang tinggi dan rendah dari perpangkatan
uint32 h = ((((a*a)>>17) + (a*b))>>15) + b*b;
uint32 l = x*x;
// Kembali tinggi XOR rendah;
return h^l;
}
// Hitung internal state berikutnya
void next_state(t_instance *p_instance)
{
// Data sementara
uint32 g[8], c_old[8], i;
// Simpan nilai counter yang lama
for (i=0; i<8; i++)
c_old[i] = p_instance->c[i];
// Hitung nilai counter yang baru
p_instance->c[0] += 0x4D34D34D + p_instance->carry;
p_instance->c[1] += 0xD34D34D3 + (p_instance->c[0] < c_old[0]);
p_instance->c[2] += 0x34D34D34 + (p_instance->c[1] < c_old[1]);
p_instance->c[3] += 0x4D34D34D + (p_instance->c[2] < c_old[2]);
p_instance->c[4] += 0xD34D34D3 + (p_instance->c[3] < c_old[3]);
p_instance->c[5] += 0x34D34D34 + (p_instance->c[4] < c_old[4]);
p_instance->c[6] += 0x4D34D34D + (p_instance->c[5] < c_old[5]);
p_instance->c[7] += 0xD34D34D3 + (p_instance->c[6] < c_old[6]);
p_instance->carry = (p_instance->c[7] < c_old[7]);
// Hitung fungsi g
for (i=0;i<8;i++)
g[i] = g_func(p_instance->x[i] + p_instance->c[i]);
// Hitung nilai state yang baru
p_instance->x[0] = g[0] + _rotl(g[7],16) + _rotl(g[6],16);
p_instance->x[1] = g[1] + _rotl(g[0], 8) + g[7];
p_instance->x[2] = g[2] + _rotl(g[1],16) + _rotl(g[0],16);
p_instance->x[3] = g[3] + _rotl(g[2], 8) + g[1];
p_instance->x[4] = g[4] + _rotl(g[3],16) + _rotl(g[2],16);
p_instance->x[5] = g[5] + _rotl(g[4], 8) + g[3];
p_instance->x[6] = g[6] + _rotl(g[5],16) + _rotl(g[4],16);
p_instance->x[7] = g[7] + _rotl(g[6], 8) + g[5];
}
// Pengaturan kunci
void key_setup(t_instance *p_instance, const byte *p_key)
{
// Data sementara
uint32 k0, k1, k2, k3, i;
// Pembangkitan empat subkunci
k0 = *(uint32*)(p_key+ 0);
k1 = *(uint32*)(p_key+ 4);
k2 = *(uint32*)(p_key+ 8);
k3 = *(uint32*)(p_key+12);
// Bangkitkan variabel initial state
p_instance->x[0] = k0;
p_instance->x[2] = k1;
p_instance->x[4] = k2;
p_instance->x[6] = k3;
p_instance->x[1] = (k3<<16) | (k2>>16);
p_instance->x[3] = (k0<<16) | (k3>>16);
p_instance->x[5] = (k1<<16) | (k0>>16);
p_instance->x[7] = (k2<<16) | (k1>>16);
// Bangkitkan nilai initial counter
p_instance->c[0] = _rotl(k2,16);
p_instance->c[2] = _rotl(k3,16);
p_instance->c[4] = _rotl(k0,16);
p_instance->c[6] = _rotl(k1,16);
p_instance->c[1] = (k0&0xFFFF0000) | (k1&0xFFFF);
p_instance->c[3] = (k1&0xFFFF0000) | (k2&0xFFFF);
p_instance->c[5] = (k2&0xFFFF0000) | (k3&0xFFFF);
p_instance->c[7] = (k3&0xFFFF0000) | (k0&0xFFFF);
// Reset carry flag
p_instance->carry = 0;
// Iterasi sistem empat kali
for (i=0;i<4;i++)
next_state(p_instance);
// Modifikasi counter
for (i=0;i<8;i++)
p_instance->c[(i+4)&0x7] ^= p_instance->x[i];
}
// Encrypt atau decrypt sebuah blok data
void cipher(t_instance *p_instance, const byte *p_src,
byte *p_dest, size_t data_size)
{
uint32 i;
for (i=0; i<data_size; i+=16)
{
// Iterasi sistem
next_state(p_instance);
// Encrypt 16 byte data
*(uint32*)(p_dest+ 0) = *(uint32*)(p_src+ 0) ^
p_instance->x[0] ^
(p_instance->x[5]>>16) ^
(p_instance->x[3]<<16);
*(uint32*)(p_dest+ 4) = *(uint32*)(p_src+ 4) ^
p_instance->x[2] ^
(p_instance->x[7]>>16) ^
(p_instance->x[5]<<16);
*(uint32*)(p_dest+ 8) = *(uint32*)(p_src+ 8) ^
p_instance->x[4] ^
(p_instance->x[1]>>16) ^
(p_instance->x[7]<<16);
*(uint32*)(p_dest+12) = *(uint32*)(p_src+12) ^
p_instance->x[6] ^
(p_instance->x[3]>>16) ^
(p_instance->x[1]<<16);
// Tambahkan pointer ke sumber dan data tujuan
p_src += 16;
p_dest += 16;
}
}
B Tes Vektor
Kunci dan output diberikan dalam byte. Byte paling kiri dari kunci adalah K^[7..0].
key = [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00]
s[0] = [02 F7 4A 1C 26 45 6B F5 EC D6 A5 36 F0 54 57 B1]
s[1] = [A7 8A C6 89 47 6C 69 7B 39 0C 9C C5 15 D8 E8 88]
s[31] = [EF 9A 69 71 8B 82 49 A1 A7 3C 5A 6E 5B 90 45 95]
key = [C2 1F CF 38 81 CD 5E E8 62 8A CC B0 A9 89 0D F8]
s[0] = [3D 02 E0 C7 30 55 91 12 B4 73 B7 90 DE E0 18 DF]
s[1] = [CD 6D 73 0C E5 4E 19 F0 C3 5E C4 79 0E B6 C7 4A]
s[31] = [9F B4 92 E1 B5 40 36 3A E3 83 C0 1F 9F A2 26 1A]
key = [1D 27 2C 6A 2D 8E 3D FC AC 14 05 6B 78 D6 33 A0]
s[0] = [A3 A9 7A BB 80 39 38 20 B7 E5 0C 4A BB 53 82 3D]
s[1] = [C4 42 37 99 C2 EF C9 FF B3 A4 12 5F 1F 4C 99 A8]
s[31] = [97 C0 73 3F F1 F1 8D 25 6A 59 E2 BA AB C1 F4 F1]

rabbit stream cipher for you

•October 30, 2007 • Leave a Comment

Rabbit Stream Cipher

Nikson Badua Putra

STSN

Ciseeng

Parung

Bogor

Stsn-nci.ac.id

Rabbit stream cipher berbasis pada perulangan sebuah himpunan dari fungsi non linier yang berpasangan. Rabbit dikenal dengan performanya yang tinggi dalam implementasi software dengan ukuran kecepatan enkripsi/dekripsi 3,7 clock cycles per byte pada sebuah processor Pentium III paper ini juga membahas mengenai analisis pengamanan, dengan keterangan analisis korelasi dan penelitian secara aljabar. Kriptanalis tidak dapat melakukan serangan lebih dari penyelidikan kunci yang mendalam.

Kata kunci : Stream cipher, cepat, non-linier, berpasangan, counter, chaos


1.
Pendahuluan

Stream cipher merupakan sebuah kelas penting dari algoritma enkripsi simetrik. Filosofi rancangan dasarnya diilhami One-Time-Pad cipher yang dienkrip dengan meng-XOR teks terang menggunakan kunci acak. Bagaimana pun juga, kebutuhan akan kunci sama ukurannya dengan teks terang membuat One-Time-Pad tidak dapat dijalankan pada sebagian besar aplikasi. Sebagai alternatif, stream cipher mengembangkan sebuah kunci acak yang pendek menjadi sebuah aliran kunci semu acak, yang lalu di-XOR dengan teks terang untuk membangkitkan teks sandi. Maka dari itu, tujuan yang telah direncanakan untuk sebuah stream cipher adalah mengefisienkan pembangkitan bit-bit semu acak yang tidak membedakan dengan bit-bit yang betul-betul acak.

1.1
Latar Belakang Rabbit

Design rabbit diinspirasikan oleh jalan rumit dari chaotic maps yang mempunyai nilai riil. Chaotic maps dicirikan dengan sebuah sensitivitas eksponensial pada kekacauan kecil yang menyebabkan iterasi maps tersebut agar terlihat acak dan tidak dapat diprediksikan dalm jangka waktu yang panjang. Properti-properti tersebut sebelumnya juga mengarahkan kita kepada sugesti bahwa system chaotic dapat digunakan untuk keperluan kriptografi, lihat referensi [1], [2]. Bagaimana pun juga, walaupun sistem chaotic menampilkan kebiasaan yang terlihat acak., mereka tidak perlu diamankan secara kriptografis dalam bentuk diskret, lihat contoh [3, 4]. Alasan lainnya adalah bahwa fungsi chaotic yang didiskretkan tidak secara otomatis menghasilkan kebiasaan rumit dengan cukup dari mengkorespondensikan fungsi biner, yang merupakan sebuah syarat pengamanan kriptografis. Oleh karena itu, kompleksitas fungsi biner diperlukan untuk dipertimbangkan dalam tahap rancangan yang perlu untuk dimodifikasi. Selain itu, banyak cipher yang dianjurkan didasarakan pada chaos yang didapat dari kemampuan mereproduksi permasalahan-permasalahan dari aliran kunci yang mengacu pada penanganan yang berbeda-beda untuk bilangan-bilangan floating-point pada bermacam prosesor, lihat contoh [5].

Tujuan yang telah dirancang untuk rabbit adalah untuk mengambil keuntungan dari property-properti yang terlihat acak dari chaotic maps yang bernilai riil, dan pada waktu yang sama, property-properti kriptografi yamg mempunyai keamanan optimal, saat didiskretkan. Lebih tepatnya, rancangannya diinisiasikan dengan membuat sebuah chaotic system dari map-map non-linier yang dipasangkan. Sistem ini lalu dibatasi menjadi fixed-point valued1. Reproduksibilitas yang terjamin ini, dan membuat sistemnya dapat dianalisa dari sudut pandang biner menggunakan teknik kriptografi yang terkenal (lihat contoh [7]). Analisanya memberikan alasan kepada beberapa perbaikan sistematik dari system persamaan, beberapa di antaranya secara terbatas merupakan alami biner, sebagai contoh dari rotasi dan operator XOR. Perubahan-perubahan ini menjadi keuntungan bagi kompleksitas fungsi-fungsi biner sebaik performanya.

1.2
Rabbit Secara Umum

Algoritma rabbit dapat dijelaskan secara singkat sebagai berikut. Algoritmanya mempunyai 128 bit kunci rahasia sebagai input dan membangkitkan sebuah blok output dari 128 bit yang semu acak dari sebuah kombinasi bit-bit internal state. Enkripsi atau dekripsinya dihasilkan dari meng-XOR data yang semu acak dengan teks terang atau teks sandi. Ukuran dari internal state adalah 513 bit terbagi menjadi 8 kali 32 bit variable state dan 8 kali 32 bit counter dan sebuah cunter carry bit. 8 variabel state dibaharui dengan 8 funsi integer non linier yang dipasangkan. Counter-counternya mengamankan sebuah lompatan rendah pada panjang periode dari variabel state. Rancangan tujuan yang spesifik dari rabbit adalah sebagai berikut :

· Keamanan : cipher sebaiknya memperbolehkan sebuah ukuran kunci dari 128 bit untuk mengenkripsi hingga 264 bit teks terang.

· Sebaiknya lebih cepat dari cipher-cipher yang telah digunakan sebelumnya.

1.3 Hasil Ringkasan

Kriptanalisis rabbit dihasilkan seperti berikut ini. Untuk menyelidiki kemungkinan serangan divide and conquer dan guess and determine, sebuah analisis aljabar dilakukan dengan perhatian khusus pada bagian-bagian non linier dari fungsi next state, sebagaimana mereka merupakan sumber utama untuk mencampurkan bit-bit input. Tidak ada serangan yang ditemukan yang lebih baik dari pencarian kunci secara mendalam (exhaustive key search). Untuk menguji ketahanan terhadap jenis serangan korelasi dan distinguishing, sebuah analisis korelasi dilakukan dengan menghitung Walsh-Hadamard spectra dari bagian-bagian non linier. Berdasarkan analisis korelasi, kita tidak yakin bahwa terdapat jenis sebuah jenis serangan korelasi, yang membutuhkan usaha yang lebih kecil dibandingkan pencarian kunci sacara mendalam (exhaustive key search), untuk panjang output lebih kecil dari 264 bit..

1.4 Pengaturan dan Catatan

Pada bagian kedua akan dijelaskan rincian desain rabbit. Kita akan membicarakan kriptanalisis rabbit pada bagian ketiga, dan pada bagian keempat akan diberikan hasil dari pelaksanaan rabbit. Akan terdapat kesimpulan dan ringkasan pada bagian kelima. Lampiran A berisi kode C ANSI rabbit. Perhatikan penjelasan di bawahnya dan source code-nya ditetapkan untuk prosesor little endian (misalnya sebagian besar prosesor Intel). Lampiran B berisi uji vector. Lampiran C membicarakan rincian bagian-bagian penting dari sistem counter.

Notasi yang digunakan sebagai berikut : menunjukkan logika XOR, & menunjukkan logika AND, << dan >> menunjukkan logika bit-wise shift kiri dan kanan, <<< dan >>> menunjukkan logika rotasi bit wise ke kiri dan kanan, dan ◊ menunjukkan rentetan rangkaian 2 bit. A[g...h] berarti bit g hingga h merupakan variabel A. Saat menomori bit-bit variabel, bit yang paling kecil (LSB) ditunjukkan dengan 0. Bilangan heksadesimal ditunjukkan dengan “0x”. Yang terakhir, kita menggunakan notasi integer untuk semua variabel dan konstanta.

2. Desain Rabbit

Pada bagian ini akan diberikan penjelasan terperinci dari desain algoritma rabbit.

2.1 Algoritma Cipher

Bagian dalam stream cipher terdiri dari 513 bit. 512 bit dibagi menjadi 2 bagian yaitu

32-bit variabel state xj,i sebanyak 8,dan 32-bit variable counter cj,i di mana xj,I merupakan variabel state dari subsistem j pada iterasi i, and cj,i menunjukkan korespondensi variabel counter. Terdapat satu bit carry counter, Ø7,i, yang perlu disimpan saat iterasi bit carry counter ini diinisialisasikan dengan 0. Delapan variabel state dan delapan counterdiperoleh kunci, pada saat inisialisasi kunci.

· Skema Pengaturan Kunci

Algoritma ini diawali dengan mengembangkan 128-bit kunci menjadi into both the delapan variabel state

dan delapan counter sedemikian sehingga ada korespondensi satu-satu antara kunci dan inisial variabel state xj,0 dan inisial counter cj,0. Kunci K[127..0], dibagi menjadi delapan bagian: k0 = K[15..0], k1 = K[31..16], …, k7 =

K[127..112]. variabel state dan counter diinisialisasikan dari bagian-bagian kunci seperti berikut :

(1)

dan

(2)

Sistem ini diiterasi empat kali, mengacu pada fungsi state yang selanjutnya dijelaskan di bawah, untuk mengurangi korelasi antara bit-bit kunci dan bit-bit variable internal state. Pada akhirnya, nilai counter akan diinisialisasikan kembali, yang mengacu pada :

(3)

Untuk mencegah recovery kunci dari inversi sistem counter.

· Fungsi Next State

Inti dari algorithm rabbit adalah iterasi system, yang dijelaskan dengan persamaan berikut :

(4)

(5)

Dengan semua penjumlahan merupakan modulo 232. Sistem berpasangan ini diilustrasikan secara skematik dalam gambar.

1. Sebelum iterasi, counter ditambahkan seperti yang akan dijelaskan di bawah ini.

<!–[if supportFields]> SHAPE \* MERGEFORMAT <![endif]–>

<<<16

<<<16

<<<16

<<<16

<<<16

C0,i

C1,i

C7,i

C6,i

C0,i

C1,i

C7,i

C6,i

C2,i

C3,i

C4,i

C5,i

C2,i

C5,i

C4,i

C3,i

<<<8

<<<16

<<<8

<<<16

<<<8

<<<8

<<<16

<<<16<<<16<<<16<<<16<!–[if supportFields]><![endif]–>

Gambar 1: Grafik Ilustrasi Sistem.

· Sistem Counter

Dinamika counter dijelaskan sebagai berikut :

(6)

Dengan bit carry,, diberikan oleh

(7)

Selanjutnya, konstanta didefinisikan sebagai :

(8)

· Skema Ekstraksi

Setelah setiap iterasi 128 bit output dibangkitkan seperti berikut :

(9)

dengan merupakan blok aliran kunci 128 bit pada iterasi .

· Skema Enkripsi / dekripsi

Bit yang diekstrak lalu di-XOR dengan teks terang atau teks sandi untuk enkripsi atau dekripsi.

(10)

(11)

dengan dan menotasikan teks sandi ke- dan blok teks terang, secara berturut-turut.

3. Analisis Keamanan

Analisis keamanan dibagi menjadi enam bagian. Pertama, akan dibahas mengenai fungsi pengatuan kunci dan properti counter. Lalu akan ditampilkan analisis aljabar dari fungsi next state. Sebuah analisis korelasi dari fungsi biner dan membahas properti statistic dari rabbit. Yang terakhir, bagian hasil penelitian digunakan pada jenis serangan yang

Khusus seperti Guess and Determine, Divide and Conquer, Distinguishing and Correlation attacks.

3.1 Properti Pengaturan Kunci

Pada bagian ini akan digambarkan properti khusus dari skema pengaturan kunci. Pengaturan ini dapat dibagi ke dalam tiga tahap : Ekspansi kunci, iterasi sistem dan modifikasi counter.

· Ekspansi Kunci

Pada tahap pengaturan kunci ada dua properti. Yang pertama menjadi sebuah korespondensi satu-satu antara kunci, state, dan counter, yang menjaga kelebihan kunci. Properti yang lain adalah bahwa setelah sebuah iterasi fungsi next state, setiap bit kunci telah dibuat-buat seperti semua delapan variabel state. Lebih tepat lagi, untuk sebuah bit kunci yang diberikan terdapat sebuah sedemikian bahwa bit kunci ini mempengaruhi output dari Pada setiap delapan subfungsi next state paling sedikit satu dari fungsi dimasukkan.

· Iterasi Sistem

Skema ekspansi kunci memastikan bahwa setelah dua iterasi dari fungsi next state, semua bit state dipengaruhi oleh seluruh bit kunci dengan besar peluang = 0,5. Batas keamanan dihasikan dari empat kali iterasi sistem.

· Modifikasi Counter

Meskipun counter dapat diketahui seorang attacker, modifikasi counter membuatnya menjadi sulit untuk menemukan kembali kunci dengan menginversi sistem counter sam halnya dengan membutuhkan pengetahuan tambahan mengenai variabel state. Mengacu pada modifikasi counter, kita tidak dapat menjamin bahwa setiap kunci menghasilkan nilai counter yang unik.

3.2 Properti Counter

Pada bagian ini akan dijelaskan mengenai dinamika counter, di antaranya panjang periode dan kemungkinan perubahan kunci dari nilai bit individual.

· Panjang Periode

Ciri yang paling utama dari counter dibantu stream cipher adalah bahwa lower bounds tepat pada panjang periode dapat dihasilkan. Sistem counter yang diambil pada rabbit mempunyai panjang periode 2256 -1. Karena dapat ditunjukkan bahwa input fungsi g mempunyai minimal periode yang sama, sebuah lower bound yang terlalu konservatif pada periode variabel state, Nx > 2158, dapat diamankan.


 
Follow

Get every new post delivered to your Inbox.