生成S盒和T盒

extern uint8_t S[256];
// 初始化向量S
for (i = 0; i < 256; i++)
{
S[i] = i;
}
extern uint8_t T[256];
// 轮转密钥赋值给 T
for (int i = 0; i < 256; i++)
{
T[i] = K[i % K_len]
}
int j = 0;
for (int i = 0 ; i < 256 ; i++)
{
j = (j + S[i] + T[i]) %256;
swap(S[i] , S[j]);
}

生成加解密的密钥流

i , j = 0;
for (int l = 0; l < data_len; l++)
{
    i = (i + 1) %256;
    j = (j + S[i]) %256;
    swap(S[i] , S[j]);
    // 这里 k 则是当前密钥流中的一位,数据与其进行异或
    t = (S[i] + S[j]) %256;
    k = S[t];
// 对相应下标的数据进行异或,则完成一个字节的加、解密
data[l] = data[l]^k;
}

C语音写法

#include <stdio.h>
#include <stdint.h>
#include <string.h>
typedef struct
{
uint8_ti;
uint8_tj;
uint8_t S[256];
}rc4_ctx;
void rc4_init(rc4_ctx* ctx, uint8_t* key, uint32_t keylen)
{
uint32_t i;
uint32_t j;
uint8_t T[256];
uint8_t tmp;
//初始化向量 S 和 向量 T
for (i = 0; i < 256; i++)
{
ctx->S[i] = i;
T[i] = key[i % keylen];
}
for (i = 0, j = 0; i < 256; i++)
{
// i 从 0 开始一直到255下标结束. j 是 S[i] 与 T[i] 组合得出的下标
j = (j + ctx->S[i] + T[i]) % 256;
// 交换 S[i] 与 S[j]
tmp = ctx->S[i];
ctx->S[i] = ctx->S[j];
ctx->S[j] = tmp;
}
ctx->i = 0;
ctx->j = 0;
}
// 因为 rc4 加密是取当前下标的一个字节与密钥流中的一位进行异或的,每次修改到的只会是当前下标所指向的一个字节
// 所以这里的输入 in 和 输出 out 可以是一个缓冲区,当然也可以是不同的缓冲区
void rc4_crypt(rc4_ctx* ctx, uint8_t* in, uint32_t inlen, uint8_t* out)
{
uint32_t i = 0;
uint32_t v = 0;
uint8_t tmp;
for (i = 0; i < inlen; i++)
{
// i 确保 S 中的每个元素都得到处理, j 确保 S 的搅乱是随机的
ctx->i = (ctx->i + 1) % 256;
ctx->j = (ctx->j + ctx->S[ctx->i]) % 256;
// 交换 S[i] 与 S[j]
tmp = ctx->S[ctx->i];
ctx->S[ctx->i] = ctx->S[ctx->j];
ctx->S[ctx->j] = tmp;
// 交换完之后 再把 S[i] + S[j] 的组合当做下标再去异或.
v = (ctx->S[ctx->i] + ctx->S[ctx->j]) % 256;
v = ctx->S[v];
out[i] = in[i] ^ v;
}
}
int main()
{
// 分别定义加密、解密的密钥流
rc4_ctx rc4_encrypt;
rc4_ctx rc4_dectypt;
// 定义 key
uint8_t * key = (uint8_t*)”abcd1234.”;
// 定义要解密的数据
char buff1[] = “Hello World”;
char buff2[] = “你好 世界”;
// 分别对其进行初始化
rc4_init(&rc4_encrypt, key, strlen((char *)key));
rc4_init(&rc4_dectypt, key, strlen((char *)key));
// 加密
rc4_crypt(&rc4_encrypt, (uint8_t *)buff1, strlen(buff1), (uint8_t *)buff1);
printf(“Hello World 加密后 ===> %s\n”, buff1);
// 解密
rc4_crypt(&rc4_dectypt, (uint8_t*)buff1, strlen(buff1), (uint8_t*)buff1);
printf(“Hello World 解密后 ===> %s\n”, buff1);
// 加密
rc4_crypt(&rc4_encrypt, (uint8_t*)buff2, strlen(buff2), (uint8_t*)buff2);
printf(“你好 世界 加密后 ===> %s\n”, buff2);
// 解密
rc4_crypt(&rc4_dectypt, (uint8_t*)buff2, strlen(buff2), (uint8_t*)buff2);
printf(“你好 世界 解密后 ===> %s\n”, buff2);
return 0;
}