参考:
https://blog.csdn.net/huangyimo/article/details/82970903
RC4算法
RC4加密算法是Ron Rivest在1987年设计出的密钥长度可变的加密算法簇。起初该算法是商业机密,直到1994年,它才公诸于众。RC4属于对称密码算法中的序列密码(stream cipher,流密码),它是可变密钥长度,面向字节操作的序列密码。它是一种基于非线性数据表变换的序列密码,它以一个足够大的数据表为基础,对表进行非线性变换,产生非线性的序列密钥。
RC4算法取n=8,使用2^n=2^8=256个字节构成的S表和两个字节指针(i,j),总共需要258字节的存储空间。
补:序列密码(流密码):
流密码也属于对称密码,但与分组(块)加密算法不同的是,流密码不对明文数据进行分组,而是用密钥生成与明文一样长短的密码流对明文进行加密,加解密使用相同的密钥。也就是说,RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。
RC4算法变量
介绍RC4算法的几个关键变量:
1)密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节;
2)状态向量S:长度为256,S[0],S[1].....S[255]。每个单元都是一个字节,算法运行的任何时候,S都包括0-255的8比特数的排列组合,只不过值的位置发生了变换;
3)临时向量T:长度也为256,每个单元也是一个字节。如果密钥的长度是256字节,就直接把密钥的值赋给T,否则,轮转地将密钥的每个字节赋给T;
4)密钥K:长度为1-256字节,注意密钥的长度keylen与明文长度、密钥流的长度没有必然关系,通常密钥的长度16字节(128比特)。
RC4算法流程
RC4算法是一种基于非线性数据表变换的序列密码,包括密码调度算法(简称KSA)和伪随机生成算法(简称PRGA)。RC4序列密码算法也可说是密钥流产生算法,其加密仅为明文与密钥模2相加。
1、密钥调度算法KSA(Key Scheduling Algorithm):
作用:实现对原始数据的随机化排序---初始随机化S表;
RC4算法中,取n=8(即8级线性移位寄存器),使用28=256个字节构成S表,存储空间为258字节(256字节S表,n和指针(I和J)共两个字节),把S表和I,J的具体取值称为RC4的一个状态。
初始化S盒:直接构造一个S[256],遍历0-255,然后创建临时T[256],用于存储种子秘钥,长度不够循环填充直到T被填满,根据T[i]将S[i]与S中的另外一个字节对换,对S的操作仅仅是交换,唯一改变的是位置,但里面的元素是没变的还是0-255; KSA的算法如图所示。
KSA算法描述如下:
- 初始化S表(对S表进行线性填充),即令S0=0,S1=1,…,S255=255;
- 由种子密钥填充到密钥T表(T表为256字符)中,如果种子密钥长度小于T的长度,则依次重复填充,直至将T填满;
- 用T表对S表进行初始置换,J的初始值为0,对于I从0到255循环,计算J=(J+Si+Ti )mod 256交换Si和Sj。
举例说明如下:
RC算法中,取n=3,即有2^3=8种状态,即8个元素;
- 初始化S表:
- 选择密钥,密钥由0到7的数以任意顺序组成,这里选取567作为密钥并填充密钥表T,填充后为:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
S[0] | S[1] | S[2] | S[3] | S[4] | S[5] | S[6] | S[7] |
5 | 6 | 7 | 5 | 6 | 7 | 5 | 6 |
T[0] | T[1] | T[2] | T[3] | T[4] | T[5] | T[6] | T[7] |
- 循环:J=(J+Si+Ti )mod 8交换Si和Sj,作用是进行随机化排序;
当J=0,I=0时,得到:S0=0;J=(0+0+5)mod 8=5,交换S0和S5;
索引 I 加1;
J=(5+1+6)mod 8=4,交换S1和S4;
如此循环,当循环执行完毕后,得到初始随机化的S表。S表一旦完成初始随机化,种子密钥就不再被使用。
2、伪随机生成算法PRGA(Pseudo-Randomoeneration-Algorithm)
作用:随机选取数据作为密钥字节---输出密钥流,PRGA借由KSA产生的S生成伪随机密钥序列Z[i]。
在KSA将数组S进行初始随机排序的基础上,PRGA从数组中随机选取元素作为密钥流字节,同时修改数组S的排序,以便于下一次密钥流的选取。
PRGA的算法如图所示:
举例说明如下:
设经过KSA算法,循环执行完毕之后得到初始化的数组为:
5 | 4 | 0 | 7 | 1 | 6 | 3 | 2 |
S[0] | S[1] | S[2] | S[3] | S[4] | S[5] | S[6] | S[7] |
从I=0,J=0开始,RC4通过循环开始计算第一个密钥子:
- 计算i=(i+1)mod 8 =1;j=(j+Si) mod 8=(0+4) mod 8=4;
- 交换S1和S4;交换后数组为:
5 | 1 | 0 | 7 | 4 | 6 | 3 | 2 |
S[0] | S[1] | S[2] | S[3] | S[4] | S[5] | S[6] | S[7] |
- 计算h=(Si+Sj)mod 8=(S1+S4)mod 8=5;k=Sh=S5=6;
- 得到第一个密钥为6,二进制表示为110,
反复进行以上过程,直到生成二进制位的数量等于明文位的数量。
加密:即将密钥字符k与明文字符进行异或运算输出密文。
注:RC4序列密码算法即密钥产生算法;加密仅仅为明文密钥模2相加。
3、RC4算法程序化流程
1)初始化S和T
根据秘钥生成S盒;
初始化S盒:直接构造一个S[256],遍历0-255,然后创建临时T[256],用于存储种子秘钥,长度不够循环填充直到T被填满,根据T[i]将S[i]与S中的另外一个字节对换,对S的操作仅仅是交换,唯一改变的是位置,但里面的元素是没变的还是0-255;
for i=0 to 255 do
S[i]=i;
T[i]=K[ I mod keylen ];
2)初始排列S
j=0;
for i=0 to 255 do
j= ( j+S[i]+T[i])mod256;
swap(S[i],S[j]);
3)产生密钥流
由于异或运算的对合性,RC4加密解密使用同一套算法:
i,j=0;
for r=0 to len do //r为明文长度,r字节
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];
RC4算法相关
1、RC4算法特点
RC4算法采用的是OFB(输出反馈工作方式),所以可以用一个短的密钥产生一个相对较长的密钥序列。OFB方式的最大的优点是消息如果发生错误(这里指的是消息的某一位发生了改变,而不是消息的某一位丢失),错误不会传递到产生的密钥序列上;缺点是对插入攻击很敏感,并且对同步的要求比较高。
RC4算法简单,易于实现。
算法运行速度快,加密速度快;RC4的执行速度相当快,它大约是分块密码算法DES的5倍,是3DES的15倍,且比高级加密算法AES也快很多。
密钥长度可变,可变范围为1-256字节(8-2048比特),一般用256个字节。
安全性:RC4有限状态自动机的每一个状态,产生一个密钥字符,由于S表有256个字节元素,可能的排列有256!,约为2的1600次幂,因此可以抵抗穷举攻击。算法安全性比较高,RC4的安全保证主要在于输入密钥的产生途径,只要在这方面不出现漏洞,采用128bit的密钥是非常安全的。在如今技术支持的前提下,当密钥长度为128比特时,用暴力法搜索密钥已经不太可行,所以可以预见RC4的密钥范围仍然可以在今后相当长的时间里抵御暴力搜索密钥的攻击。实际上,如今也没有找到对于128bit密钥长度的RC4加密算法的有效攻击方法。
2、RC4算法应用
Windows、Lotus Notes等软件系统;
SSL、TSL、WEP等协议;
APICloud;
补:一次性密码本、序列密码算法A5、RC5、ZUC!
注:
如有错误、侵权,请联系笔者更改删除!!!