RC4解析

最近把WEP的加密解密原理小研究了下,这篇文章主要描述该协议的加密解密算法RC4。其他的在我接下来的文章中叙述。老鸟可绕行。

RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节(在实际产品中,也确实是256字节)。虽然它的官方名是“Rivest Cipher 4”,但是首字母缩写RC也可以理解为Ron's Code。

RC4最终产生一个伪随机比特流(keystream),加密的时候把它跟明文进行比特级别的异或处理,解密时进行一样的步骤(因为是对称密码)。

============以上是废话,可跳过==================

该算法分为以下两个步骤:
1.初始化算法The key-scheduling algorithm (KSA),一般也称为初始化S盒
2.伪随机生成算法(PRGA),生成密钥流

1.初始化S盒阶段。
其目的就是要将S-box搅乱。下面是伪代码:
/*将S盒从0-255依次进行线性赋值*/
for   i  from   0  to   255
   S[i] = i
endfor  

/*将S盒搅乱,其中的keylength是指是指密钥的长度,K盒是负责打乱S盒的。
通过重复填写最终将S盒打乱。打个比方:假设密钥为key为12345,最终的K盒就是0,1,2,3,4,0,1,2,3,4…这样的形式,最终要循环至K[255]。*/

j = 0
for   i  from   0  to   255
     j = (j + S[i] + key[i  mod   keylength]) mod 256
     swap(S[i],S[j])
endfor
这样写或许更清楚一些:
for i from 0 to 255
    K[i] = key[i % keylength]
endfor

j = 0
for   i  from   0  to   255

j = (j + S[i] + K[i]) mod 256

swap(S[i],S[j])
endfor

2.生成密钥流:
/*通过步骤1以后,即产生了一个打乱的S盒,现在用该盒进行运算,最终产生的S[t]就是用来和明文做异或运算的*/
i=j=0
while   (明文未结束)
            i = (i + 1) mod 256
            j = (j + S[i]) mod 256
            swap(S[i],S[j])

t= (S[i] + (S[j] % 256)) % 256

            output S[t] ^Message
endwhile

=================================================
以上就是RC4的算法步骤了,下面贴出的是Java代码:

 

package RC4;



	public class RC4_Encrypt_Decrypt {

	    public static void main(String[] args) {

	        String inputStr = "1940714";

	        String key = "97575655545352515049505152";



	        String str = RC4(inputStr, key);

	        System.out.println(str);

	        System.out.println(RC4(str, key));



	    }



	    public static String RC4(String Input, String Key) {

	        int[] S = new int[256];

	        byte[] K = new byte[256];



	        for (int i = 0; i < 256; i++)

	            S[i] = i;



	        int j = 1;



	        for (short i = 0; i < 256; i++) {

	            K[i] = (byte) Key.charAt((i % Key.length()));

	        }



	        j = 0;



	        for (int i = 0; i < 255; i++) {

	            j = (j + S[i] + K[i]) % 256;

	            int temp = S[i];

	            S[i] = S[j];

	            S[j] = temp;

	        }



	        int i = 0;

	        j = 0;

	        char[] InputChar = Input.toCharArray();

	        char[] OutputChar = new char[InputChar.length];

	        for (int k = 0; k < InputChar.length; k++) {

	            i = (i + 1) % 256;

	            j = (j + S[i]) % 256;

	            int temp = S[i];

	            S[i] = S[j];

	            S[j] = temp;

	            int t = (S[i] + (S[j] % 256)) % 256;

	            int iY = S[t];

	            char iCY = (char) iY;

	            OutputChar[k] = (char) (InputChar[k] ^ iCY);

	        }



	        return new String(OutputChar);



	    }



	}

大家把她拿到机子上在Debug模式下走一遍就应该清楚是怎么回事了。
这是C代码,这是C++代码。

理论上,RC4不是一个完全安全的加密系统,因为它生成的是伪随机密钥流,不是真正的随机字节。但是如果在协议中正确的使用,它是足够安全的,不幸的是,WEP的安全性很差,原因并不在RC4加密算法的问题,正是由于使用RC4不当造成的:-(
这个就要涉及到下一篇要叙述的内容了,先保密一下:)

  • steve

    rc4弱密钥,不是很安全吧

    • jaseywang

      确实!不过WEP的缺陷主要并不是因为RC4的弱密钥性导致的…