Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170851
  • 博文数量: 49
  • 博客积分: 2802
  • 博客等级: 大尉
  • 技术积分: 502
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-25 12:02
个人简介

来就来吧

文章分类

全部博文(49)

文章存档

2014年(1)

2012年(1)

2011年(11)

2010年(26)

2009年(10)

分类: C/C++

2009-12-17 16:56:58

RC4加密及解密

#include
#include "stdlib.h"
#include "string.h"

typedef struct rc4_key_str
{      
     unsigned char state[256];       
     unsigned char x;        
     unsigned char y;
} rc4_key;

static void swap_byte(unsigned char *a, unsigned char *b);

void prepare_key(unsigned char *key_data_ptr,
int key_data_len,
rc4_key *key)
{
     unsigned char index1;
     unsigned char index2;
     unsigned char* state;
     short counter;     
     
    state = &key->state[0];         
     for(counter = 0; counter < 256; counter++)              
     state[counter] = counter;               
     key->x = 0;     
     key->y = 0;     
     index1 = 0;     
     index2 = 0;             
     for(counter = 0; counter < 256; counter++)      
     {               
          index2 = (key_data_ptr[index1] + state[counter] +
             index2) % 256;                
          swap_byte(&state[counter], &state[index2]);            

          index1 = (index1 + 1) % key_data_len;  
     }       
}
    
void rc4(unsigned char *buffer_ptr, int buffer_len,  rc4_key *key)
    unsigned char x;
    unsigned char y;
    unsigned char* state;
    unsigned char xorIndex;
    short counter;              
        
    x = key->x;     
    y = key->y;     
        
    state = &key->state[0];         
    for(counter = 0; counter < buffer_len; counter ++)      
    {               
         x = (x + 1) % 256;                      
         y = (state[x] + y) % 256;               
         swap_byte(&state[x], &state[y]);                        
                  
         xorIndex = (state[x] + state[y]) % 256;                 
                  
         buffer_ptr[counter] ^= state[xorIndex];         
    }               
    key->x = x;     
    key->y = y;
}
    
static void swap_byte(unsigned char *a, unsigned char *b)
{
    unsigned char swapByte; 
       
    swapByte = *a; 
    *a = *b;      
    *b = swapByte;
}

static void rc4Decrypt(char *key, char *data)
{
    unsigned char seed[5] = "chsh";
    rc4_key rc4key;

    prepare_key(seed, strlen(key), &rc4key); 
    rc4((unsigned char *)data, strlen(data), &rc4key);
    return;
    
}

void main(int argc, char *argv[])
{
char buffer[200] = {0};
int i, strl;
char *temp; 
    char *Key = "keys"; 
char *p;

if( strlen(argv[1]) > 200 ) {
printf("enter the many string!\n");
return;
}

temp = argv[1];
memcpy(buffer, temp, strlen(temp));

printf("src string:\n");
for( i = 0; i < strlen(buffer) ; i++)
{
printf("%x ", buffer[i]);
}
printf("\n\n");

rc4Decrypt(Key, buffer);

printf("Encryption string:\n");
for( i = 0; i < strlen(buffer) ; i++)
{
printf("%x ", buffer[i]);
}
printf("\n\n");

rc4Decrypt(Key, buffer);

printf("Decryption string:\n");
for( i = 0; i < strlen(buffer) ; i++)
{
printf("%x ", buffer[i]);
}
printf("\n\n");

}

阅读(7510) | 评论(0) | 转发(0) |
0

上一篇:bzip2压缩

下一篇:数组a 与 &a

给主人留下些什么吧!~~