RC4是Ron Rivest在1987年设计的密钥长度可变的流加密算法。它加解密使用相同的密钥,所以也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。因为RC4算法存在弱点,RFC 7465规定禁止在TLS中使用RC4加密算法[1]。 算法
RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,并且在加密过程当中S盒会变化。 数组
伪随机数生成器: spa
初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。设计
def rc4_init(sBox, key, length): ''' param1: 一个256长度的str数组, param2: 密钥,能够随便定义,长256 param3: 密钥的长度, ''' i, j = 0, 0 k = [0] * 256 temp = 0 for i in range(256): sBox[i] = i k[i] = key[i%length] for i in range(256): j = (j + sBox[i] + k[i])%256 temp = sBox[i] sBox[i] = sBox[j] sBox[j] = temp return
在初始化的过程当中,密钥的主要功能是将S-box搅乱,i确保S-box的每一个元素都获得处理,j保证S-box的搅乱是随机的。而不一样的S-box在通过伪随机子密码生成算法的处理后能够获得不一样的子密钥序列,将S-box和明文进行xor运算,获得密文,解密过程也彻底相同。code
def rc4_crypt(sBox, data, length): ''' param1: 被搅乱的S-box param2: 须要加密的数据 param3: data的长度 ''' for k in range(length): i = (i + 1) % 256 j = (j + sBox[i]) % 256 temp = sBox[i] sBox[i] = sBox[j] #交换s[i] 和 s[j] sBox[j] = temp t = (s[i] + s[j]) % 256 data[k] ^= s[t] #与或运算 return
此算法保证每256次循环中S盒的每一个元素至少被交换过一次。htm
参考文献:blog