Kamis, 20 Desember 2007

Algoritma RC-5 in C language


Algoritma Enkripsi Rivest Code 5 (RC-5)




Sekilas niyh…

RC-5 (Rivest Code-5) merupakan enkripsi stream simetrik yang dibuat oleh RSA Data Security, Inc (RSADSI). Metode enkripsi ini pada awalnya dirancang untuk enkripsi yang menggunakan mikroprosesor (perangkat keras), tetapi pada tahap pengembangannya algoritma ini cocok diterapkan dengan menggunakan perangkat keras maupun perangkat lunak. Secara ringkas algoritma ini bekerja dengan penambahan modulus 2w,melakukan EX-OR dan melakukan rotasi x kekiri dengan jumlah y bit. RC-5 memiliki kelebihan dalam menentukan jumlah kata kunci yang digunakan, hal ini berarti akan memilih tingkat keamanan yang digunakan sesuai dengan aplikasinya. Tulisan ini membahas tentang algoritma enkripsi RC-5 yang dikemukakan oleh Ronald L.Rivest dari MIT Laboratory for Computer Science. Metode penulisan dilakukan dengan studi literartur terhadap buku dan bahasan-bahasan di internet yang berhubungan dengan algoritma enkripsi terutama algoritma RC-5.

Algoritma RC-5

Pada bagian ini kita menjelaskan algoritma RC5, yang terdiri dari tiga komponen: algoritma key expansion, algoritma enkripsi, dan algoritma dekripsi.

Input plaintext ke RC5 terdiri dari dua word w-bit, yang ditandai dengan A dan B. RC5 menggunakan expanded key table (key table yang diperluas), S[0…t – 1], terdiri dari t = 2(r + 1) word w-bit. Algoritma key expansion menginisialisasi S dari parameter key rahasia dari (yang diberikan oleh) user. (Sebagai catatan tabel S dalam enkripsi RC5 bukan “S-box” seperti yang yang digunakan di DES; RC5 menggunakan entry dalam S secara sekuensial, satu pada satu waktu).

Diasumsikan konvensi standard ``little-endian`` untuk mem-packing byte menjadi blok input/output: byte yang pertama menempati posisi bit low order pada register A, dan seterusnya, sehingga byte keempat menempati posisi bit high-order, byte kelima menempati posisi bit low-order pada B, dan byte kedelapan (terakhir) menempati posisi bit high order di B.

Proses enkrip-nya

Kita asumsikan bahwa blok input diberikan dalam dua register w-bit A dan B. Kita juga mengasumsikan bahwa key expansion telah dijalankan, sehingga array S[0…t – 1] telah dihitung. Berikut ini adalah algoritma enkripsi dalam pseudo-code.

A=A+S[0];

B=B+S[1];

for i=1 to r do

A=((A Å B) <<<>

B=((BÅ A) <<<>

Outputnya berada di dalam register A dan B. Kita mencatat (atau memperhatikan) exceptional simplity dari 5 baris algoritma ini.

Kita juga mencatat bahwa setiap round (putaran) RC5 meng-update kedua register A dan B, dimana satu “round” dalam DES hanya meng-update setengah dari registernya. Suatu “half-round” RC5 (satu dari pernyataan penugasan meng-update A atau B dalam body dari loop diatas) mungkin lebih dapat dianalogi terhadap satu round DES).









Gambar 3. Algoritma enkripsi RC-5

Dari flow chart diatas, A merupakan plaintext yang diproses disebelah kiri setelah ditambahkan dengan dengan hasil key ekspansi dan B merupakan bagian plaintext yang diproses disebelah kanan yang juga ditambahkan dengan hasil key ekspansi. Tahap berikutnya dilakukan proses EX-OR terhadap masing-masing plantext dan dilakukan rotasi (putaran). Setelah dilakukan putaran sebanyak r kali, data-data ini digabungkan kembali membentuk ciphertext yang telah siap dikirimkan ke penerima atau diproses selanjutnya.

Proses dekrip-nya

Proses dekripsi dilakukan penerima terhadap data yang sudah dalam bentuk ciphertext. Proses ini dapat dilakukan dengan algoritma sebagai berikut :

for i= r downto 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];

Data-data dari ciphertext dikembangkan menjadi dua bagian A dan B selanjutnya di lakukan pengurangan dengan hasil key ekspansi dan dirotasi sebanyak r sambil dilakukan operasi EX-OR terhadap data tersebut. Tahap akhir untuk mendapatkan plaintext adalah dengan melakukan kembali proses pengurangan ke masing-masing bagian dengan hasil key ekspansi. Data-data ini kemudian digabungkan kembali membentuk plaintext sesuai dengan yang dikirimkan pengirim atau data awal sebelum proses enkripsi.

Key Expansion

Rutin key expansion memperluas kunci rahasia user K untuk mengisi array key yang diperluas S, sehingga S menyerupai suatu array t = 2(r + 1) word biner random yang ditentukan oleh K. Algoritma key expansion menggunakan dua “magic constants”, dan terdiri dari tiga bagian algoritmik sederhana.

