zoukankan      html  css  js  c++  java
  • RC4加密算法,MCU中使用

     1 /******************** (C) COPYRIGHT 2012 WildFire Team **************************
    10 **********************************************************************************/
    11 #include "stm32f10x.h"
    12 
    13 void swap_byte(unsigned char *a, unsigned char *b);
    14 /*rc4.c */
    15 typedef struct rc4_key
    16 {      
    17      unsigned char state[256];       
    18      unsigned char x;        
    19      unsigned char y;
    20 } rc4_key;
    21 
    22 void prepare_key(rc4_key *key, unsigned char *key_data_ptr, int key_data_len)
    28 {
    29   unsigned char index1;
    31     unsigned char index2;
    32     unsigned char *state;
    33     short counter;     
    34     state = &key->state[0];         
    35     for(counter = 0; counter < 256; counter++)              
    36     state[counter] = counter;               
    37     key->x = 0;     
    38     key->y = 0;     
    39     index1 = 0;     
    40     index2 = 0;             
    41     for(counter = 0; counter < 256; counter++)      
    42     {               
    43         index2 = (key_data_ptr[index1] + state[counter] +index2) % 256;                
    44         swap_byte(&state[counter], &state[index2]);            
    45         index1 = (index1 + 1) % key_data_len;  
    46     }       
    47 }
    48     
    49 void rc4(rc4_key *key,unsigned char *buffer_ptr, int buffer_len )
    50 { 
    51     unsigned char x;
    52     unsigned char y;
    53     unsigned char* state;
    54     unsigned char xorIndex;
    55     short counter;                  
    57     x = key->x;     
    58     y = key->y;        
    60     state = &key->state[0];         
    61     for(counter = 0; counter < buffer_len; counter ++)      
    62     {               
    63          x = (x + 1) % 256;                      
    64          y = (state[x] + y) % 256;               
    65          swap_byte(&state[x], &state[y]);                        
    66                   
    67          xorIndex = (state[x] + state[y]) % 256;                 
    68                   
    69          buffer_ptr[counter] ^= state[xorIndex];         
    70     }               
    71     key->x = x;     
    72     key->y = y;
    73 }
    74     
    75 void swap_byte(unsigned char *a, unsigned char *b)
    76 {
    77     unsigned char swapByte; 
    78        
    79     swapByte = *a; 
    80     *a = *b;      
    81     *b = swapByte;
    82 }
    83 
    84 unsigned char keys[9] = {8,0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef};
    85 
    86 
    87 int main()
    88 {
    89     rc4_key s;
    90     unsigned char buffer[10] = {0,1,2,3,4,5,6,7,8,9};
    91     //数据加密
    92     prepare_key(&s, keys, 10);    //加密初始化
    93     rc4(&s,buffer,10);            //将buffer加密,加密成功的数据放在s.state中
    94     //数据解密
    95        prepare_key(&s, keys, 10);    //解密初始化
    96     rc4(&s,buffer,10);            //将s.state中的数据解密,解密后的数据放在buffer中
    97 
    98 }
  • 相关阅读:
    maven 阿里镜像
    红黑树数据结构剖析
    一个简单的通用Makefile实现
    如何取消开机硬盘自检
    用友u8采购发票如何取消审核
    应付帐款—制单处理,出现“供应商被锁定”的解决方法
    用友系统管理员密码清除
    用友软件系统管理员账号admin密码忘记了,如何解决?
    用友 提示“尚有已全部暂估报销的单据未进行处理,不能进行12月的期末处理!”
    MySQL Windows版安装详解
  • 原文地址:https://www.cnblogs.com/yekang/p/RC4.html
Copyright © 2011-2022 走看看