RC4算法概述
RC4(Rivest Cipher 4)是由Ron Rivest在1987年设计的流密码算法,广泛应用于SSL/TLS、WEP等协议中。其核心是通过密钥调度算法(KSA)和伪随机生成算法(PRGA)生成密钥流,与明文进行异或操作实现加解密。
密钥调度算法(KSA)
初始化一个256字节的S盒(状态数组),通过密钥填充和置换打乱S盒顺序:
伪随机生成算法(PRGA)
利用S盒生成密钥流字节,每输出一个字节后更新S盒状态:
加解密实现
加密和解密均通过将密钥流与数据进行异或操作完成:
安全注意事项
RC4存在已知漏洞(如密钥重用导致明文泄露、WEP攻击等),现代应用中建议改用AES等更安全的算法。NIST已于2015年禁止RC4在TLS中使用。
性能特点
- 优点:实现简单、速度快,适合资源受限环境。
- 缺点:初始密钥输出偏差、密钥调度弱点等安全问题。
RC4.h
#ifndef _RC4_H_
#define _RC4_H_
#include <stdlib.h>typedef struct {unsigned char S[256]; // S盒int i, j; // 状态索引
} RC4_CTX;
void rc4_init(RC4_CTX* ctx, const unsigned char* key, size_t key_len);
void rc4_crypt(RC4_CTX* ctx, unsigned char* data, size_t data_len);
#endif
RC4.cpp
#include "stdio.h"
#include "string.h"
#include "RC4.h"// 初始化RC4上下文
void rc4_init(RC4_CTX *ctx, const unsigned char *key, size_t key_len) {// 初始化S盒for (int k = 0; k < 256; k++) {ctx->S[k] = k;}// 密钥调度算法(KSA)ctx->i = 0;ctx->j = 0;for (int k = 0, j = 0; k < 256; k++) {j = (j + ctx->S[k] + key[k % key_len]) % 256;// 交换S[k]和S[j]unsigned char temp = ctx->S[k];ctx->S[k] = ctx->S[j];ctx->S[j] = temp;}
}// RC4加密/解密(原地操作)
void rc4_crypt(RC4_CTX *ctx, unsigned char *data, size_t data_len) {for (size_t k = 0; k < data_len; k++) {ctx->i = (ctx->i + 1) % 256;ctx->j = (ctx->j + ctx->S[ctx->i]) % 256;// 交换S[i]和S[j]unsigned char temp = ctx->S[ctx->i];ctx->S[ctx->i] = ctx->S[ctx->j];ctx->S[ctx->j] = temp;// 生成密钥流字节并异或unsigned char keystream = ctx->S[(ctx->S[ctx->i] + ctx->S[ctx->j]) % 256];data[k] ^= keystream;}
}