rc4算法,原理,以密匙生成256位的密匙流,然後以車輪式滾過源數據異或加密。
1 /*
2 * 由SharpDevelop創建。
3 * 用戶: YISH
4 * 日期: 04/04/2015
5 * 時間: 03:01
6 *
7 * 要改變這種模板請點擊 工具|選項|代碼編寫|編輯標准頭文件
8 */
9 using System;
10
11 namespace Libraries
12 {
13 /// <summary>
14 /// Description of CryptoGraphy.
15 /// </summary>
16 public class RC4Crypt:IDisposable{
17 byte[] S;
18 byte[] T;
19 byte[] K;
20 byte[] k;
21 public RC4Crypt() { }
22 public RC4Crypt(byte[] key){
23 this.K=key;
24 }
25 public byte[] Key
26 {
27 get
28 {
29 return K;
30 }
31 set
32 {
33 K = value;
34 }
35 }
36 //初始化狀態向量S和臨時向量T,供keyStream方法調用
37 void initial(){
38 if (S == null || T == null)
39 {
40 S = new byte[256];
41 T = new byte[256];
42 }
43 for (int i = 0; i < 256; ++i) {
44 S[i]=(byte)i;
45 T[i] = K[i % K.Length];
46 }
47 }
48 //初始排列狀態向量S,供keyStream方法調用
49 void ranges(){
50 int j=0;
51 for (int i = 0; i < 256; ++i) {
52 j=(j+S[i]+T[i])&0xff;
53 S[i]=(byte)((S[i]+S[j])&0xff);
54 S[j]=(byte)((S[i]-S[j])&0xff);
55 S[i]=(byte)((S[i]-S[j])&0xff);
56 }
57 }
58 //生成密鑰流
59 //len:明文為len個字節
60 void keyStream(int len){
61 initial();
62 ranges();
63 int i=0,j=0,t=0;
64 k=new byte[len];
65 for (int r = 0; r < len; r++) {
66 i=(i+1)&0xff;
67 j=(j+S[i])&0xff;
68
69 S[i]=(byte)((S[i]+S[j])&0xff);
70 S[j]=(byte)((S[i]-S[j])&0xff);
71 S[i]=(byte)((S[i]-S[j])&0xff);
72
73 t=(S[i]+S[j])&0xff;
74 k[r]=S[t];
75 }
76 }
77
78 public byte[] EncryptByte(byte[] data){
79 //生產密匙流
80 keyStream(data.Length);
81 for (int i = 0; i < data.Length; i++) {
82 k[i]=(byte)(data[i]^k[i]);
83 }
84 return k;
85 }
86
87 public byte[] DecryptByte(byte[] data){
88 return EncryptByte(data);
89 }
90
91 //是否回收完畢
92 bool _disposed;
93 public void Dispose()
94 {
95 Dispose(true);
96 GC.SuppressFinalize(this);
97 }
98 ~RC4Crypt()
99 {
100 Dispose(false);
101 }
102 //這裡的參數表示示是否需要釋放那些實現IDisposable接口的托管對象
103 protected virtual void Dispose(bool disposing)
104 {
105 if (_disposed) return;//如果已經被回收,就中斷執行
106 if (disposing)
107 {
108 //TODO:釋放那些實現IDisposable接口的托管對象
109
110 }
111 //TODO:釋放非托管資源,設置對象為null
112 S = null;
113 T = null;
114 K = null;
115 k = null;
116 _disposed = true;
117 }
118 }
119 }