c#rc4算法,加密解密类

2/11/2016来源:C#应用人气:1937

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 }