最近把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不当造成的:-(
这个就要涉及到下一篇要叙述的内容了,先保密一下:)