zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Redis源码分析(十二)--- redis-check-dump本地数据库检测
    Redis源码分析(十二)--- redis-check-dump本地数据库检测
    Redis源码分析(十二)--- redis-check-dump本地数据库检测
    Redis源码分析(十三)--- redis-benchmark性能测试
    Redis源码分析(十四)--- rdb.c本地数据库操作
    Redis源码分析(十三)--- redis-benchmark性能测试
    Redis源码分析(十四)--- rdb.c本地数据库操作
    Redis源码分析(十四)--- rdb.c本地数据库操作
    去除移动端点击事件出现的背景框 tap-highlight-color
    php源码分析之PHPAPI宏的作用
  • 原文地址:https://www.cnblogs.com/mokeyish/p/5041949.html
Copyright © 2011-2022 走看看