程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c# rc4算法,加密解密類,

c# rc4算法,加密解密類,

編輯:C#入門知識

c# rc4算法,加密解密類,


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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved