RC4加解密源码(C语言描述)

本文介绍RC4加解密源码(C语言描述)。

RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4具有加解密速度快,算法简单等优点,在算力不高场合(MCU)也可以使用。

1.源码

1)头文件

头文件(rc4.h)主要包括RC4相关数据结构定义及外部函数声明。头文件定义如下。

#ifndef __RC4_H
#define __RC4_H


#ifdef __cplusplus
 extern "C" {
#endif 


typedef struct _RC4_INFO
{
    uint8_t s[256];
    uint8_t t[256];
}RC4_INFO;     

 
extern void rc4_init(RC4_INFO *RC4Info, const uint8_t *key, uint32_t len);
extern void rc4_crypt(RC4_INFO *RC4Info, const uint8_t *input, uint8_t *output, uint32_t len);    
     

#ifdef __cplusplus
}
#endif



#endif

注意

a)加密过程,需要先调用rc4_init()函数,再调用rc4_crypt()函数,同样,解密过程,也需要先调用rc4_init()函数,再调用rc4_crypt()函数。加解密使用的是同一个密钥。

b)密钥长度可变,一般为8-256 bits,常用128 bits。

2)源文件

源文件(rc4. c)主要包括RC4相关外部函数定义。源文件定义如下。

#include "rc4.h"


static void swap(uint8_t *p1, uint8_t *p2);


void rc4_init(RC4_INFO *RC4Info, const uint8_t *key, uint32_t len)
{
    uint32_t i = 0;
    uint32_t j = 0;

    if ((RC4Info == NULL) || (key == NULL) || (len == 0))
    {
        return ;
    }

    //Initial values of both vectors
    for (i = 0; i < 256; i++)
    {
        RC4Info->s[i] = (uint8_t)i;
        RC4Info->t[i] = key[i % len];
    }

    //Initial permutation
    for (i = 0; i < 256; i++)
    {
        j = (j + RC4Info->s[i] + RC4Info->t[i]) % 256;
        swap(&RC4Info->s[i], &RC4Info->s[j]);
    }
}


void rc4_crypt(RC4_INFO *RC4Info, const uint8_t *input, uint8_t *output, uint32_t len)
{
    uint32_t i = 0;
    uint8_t t1 = 0;
    uint8_t t2 = 0;
    uint8_t val = 0;
    uint8_t out = 0;

    if ((RC4Info == NULL) || (input == NULL) || (output == NULL) || (len == 0))
    {
        return ;
    }

    //process one byte at a time
    for (i = 0; i < len; i++)
    {
        t1 = (t1 + 1) % 256;
        t2 = (t2 + RC4Info->s[t1]) % 256;
        swap(&RC4Info->s[t1], &RC4Info->s[t2]);
        val = (RC4Info->s[t1] + RC4Info->s[t2]) % 256;
        out = *input++ ^ RC4Info->s[val];
        *output++ = out;
    }
}


static void swap(uint8_t *p1, uint8_t *p2)
{
    uint8_t t = 0;

    if ((p1 == NULL) || (p2 == NULL))
    {
        return ;
    }

    t = *p1;
    *p1 = *p2;
    *p2 = t;
}

2.测试

这里主要测试加解密过程。

int main()
{
    RC4_INFO RC4Info;
    uint8_t key[] = {0x03, 0x01, 0x02, 0x03, 0x04, 0x08, 0x09, 0x1a};
    uint8_t data[] = {0x03, 0x04, 0x08, 0x09, 0xa5, 0x5a, 0x33, 0x22, 0x88};
    uint8_t encrypt[256] = {0};
    uint8_t decrypt[256] = {0};
    uint32_t i = 0;

    printf("raw data:\r\n");
    for (i = 0; i < sizeof(data) / sizeof(data[0]); i++)
    {
        printf("0x%02x ", data[i]);
    }
    printf("\r\n");

    //encrypt
    rc4_init(&RC4Info, key, sizeof(key) / sizeof(key[0]));
    rc4_crypt(&RC4Info, data, encrypt,  sizeof(data) / sizeof(data[0]));

    printf("encrypted data:\r\n");
    for (i = 0; i < sizeof(data) / sizeof(data[0]); i++)
    {
        printf("0x%02x ", encrypt[i]);
    }
    printf("\r\n");

    //decrypt
    rc4_init(&RC4Info, key, sizeof(key) / sizeof(key[0]));
    rc4_crypt(&RC4Info, encrypt, decrypt,  sizeof(data) / sizeof(data[0]));

    printf("decrypted data:\r\n");
    for (i = 0; i <  sizeof(data) / sizeof(data[0]); i++)
    {
        printf("0x%02x ", decrypt[i]);
    }
    printf("\r\n");

    return 0;
}

输出结果:

总结,本文介绍了RC4加解密源码(C语言描述)。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值