RC4加密简介
1.RC4是一种对称的加密算法,即加密和解密使用相同密钥的加密算法。
2.RC4算法简单,运行速度快,而且密钥长度是可变的,可变范围为1-256字节,生成的密钥流的长度和明文的长度是对应的,密钥流是由密钥和其长度所决定的。
3.现如今,对于128比特以上的密钥长度,暴力搜索密钥是不行的,所以现如今RC4密钥是可靠的。
4.RC4主要包括了初始化算法(KSA)和加密算法两大部分。
RC4加密流程分析
-
加密过程概述:
1.先初始化状态向量S(256个字节,用来作为密钥流生成的种子1)按照升序,给每一字节赋值0,1,2,3,4......254,255
2.初始密钥(由用户输入),长度任意,如果输入长度小于256个字节,则进行轮转,知道填满,例如输入密钥的是1,2,3,4,5,那么填入的是1,2,3,4,5,1,2,3,4,5,1,2,3,4,5......
由上述流转过程得到256个字节的向量T(用来作为密钥流生成的种子2)
3.最后是根据向量S和T生成密钥流与铭文进行加密
-
代码通常的结构:(mod==%)
1.初始化S和T
for i=0 to 255 do
S[i]=i;
T[i]=K[i mod keylen ]; //keylen是K的长度,该语句是为了限制T的长度
2.初始排列S
j=0;
for i=0 to 255 do
j=(j+S[i]+T[i]) mod 256;
swap(S[i],S[j]); //swep交换
3.产生密钥流,利用密钥流和明文进行加密
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];
data[r]^=k[r]; //单个字节加密 data[]明文 k[]密钥流的单个字节
^异或加密:同为0,不同为1
1101 a(明文)^1101 b(密钥流)=0110 c(加密后的数据)
a^b=c 加密
a=b^c 解密得到明文
例: 0110 ^ 1101 = 1011
RC4特征识别
1.反编译后可以看见多个循环次数为256的循环,以及存在一些%256的运算
2.最后处理输入数据的是异或
RC4常见魔改方法
由于RC4的加密就是生成密钥流和输入进行异或,所以通常魔改竞赛添加一些可逆运算
1.魔改初始化算法,可以将S初始化值并不是设置成0-255,也可以设置成其他的,也可以在S的初始置换过程中添加可逆运算
for(i=0;i<256;i++) for(i=0;i<256;i++)
{ {
j=(j+S[i]+k[i])%256; j=(j+S[i]+k[i])%256;
temp=S[i]; temp=S[i];
S[i]=S[j]; S[i]=S[j];
S[j]=temp; S[j]=temp^0x37;
} }
其实这些都不影响,后面学会动调之后可以直接将它RC4_init算法生成的大小为255的S从内存中取出即可
2.由于最后加密flag是利用密钥流来单字节加密的,也有人会在这个地方添加一些可逆运算来进行魔改
flag[k]=flag[k]^S[t]^0x66
总之遵循:
enc_data =RC4(flag)
flag = RC4(enc_data)