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 }