首页 > 代码库 > RC4加密算法及其实现

RC4加密算法及其实现

 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):

 

[cpp] view plaincopy
  1. //rc4.h  
  2. template<class T> inline void  
  3. swap(T& i, T& j)  
  4. {  
  5.     T tmp = i;  
  6.     i = j;  
  7.     j = tmp;  
  8. }  
  9. class RC4  
  10. {  
  11. public:  
  12.     void SetKey(const char* key, int keylen);  
  13.     void Transform(char* output, const char* input, int len);  
  14. private:  
  15.     unsigned char key_[256];  
  16. };  
  17. /////////////////////////////////////////////  
  18. //rc4.cc  
  19. #include "rc4.h"  
  20. void RC4::SetKey(const char* key, int keylen)  
  21. {  
  22.     for (int i = 0; i < 256; i++)  
  23.     {  
  24.         key_[i] = i;  
  25.     }  
  26.     int j = 0;  
  27.     for (int i = 0; i < 256; i++)  
  28.     {  
  29.         j = (j + key_[i] + key[i%keylen]) % 256;  
  30.         swap(key_[i], key_[j]);  
  31.     }  
  32. }  
  33. void RC4::Transform(char* output, const char* input, int len)  
  34. {  
  35.     int i = 0, j = 0;  
  36.     for (int k = 0; k < len; k++)  
  37.     {  
  38.         i = (i + 1) % 256;  
  39.         j = (j + key_[i]) % 256;  
  40.         swap(key_[i], key_[j]);  
  41.         unsigned char subkey = key_[(key_[i] + key_[j]) % 256];  
  42.         output[k] = subkey ^ input[k];  
  43.     }  
  44. }  
  45. /////////////////////////////////////////  
  46. //main.cc  
  47. #include <stdio.h>  
  48. #include <string.h>  
  49. #include <stdlib.h>  
  50. #include "rc4.h"  
  51. int main()  
  52. {  
  53.     char input[256] = "Times teaches all things to him who lives forever but I have not the luxury of eternity.";  
  54.     char output[256] = "";  
  55.     printf("before encrypt:%s/n", input);  
  56.     const int keylen = 16;  
  57.     char key[keylen] = "";  
  58.     for (int i = 0; i < keylen; i++)  
  59.     {  
  60.         key[i] = rand() % 256;  
  61.     }  
  62.     RC4 rc4encrypt, rc4decrypt;  
  63.     rc4encrypt.SetKey(key, keylen);  
  64.     rc4decrypt.SetKey(key, keylen);  
  65.     rc4encrypt.Transform(output, input, strlen(input));  
  66.     printf("after encrypt: %s/n", output);  
  67.     rc4decrypt.Transform(output, output, strlen(input));  
  68.     printf("after decrypt: %s/n", output);  
  69.     return 0;  
  70. }  

 

RC4加密算法及其实现