Definisi dari Magic Constants. Algoritma key-expansion menggunakan dua konstanta biner berukuran word Pw dan Qw. Konstanta biner tersebut didefinisikan untuk sembarang w sebagai berikut :

Dimana :

e = 2.718281828459 ® Nilai logaritma dasar

f = 1.6180333988749 ® golden ratio

Dimana Odd(x) (bilangan ganjil (x))adalah integer ganjil (odd) terdekat terhadap x (dibulatkan keatas jika x adalah integer genap, meskipun hal ini tidak terjadi disini). Untuk w = 16, 32, dan 64, konstanta ini diberikan berikut ini dalam biner dan dalam heksadesimal.

P16= 1011011111100001 = b7e1.

Q16= 1001111000110111= 9e37.

P32= 10110111111000010101000101100011 = b7e15163.

Q32=10011110001101110111100110111001 = 9e3779b9.

P62= 1011011111100001010100010110001010001010111011010010101001101011

= b7e151628aed2a6b.

Q64= 1001111000110111011110011011100101111111010010100111110000010101

= 9e3779b97f4a7c15.

Merubah Kunci Dari Bit Ke Word

Langkah algoritmik pertama dari key expansion adalah untuk meng-copy kunci rahasia K[0…b – 1] ke array L[0…e – 1] dari word c = [b/u], dimana u = w/8 adalah jumlah byte/word. Operasi ini dilakukan dalam cara yang alami, menggunakan kunci byte konsekutif (berulang) u dari K untuk memenuhi setiap word dalam L, byte low order sampai byte high order. Posisi byte yang tidak terisi dari L dibuat 0. pada kasus ini b = c = 0 kita me-reset c ke 1 dan me-set L[0] menjadi 0.

Pada mesin “little-endian” seperti pada Intel 486, task diatas dapat diselesaikan hanya dengan membuat array L menjadi 0, dan kemudian meng-copy string K secara langsung ke posisi memori yang merepresentasikan L. Pseudocode berikut ini mencapai efek yang sama, diasumsikan semua byte adalah “unsigned” dan semula array L dibuat 0.

C=[max(b,1)/u]

for i=b-1 downto 0 do

L[i/u]=(L[i/u] <<<8)>

Menginisialisasi Array S

Langkah algoritmik kedua dari key expansion adalah untuk menginisialisasi array S menjadi pola bit pseudo-random tertentu yang tetap (key-independent), menggunakan deret aritmetika modulo 2w ditentukan oleh “magic constant” Pw dan Qw. Karena Qw ganjil, deret aritmetik memiliki periode 2w.

S[0] = Pw;

for i=1 to t-1 do

S[i] = S[i-1]+Qw;

Dari algoritma diatas terlihat bahwa pada kondisi 0 S[0] berisi Pw dan pada itersi i=1 dan seterusnya, S[i] akan berisi S[i-1] + Qw.

Penggabungan Kunci

Langkah algoritmik ketiga dari key expansion adalah untuk menggabungkan kunci rahasia user dalam tiga cara pada array S dan L. Lebih tepatnya, dikarenakan ukuran yang berbeda secara potensial pada S dan L, array yang lebih besar akan diproses tiga kali, dan yang lainnya dapat ditangani lebih dari tiga kali. Bentuk algoritma proses dapat dilihat berikut ini :

i=j=0;

A=B=0;

do 3 * max(t,c) times

A=S[i]=(S[i]+A+B) <<>

B=L[j]=(L[j]+A+B) << (A+B);

i=(i+1) mod (t);

j=(j+1) mod(c);

Bentuk Implementasi Dalam Bahasa C

(please…give ur comment!!!)

Implementasi ini dilakukan terhadap format RC-5 32bit, 12 putaran dengan 16 byte kata kunci [7].

# include

typedef unsigned long int WORD; /* Panjang word 32bit=4 byte*/

#define w 32 /* Ukuran word dalam bit*/

#define r 12 /* Jumlah putaran*/

#define b 16 /* Jumlah kata kunci*/

#define c 4 /* Jumlah word*/

#define t 26 /* Ukuran tabel S=2*(r+1)*/

WORD S[t]; /* Tabel pengembangan key*/

WORD P = 0xb7e15163, Q=0x9e3779b9; /* Konstanta magic*/

/* Operasi putaran*/

#define ROTL (x,y) (((x)<<(y&(w-1)))|((x)>>(w-(y&(w-1)))))

#define ROTR (x,y) (((x)>>(y&(w-1)))|((x)<<(w-(y&(w-1)))))

void RC5_ENCRYPT (WORD *pt, WORD *ct) /* proses enkripsi*/

{

WORD i, A=pt[0]+S[0], B=pt[1]+S[1];

for (i=1;i<=r;i++)

{

A=ROTL (A^B,B)+S[2*i];

B=ROTL (B^A,A)+S[2*i+1];

}

ct[0]=A; ct[1]=B;

}

void RC5_DECRYPT (WORD *ct, WORD *pt) /* Proses dekripsi*/

{

WORD i, B=ct[1], A=ct[0];

for (i=r;i>0;i--)

{

B=ROTR (B-S[2*i+1],A)^A;

A=ROTR (A-S[2*i],B)^B;

}

pt[1]=B-S[1]; pt[0]=A-S[0];

}

void RC5_SETUP (unsigned char *k) /* Proses input kunci rahasia*/

{

WORD i, j,k, u=w/8, A, B, L[c];

for (i=b-1,L[c-1]=0;i!=-1;i--)

L[i/u]= (L[i/u]<<8)>

for (S[0]=P,i=1; i

S[i] = S[i-1]+Q;

for (A=B=i=j=k=0;k<3*t;k++,i=(i+1)%t,j=(j+1)%c)

{

A=S[i]=ROTL (S[i]+(A+B),3);

B=L[j]=ROTL (L[j]+(A+B),(A+B));

}

}

void printword(WORD A) /* Proses input plaintext acak*/

{

WORD k;

for (k=0;k

printf ("%02.21X",(A>>k)&0xFF);

}

void main()/* Program utama*/

{

WORD i,j,k,pt1[2],pt2[2],ct[2]={0,0};

unsigned char key[b];

if (sizeof(WORD) !=4)

printf ("RC5 ERROR : WORD has %d bytes.\n",sizeof(WORD));

printf ("RC5-32/12/16 examples : \n");

for (i=1;i<6;i++)

{

pt1[0]=ct[0];pt[1]=ct[1];

for (j=0;j

RC5_SETUP(key);

RC5_ENCRYPT (pt1,ct);

RC5_DECRYPT(ct,pt2);

printf("\n%d. key= ",i);

for (j=0;j

printf ("02.2X",key[j]);

printf ("\n Plaintext ");

printword(pt1[0]);

printword(pt1[1]);

printf("----> ciphertext ");

printf word(ct[0]);

print word(ct[1]);

printf("\n");

if (pt1[0] !=pt2[0] || pt1[1] !=pt2[1])

printf ("Decryption Error");

}

}

Hasil simulasi program adalah :

Key = 91 5F 46 19 BE 41 B2 51 63 55 A5 01 10 A9 CE 91

Plaintext = 21A5DBEE154B8F6D

chipertext = F7C013AC5B2B8952

Menurut saya…

Pada kondisi nyata, semua algoritma enkripsi data yang ada masih dapat dipecahkan kuncinya oleh para kritoanalis, hal ini menunjukan bahwa tidak ada algoritma enkripsi data yang sempurna, termasuk juga disini algoritma RC-5. Untuk enkripsi model RC-5 masih terdapat beberapa kelebiha dan kelemahan yaitu diantaranya;.

A. Kelebihan

§ Kesulitan mengetahui sebuah nilai dalam table pengembangan key karena prose pengembangan key dilakukan secara random.

§ Algoritma enkripsi ini dapat diimplementasikan dalam bentuk hard ware, karena pada dasarnya algoritm in menggunakan operasi yang dapat dilakukan oleh perangkat keras seperti prosesor.

§ Tingkat keamanan dari enkripsi yang dilakukan dapat dipilih dengan

menggunakan jumlah kata kunci yang digunakan, hal ini terlihat bahwa jumlah kata kunci akan menentukan jumlah pembagian plaintext yang akan dienkripsi.

B. Kekurangan

§ Algoritma RC-5 dapat diserang dengan menggunakan analisa dari bagian table pengembangan kunci rahasia.

§ Salah satu kelemahan umum dari metode enkripsi simetrik adalah masalah manajemen kunci. Hal ini juga terdapat pada RC-5, dimana penerima harus memiliki kunci yang sama untuk membuka chipertext yang dikirimkan kepadanya. Hal ini juga merupakan suatu kelemahan yang dapat dimanfaatkan oleh penyerang.

Regards: M N F

5 comments:

Anonim mengatakan...

loopingnya bisa lebih sederhana dek..

great job

Anonim mengatakan...

rc-5 ITU TERMASUK block cipher atau stream siy??

apa bedanya stream dg blog??



knp tertarik dg RC-5
tapi program C nya saya compile ada errornya diktnya ya??

suksess

Anonim mengatakan...

wah mar,menurut gw bahasa c terlalu susah,

kenapa ga coba pake VB or java lebih mudah dalam bikin program,

secara g kenyang banget bikin program...

gud luck bro

Anonim mengatakan...

marta... lw dpt algoritma yg pke bhs C yaaa...???

sama dunk...
hehehehe....

Anonim mengatakan...

hi,
dulu gw pernah presentasi-in RC5 di depan dosen n kawan" gw dikampus,
dan pertanyaan gw adalah
"bagaimana cara mengenerate kunci RC5 itu sendiri?"

dan

" bagaimana pembuktian dari kelemahan " RC5 yang anda kemukakan di bagian kesimpulan?"
thx 4 d answer