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