为了方便研究802.11数据帧的加密格式,自己写了个RC4算法的程序,只输出密钥流的第一个字节,用来和LLC头的第一个字节做异或运算,没什么技术含量,呵呵

 

   
   
   
   
  1. /*code by zhaoxiaobu  
  2. #include   
  3.  
  4. /*RC4加密算法 */ 
  5. unsigned char RC4(unsigned char *IV,unsigned char *key)  
  6. {  
  7.     unsigned char K[256];  
  8.     unsigned char S[256];  
  9.     unsigned char seed[16];  
  10.     int i,j,k,t;  
  11.  
  12.  
  13.     for(k=0;k<3;k++)  
  14.     {  
  15.         seed[k]=IV[k];  
  16.     }  
  17.  
  18.     for(k=0;k<13;k++)  
  19.     {  
  20.         seed[k+3]=key[k];  
  21.     }  
  22.  
  23.  
  24.  
  25.     for(k=0;k<256;k++)  
  26.     {  
  27.         S[k]=k;  
  28.         K[k]=seed[k%16];  
  29.     }  
  30.  
  31.     j=0;  
  32.     for(i=0;i<256;i++)  
  33.     {  
  34.         j=(j+S[i]+K[i])%256;  
  35.         t=S[i];  
  36.         S[i]=S[j];  
  37.         S[j]=t;  
  38.     }  
  39.  
  40.  
  41.     i=0;  
  42.     j=0;  
  43.  
  44.     i=i+1;  
  45.     j=j+S[i];  
  46.  
  47.     t=S[i];  
  48.     S[i]=S[j];  
  49.     S[j]=t;  
  50.  
  51.     k=(S[i]+S[j])%256;  
  52.     return S[k];  
  53.       
  54. }  
  55.  
  56.  
  57. int main(int argc,char *argv[])  
  58. {  
  59.     unsigned char K[256];  
  60.     unsigned char S[256];  
  61.  
  62.     unsigned char IV[3]={0x1d,0x9c,0xea}; //3个字节的初始向量(IV)  
  63.     unsigned char key[13]={0x30,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x32,0x33,0x34};    //13个字节的密钥(假如采用的是128位加密算法)  
  64.     unsigned char seed[16];  
  65.  
  66.     int i,j,k,t,x,A;  
  67.     unsigned char keystream;  
  68.  
  69.     keystream=RC4(IV,key);  
  70.     printf("Using IV: (%d,%d,%d), first keystream byte is %02x\n",IV[0],IV[1],IV[2],keystream); //输出RC4加密流的第一个字节,用来和LLC头的第一个字节做异或运算  
  71. }