RC4 算法是一个简单的实现,不过,对于算法数学是弱鸡的我,依然还不懂。
算法原理
- 一个 256 字节的状态向量 S,数据初始化为从0 —— 255。
- KSA(Key Scheduling Algorithm) 密钥调度算法。使用一个 1——256字节(8bit ——2048bits,典型的是 5 到 16 字节)的 K 来打乱 S。 若 K 不够 256 字节,那么循环的形式进行。
- PRGA(Pseudo Random Generation Algorithm),使用打乱后的 S 来产生伪随机序列,这才是真正的密钥流。
- 逐字节将需要加密的数据与密钥流进行 XOR 操作,得出加密流。
- 加密流与密钥流再取异或操作,即得到数据。
S
unsigned char S[256]; for (int i=0; i < 256; i++) S[i] = i;
|
K
char K[] ='iamgod';; int len = 6;
|
KSA
for (i = 0; i < 256; i++) { j = (j + S[i] + K[i % len]) % 256; int tmp = S[i]; S[i] = S[j]; S[j] = tmp; }
|
PRGA
int i; unsigned long t1, t2; unsigned var, out; t1 = t2 =0; for (i = 0; i < len; i++) { t1 = (t1 + 1) % 256; t2 = (t2 + S[t1]) % 256; int tmp = S[t1]; S[t1] = S[t1]; S[t2] = tmp; val = (S[t1] + S[t2]) % 256; out = *buff ^ val; *buff = out; buff++; }
|