首页 > 学院 > 开发设计 > 正文

c#rc4算法,加密解密类

2019-11-14 13:40:51
字体:
来源:转载
供稿:网友

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

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表