رمزهای دنباله ای stream cipher RC4 الگوریتم RC4 یک رمزکننده ی دنباله ای است که درسال 1987توسط ران ری وست طراحی شد رمزکننده بلوکی در هر زمان یک بلوک از ورودی را پردازش می کند و برای هربلوک ورودی یک بلوک خروجی تولید می کند ولی رمز کننده ی دنباله ای عناصر ورودی را به طور پیوسته پردازش کرده و هربار یک عنصر خروجی تولید می کند. رمزکننده ی دنباله با کلیدی با طول متغیر است که عملیات آن بایت گرا می باشد این الگوریتم از جایگشت تصادفی استفاده می کند LOGO رمزکننده ی دنباله رمزکننده ی دنباله هر بار یک بایت یا واحد های بزرگتر از یک متن ساده را رمز گذاری می کند. دنباله کلید به صورت دنباله ای از بایت هاست. امتیاز عمده ی رمز کننده ی دنباله ای نست به رمز کننده های بلوکی این است که این رمزکننده سریعتر عمل نموده و نسبت به رمز کننده های بلوکی از کدهای کمتری استفاده می نماید. رمزکننده های بلوکی چون از کلیدهای یک بارمصرف استفاده می نماید احتمال تکراری بودن کلید بیشتر بوده در حالیکه رمزکننده ی بلوکی از جایگشت های مختلف این کلید میتواند استفاده کند. LOGO ساختار رمزکننده ی دنباله کلید K کلید K مولدبایت شبه تصادفی (مولد دنباله کلید) دنباله بایت متن ساده M دنباله بایت متن رمزشده C رمزگشایی LOGO مولدبایت شبه تصادفی (مولد دنباله کلید) دنباله بایت متن رمزشده دنباله کلید C رمزگذاری دنباله بایت متن ساده M Stream Ciphers – General Concept state (data) مولدبایت شبه تصادفی )(مولد دنباله کلید key next state function output output function function ksi pi (ci) ci (pi) LOGO RC4 S-Box Creation input key; if (key < 256 bytes) { repeat key until 256 bytes; } for (i=0; i < 256; ++i) { S[i] = i; // initialize S-Box K[i] = ith key byte; } j = 0; for (i = 0; i <256; ++i) { j = (j + S[i] + K[i]) mod 256; swap(S[i],S[j]); } Keystream Generator i = 0; j = 0; loop { i = (i+1) mod 256; j = (j+S[i]) mod 256; Swap(S[i],S[j]); t = (S[i] + S[j]) mod 256; ks_byte = S[t]; } 2 S-Box entries form index into S-Box Output S-Box entry (byte) S-Box: key dependent permutation of 0 to 255. (lookup table) LOGO LOGO مثال ] K=[ 1 2 3 6 کلید K ] S=[ 0 1 2 3 4 5 6 7بردارحالت می خواهیم جایگشتی از تمام اعداد 8بیتی تولید کنیم وبایت kرا از sتولید کنیم و با تولید هرمقدار kوارده های sیکباردیگر جایگشت می شوند مولدبایت شبه تصادفی (مولد دنباله کلید) ] T= [1 2 3 6 1 2 3 6بردار موقت دنباله بایت متن رمزشده ?=c C ?= kدنباله کلید دنباله بایت متن ساده p ] P= [ 1 2 2 2 LOGO Assume we use a 4 x 3-bit key, K, and plaintext P as below: مفروضات K = [1 2 3 6] P = [1 2 2 2] The first step is to generate the stream . Initialise the tate vector S and temporary vector T. S is initialised so the S[i] = i, and T is initialised so it is the key K (repeated as necessary). S = [0 1 2 3 4 5 6 7] T = [1 2 3 6 1 2 3 6] Now perform the initial permutation on S. j = 0; for i = 0 to 7 do j = (j + S[i] + T[i]) mod 8 Swap(S[i],S[j]); end ; آماده سازی s بردار LOGO We will step through for each iteration of i: S = [0 1 2 3 4 5 6 7] T = [1 2 3 6 1 2 3 6] For i = 0: j = (0 + 0 + 1) mod 8 j= 1 Swap(S[0],S[1]); So in the 1st iteration S[0] must be swapped with S[1] giving: S = [1 0 2 3 4 5 6 7] j = 0; for i = 0 to 7 do j = (j + S[i] + T[i]) mod 8 Swap(S[i],S[j]); end The results of the remaining 7 iterations are: For i = 1: j=(1+0+2) mod 8=3 j=3 Swap(S[1],S[3]) S = [1 3 2 0 4 5 6 7]; For i = 2: J=(3+2+3) mod 8=0 j=0 Swap(S[2],S[0]); S = [2 3 1 0 4 5 6 7] For i = 3: j =(0+0+ 6)=6; Swap(S[3],S[6]) S = [2 3 1 6 4 5 0 7]; LOGO For i = 4: j=3 Swap(S[4],S[3]) S = [2 3 1 4 6 5 0 7]; j = 0; for i = 0 to 7 do j = (j + S[i] + T[i]) mod 8 Swap(S[i],S[j]); end For i = 5: j=2 Swap(S[5],S[2]); S = [2 3 5 4 6 1 0 7]; For i = 6: j = 5; Swap(S[6],S[5]) S = [2 3 5 4 6 0 1 7]; For i = 7: j = 2; Swap(S[7],S[2]) S = [2 3 7 4 6 0 1 5]; Hence, our initial permutation of S gives: S= [2 3 7 4 6 0 1 5] ، تنها اثر، جابجایی استs چون تنها عملیات روی هنوز حاوی تمام اعداد از صفرS و.جایگشت می باشد می باشد255تا LOGO Now we generate 3-bits at a time, k, that we XOR with each 3-bits of plaintext to produce the ciphertext. The 3-bits k is generated by: تولید دنباله ;i, j = 0 { )while (true ;i = (i + 1) mod 8 ;j = (j + S[i]) mod 8 ;)]Swap (S[i], S[j ;t = (S[i] + S[j]) mod 8 ;]k = S[t } وقتی بردار آماده شد کلید ورودی دیگر مورد استفاده قرار نمی گیرد تولید دنباله شامل مرور تمام عناصر ] s[iاست به طوریکه هر ] s[iبا بایت دیگری در sجابجا می شود که طرح آن توسط پیکربندی فعلی sتعیین می گردد .پس از رسیدن به ] s[255این فرایند دوباره از ] s[0ادامه می یابد. برای رمزگذاری مقدار kرا با بایت بعدی متن ساده XORمی کنیم و برای رمزگشایی مقدارKرا با بایت بعدی متن رمز شده XOR می کنیم LOGO The first iteration: S = [2 3 7 4 6 0 1 5] i = (0 + 1) mod 8 = 1 j = (0 + S[1]) mod 8 = 3 Swap(S[1],S[3]) S = [2 4 7 3 6 0 1 5] t = (S[1] + S[3]) mod 8 = 7 k = S[7] = 5 Remember, that P is: P = [1 2 2 2] So our rst 3-bits of ciphertext is obtained by: k XOR P1 5 XOR 1 = 101 XOR 001 = 100 = 4 C=[4 - - - ] S = [2 4 7 3 6 0 1 5] i = (1 + 1 ) mod 8 = 2 j = (3 + S[2]) mod 8 = 2 Swap(S[2],S[2]) S = [2 4 7 3 6 0 1 5] t = (S[2] + S[2]) mod 8 = 6 k = S[6] = 6 Second 3-bits of ciphertext are: 6 XOR 2 = 110 XOR 010 = 100 = 4 C=[4 4 - - ] The third iteration: S = [2 4 7 3 6 0 1 5] i = (2 + 1) mod 8 = 3 j = (2 + S[3]) mod 8 = 5 Swap(S[3],S[5]) S = [2 4 7 0 6 3 1 5] t = (S[3] + S[5]) mod 8 = 3 k = S[3] = 0 Third 3-bits of ciphertext are: 0 XOR 2 = 000 XOR 010 = 010 = 2 C=[4 4 2 - ] The final iteration: S = [2 4 7 0 6 3 1 5] i = (1 + 3 ) mod 8 = 4 j = (5 + S[4]) mod 8 = 3 Swap(S[4],S[3]) S = [2 4 7 6 0 3 1 5] t = (S[4] + S[3]) mod 8 = 6 k = S[6] = 1 Last 3-bits of ciphertext are: 1 XOR 2 = 001 XOR 010 = 011 = 3 i, j = 0; while (true) { i = (i + 1) mod 8; j = (j + S[i]) mod 8; Swap (S[i], S[j]); t = (S[i] + S[j]) mod 8; k = S[t]; } C=[4 4 2 3 ] LOGO So to encrypt the plaintext stream P with key K with our simplied RC4 stream we get C: P = [1 2 2 2] K = [1 2 3 6] C = [4 4 2 3] Or in binary: P = 001010010010 K = 001010011110 C = 100100010011 LOGO LOGO