【加解密与C】对称加密(四) RC4

发布于:2025-07-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

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;
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到