0%

RC4

题目中也遇到过很多次RC4了,一般是都是从加密函数的名字看出,现在学习一下,了解其特征,更方便识别出。

简介

RC4是对称密码算法中的流密码加密算法,对称及加解密的密钥相同,流密码意思是加密是逐字节进行的与之对应的就是块加密

算法原理

RC4生成一种称为密钥流的伪随机流(S表),他与明文通过异或操作混合,以达到加密的目的,解密时与明文进行异或操作。其密钥流由两部分组成,分别是KSA和PRGA。可以简单的理解为RC4由这两部分组成。

KSA 部分的代码。密钥的长度一般为516字节及40128位,通常不超过256位。

1
2
3
4
5
6
7
8
9
10
for(i=0;i<256;i++)
{
S[i]=i; //用0~255初始化S数组
}
int j=0;
for(i=0;i<256;i++)
{
j=(j+S[i]+key[i % keylength]) % 256; //使用密钥进行替换
Swap(S[i],S[j]);
}

PRGA 根据待加密的data进行置换,得到的子密码k与data进行异或即可得到密文

1
2
3
4
5
6
7
8
9
10
i,j,t=0;
while(m=0;j<datalength;m++)
{
i=(i+1)%256;
j=(j+S[i])%256;
Swap(S[i],S[j]);
t=(S[i]+S[j])%256;
k=S[t];
data[m]^=k;
}

合并起来的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<stdio.h>
void Swap(int*a,int*b)
{
int t=0;
t=*a;
*a=*b;
*b=t;
}
int main()
{
char key[]="fishjump";
int keylength=strlen(key);
int S[255];
for(int i=0;i<256;i++)
{
S[i]=i; //用0~255初始化S数组
}
int j=0;
for(int i=0;i<256;i++)
{
j=((j+S[i]+key[i % keylength]) % 256); //使用密钥进行替换
Swap(&S[i],&S[j]);
}

int i=0;
j=0;
int t=0;
char data[]="mzyloveyy";
int datalength=strlen(data);
for(int m=0;m<datalength;m++)
{
i=(i+1)%256;
j=(j+S[i])%256;
Swap(&S[i],&S[j]);
t=(S[i]+S[j])%256;
int k=S[t];
data[m]^=k;
printf("%x\n",data[m]);
}
}

验证一下成果

okk。

特征

总结一下,如何在茫茫人海中一眼认出RC4?256位的数组交换函数,异或,over。

手写一遍之后以后遇到魔改的RC4应该就能拿捏了。