题目中也遇到过很多次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;        } 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;            }     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应该就能拿捏了。