RC4流密码是面向字节的,在算法过程中只是用了置换的方法,按照图中分成的两个部分,其C代码如下
KSA部分:
[cpp] view plaincopy
int i,j = 0
for (i = 0i <256i++)
{
s[i] = i
}
for (i = 0i <256i++)
{
k[i] = key[i % 8]//针对64bit的WEP加密,128bit的为[i % 16]
}
for (i = 0i <256i++)
{
j = (j + s[i] + k[i]) % 256
Swap(s[i], s[j])//进行置换
}
其中s[256]为状态列,k[256]为密钥列,key[8]为64位的密钥,状态列初始化为{0,1,2,3, , ,255},密钥列按照提供的密钥8字节重复填充至256字节满,通过置换,生成了一个状态列用以生成密钥流.
PRGA部分(只生成256个字节的密钥流):
[cpp] view plaincopy
for (i = 0, j = 0, LengthofKeyStream = 0LengthofKeyStream <256LengthofKeyStream++)
{
i = (i + 1) % 256
j = (j + s[i]) % 256
Swap(s[i], s[j])
keystream[LengthofKeyStream] = s[(s[i] + s[j]) % 256]
}
至此,我们就有了一个可以进行异或加密的密钥流keystream[256].在WEP加密当中应该是根据数据data的长度来调整需要得到的密钥流的长度。
序列密码又称流密码,原理是明文流和密钥流按顺序逐位异或运算,从而产出密文流,序列密码属于对合运算。
以下是典型的序列密码RC4的加解密算法实现。其中秘钥流产生算法由RSA和PRGA两个核心子算法组成。
其中引用了FrankTools模块中的ItoB, XOR, StoB, BtoS, swap函数,FrankTools模块中将常用函数打包以便调用,展示如下:
水平和精力所限,疏漏之处难免,欢迎各位多多不吝赐教!