RC4算法原理
-
对称加密算法、流密码加密算法(DES是分组加密算法)
-
密钥长度不固定(1-256byte),面向字节,以一个超大的S表为基础对表进行非线性变换,得到密钥流
-
其中
明文 xor 密钥 = 密文 , 密文 xor 密钥 = 明文
加密原理
1.填充S表
按升序填充S表内容,S[0] = 0 、S[1] = 1、、、、、S[255] = 255
2.填充K表(种子密钥)
将输入的种子密钥填充至大小为256byte的K表,一般不超过256byte,少于则循环补充例如密钥为123,则K表的值填充为123123123123…1(len = 256)
3.将K表与S表进行初始置换
置换算法:
j = 0;
for(int i = 0;i < 256;i++){
j = (j + S[i] + K[i]) mod 256;
swap(S[i],S[j]); //交换函数S[i]与S[j]进行交换数据
}
例子:假设S表长度为7,K表长度为7,那么算法为:
s = [0,1,2,3,4,5,6] #S表初始化
k = [3,4,5,3,4,5,3] #输入的密钥为345
j =0
for i in range(7) : #初始化S表算法
j = (j + s[i] + k[i]) % 7
m = s[i]
s[i] = s[j]
s[j] = m
flag = ''
#交换后的值
for i in s:
flag += str(i)
flag += ','
print(flag) #输出结果3,0,1,4,5,2,6
密钥流生成
生成算法:
int i , j =0;
for(int r = 0 ;r < data; r++){
//data表示明文长度,字节为单位
i = (i+1) mod 256;
j = (j+S[i]) mod 256;
swap(S[i],S[j]);
t = (S[i],S[j]) mod 256;
k[r] = S[t]; //这里就表示了明文多长,密钥就有多长
}
例子:假设S表长度为7,K表长度为7,写密钥算法:
s = [3,0,1,4,5,2,6] #经过上面S表初始化的值
k = [3,4,5,3,4,5,3] #输入的密钥为345
i = 0
j =0
for r in range(7) : #初始化S表算法
i = (i+1) % 7
j = (j + s[i]) % 7
m = s[i]
s[i] = s[j]
s[j] = m
t = (s[i] + s[j]) % 7
k[r] = s[t];
flag = ''
for r in k:
flag += str(r)
flag += ','
print(flag); #生成的密钥为:4,5,6,0,2,0,3