作者:俠客行 | 注:教學演示代碼,非生產級加密實現
RC4 是 Ron Rivest 1987 設計的流加密算法,核心兩階段:
本文實現 N=3 變體:S 盒大小 8 (2³),密鑰流每次產生 3 位,適合教學演示。
int m1[200]; // 明文二進制
int s[8] = {0,1,2,3,4,5,6,7}; // S盒初始排列
int k3[200]; // 密鑰流二進制
char c[200]; // 密文
int count; // 明文位數
void processPlaintext(char m0[100]) {
int m[200], y[200];
int z = strlen(m0);
count = 0;
for (int i = 0; i < z; i++) {
int r = 0;
y[i] = (int)m0[i];
do {
m[r] = y[i] % 2; // 轉二進制 (低位在前)
m1[count] = m[r];
y[i] /= 2;
r++; count++;
} while (r != 7); // 每字符固定 7 位
// 位反轉:交換對稱位
for (int j = count-1, k = 0; j >= count-3; j--, k+=2) {
int temp = m1[j];
m1[j] = m1[j-6+k];
m1[j-6+k] = temp;
}
}
m1[count] = '\0';
}
void generateKeystream(int T[8]) {
// KSA: 密鑰調度
for (int i = 0, j = 0; i < 8; i++) {
j = (j + s[i] + T[i]) % 8;
swap(s[i], s[j]);
}
// PRGA: 偽隨機生成 (每輪產生 3 位)
int k[100];
for (int t = 0, i = 0, j = 0; t < count/3 + 1; t++) {
i = (i + 1) % 8;
j = (j + s[i]) % 8;
swap(s[i], s[j]);
int l = (s[i] + s[j]) % 8;
k[t] = s[l]; // 產生 1 字節 (0-7)
}
// 字節 → 3位二進制 + 位反轉
for (int i = 0, p = 0; i < count/3 + 1; i++) {
for (int j = 0; j < 3; j++, p++) {
k3[p] = k[i] % 2;
k[i] /= 2;
}
// 反轉 3 位
int temp = k3[p-1];
k3[p-1] = k3[p-3];
k3[p-3] = temp;
}
k3[p] = '\0';
}
void encrypt() {
for (int i = 0; i < count; i++)
c[i] = m1[i] ^ k3[i]; // 異或加密
c[count] = '\0';
}
int main() {
int n, T[8];
printf("輸入密鑰長度 (1-7): "); scanf("%d", &n);
printf("輸入初始密鑰 (%d 個數字): ", n);
for (int i = 0; i < n; i++) scanf("%d", &T[i]);
// 密鑰擴展到 8 位
if (n < 8) for (int i = 0; i < 8; i++) T[i] = T[i % n];
processPlaintext(inputPlaintext());
generateKeystream(T);
encrypt();
outputCiphertext();
return 0;
}

通過縮小 S 盒至 8 元素,本實現清晰展示 RC4 核心機制:置換網絡 + 模加法索引 + 異或融合,是理解流加密原理的優秀教學樣本。