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):app
- 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];
- };
- #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];
- }
- }
- #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;
- }