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

 

[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. }  
相關文章
相關標籤/搜索