rc4算法,原理,以密匙生成256位的密匙流,然后以车轮式滚过源数据异或加密。
1/* 2 * 由SharpDevelop创建。 3 * 用户: YISH 4 * 日期: 04/04/2015 5 * 时间: 03:01 6 * 7 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件 8*/ 9using System; 10 11namespace Libraries 12{ 13///14/// Description of CryptoGraphy. 15/// 16publicclass RC4Crypt:IDisposable{ 17byte[] S; 18byte[] T; 19byte[] K; 20byte[] k; 21public RC4Crypt() { } 22public RC4Crypt(byte[] key){ 23this.K=key; 24 } 25publicbyte[] Key 26 { 27get 28 { 29return K; 30 } 31set 32 { 33 K = value; 34 } 35 } 36//初始化状态向量S和临时向量T,供keyStream方法调用 37void initial(){ 38if (S == null || T == null) 39 { 40 S = newbyte[256]; 41 T = newbyte[256]; 42 } 43for (int i = 0; i < 256; ++i) { 44 S[i]=(byte)i; 45 T[i] = K[i % K.Length]; 46 } 47 } 48//初始排列状态向量S,供keyStream方法调用 49void ranges(){ 50int j=0; 51for (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个字节 60void keyStream(int len){ 61 initial(); 62 ranges(); 63int i=0,j=0,t=0; 64 k=newbyte[len]; 65for (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 78publicbyte[] EncryptByte(byte[] data){ 79//生产密匙流 80 keyStream(data.Length); 81for (int i = 0; i < data.Length; i++) { 82 k[i]=(byte)(data[i]^k[i]); 83 } 84return k; 85 } 86 87publicbyte[] DecryptByte(byte[] data){ 88return EncryptByte(data); 89 } 90 91//是否回收完毕 92bool _disposed; 93publicvoid Dispose() 94 { 95 Dispose(true); 96 GC.SuppressFinalize(this); 97 } 98 ~RC4Crypt() 99 { 100 Dispose(false); 101 } 102//这里的参数表示示是否需要释放那些实现IDisposable接口的托管对象103protectedvirtualvoid Dispose(bool disposing) 104 { 105if (_disposed) return;//如果已经被回收,就中断执行106if (disposing) 107 { 108//TODO:释放那些实现IDisposable接口的托管对象109110 } 111//TODO:释放非托管资源,设置对象为null112 S = null; 113 T = null; 114 K = null; 115 k = null; 116 _disposed = true; 117 } 118 } 119 }