你的位置:首页 > ASP.net教程

[ASP.net教程]c# rc4算法,加密解密类


rc4..

 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:释放非托管资源,设置对象为null112       S = null;113       T = null;114       K = null;115       k = null;116       _disposed = true;117     }118   }119 }