RC4加密算法(http://en.wikipedia.org/wiki/RC4)是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
RC4的原理很简单,包括初始化算法(KSA/SetKey)和伪随机子密码生成算法(PRGA/Transform)两大部分。实现代码如下(VS2008):
//rc4.h template<class T> inline void swap(T& i, T& j) { T tmp = i; i = j; j = tmp; } class RC4 { public: void SetKey(const char* key, int keylen); void Transform(char* output, const char* input, int len); private: unsigned char key_[256]; }; / //rc4.cc #include "rc4.h" void RC4::SetKey(const char* key, int keylen) { for (int i = 0; i < 256; i++) { key_[i] = i; } int j = 0; for (int i = 0; i < 256; i++) { j = (j + key_[i] + key[i%keylen]) % 256; swap(key_[i], key_[j]); } } void RC4::Transform(char* output, const char* input, int len) { int i = 0, j = 0; for (int k = 0; k < len; k++) { i = (i + 1) % 256; j = (j + key_[i]) % 256; swap(key_[i], key_[j]); unsigned char subkey = key_[(key_[i] + key_[j]) % 256]; output[k] = subkey ^ input[k]; } } / //main.cc #include <stdio.h> #include <string.h> #include <stdlib.h> #include "rc4.h" int main() { char input[256] = "Times teaches all things to him who lives forever but I have not the luxury of eternity."; char output[256] = ""; printf("before encrypt:%s/n", input); const int keylen = 16; char key[keylen] = ""; for (int i = 0; i < keylen; i++) { key[i] = rand() % 256; } RC4 rc4encrypt, rc4decrypt; rc4encrypt.SetKey(key, keylen); rc4decrypt.SetKey(key, keylen); rc4encrypt.Transform(output, input, strlen(input)); printf("after encrypt: %s/n", output); rc4decrypt.Transform(output, output, strlen(input)); printf("after decrypt: %s/n", output); return 0; }