zoukankan      html  css  js  c++  java
  • c#可自定义码表的base64加密解密算法类

    000

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace Libraries
      8 {
      9     public class Base64Crypt
     10     {
     11         private string S;
     12         private string K;
     13         private List<char> T;
     14         public Base64Crypt()
     15         {
     16             T = new List<char>();
     17             K = "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやよらりるれろわをぐげござじずぞだぢづでばびぶべぱぴぷぺぽ";
     18             //K = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//标准码表
     19         }
     20         public string Token
     21         {
     22             get
     23             {
     24                 return S == null ? K : S;
     25             }
     26             set
     27             {
     28                 T.Clear();
     29                 S = value;
     30                 if (S == null)
     31                 {
     32                     foreach (var item in K)
     33                     {
     34                         T.Add(item);
     35                     }
     36                 }else if (S.Length < 64)
     37                 {
     38                     foreach (var item in S)
     39                     {
     40                         T.Add(item);
     41                     }
     42                     for (int i = 0; i < 64-S.Length; i++)
     43                     {
     44                         T.Add(K[i]);
     45                     }
     46                 }
     47                 else
     48                 {
     49                     for (int i = 0; i < 64; i++)
     50                     {
     51                         T.Add(S[i]);
     52                     }
     53                 }
     54             }
     55         }
     56 
     57         public string Encode(string x)
     58         {
     59             return string.IsNullOrEmpty(x) ? x : InternalEncode(Encoding.UTF8.GetBytes(x));
     60         }
     61         public string Decode(string x)
     62         {
     63             return string.IsNullOrEmpty(x) ? x : Encoding.UTF8.GetString(InternalDecode(x));
     64         }
     65 
     66         public byte[] Encode(byte[] x)
     67         {
     68             return x == null ? null : Encoding.UTF8.GetBytes(InternalEncode(x));
     69         }
     70         public byte[] Decode(byte[] x)
     71         {
     72             return x == null ? null : InternalDecode(Encoding.UTF8.GetString(x));
     73         }
     74         private void CheckToken()
     75         {
     76             if (T.Count != 64)
     77             {
     78                 Token = K;
     79             }
     80         }
     81         private byte[] InternalDecode(string x)
     82         {
     83             CheckToken();
     84             byte[] r;
     85             string t;
     86             int p = 0;
     87             int m = x.Length / 4;
     88             int n = x.Length % 4;
     89             if (n == 0)
     90             {
     91                 r = new byte[3 * m];
     92             }
     93             else
     94             {
     95                 r = new byte[3 * m + n-1];
     96                 t = string.Empty;
     97 
     98                 for (int i = n; i > 0; i--)
     99                 {
    100                     t += ByteToBin((byte)T.IndexOf(x[x.Length - i])).Substring(2);
    101                 }
    102 
    103                 for (int i = 0; i < n-1 ; i++)
    104                 {
    105                     r[3 * m + i] = BinToByte(t.Substring(8 * i, 8));
    106                 }
    107             }
    108             for (int i = 0; i < m; i++)
    109             {
    110                 t = string.Empty;
    111                 for (int j = 0; j < 4; j++)
    112                 {
    113                     t += ByteToBin((byte)T.IndexOf(x[4*i+j])).Substring(2);
    114                 }
    115                 for (int j = 0; j < t.Length/8; j++)
    116                 {
    117                     r[p++] = BinToByte(t.Substring(8*j,8));
    118                 }
    119             }
    120             return r;
    121         }
    122         private string InternalEncode(byte[] x)
    123         {
    124             CheckToken();
    125             string r = string.Empty;
    126             string t;
    127             int m = x.Length / 3;
    128             int n = x.Length % 3;
    129             for (int i = 0; i < m; i++)
    130             {
    131                 t = string.Empty;
    132                 for (int j = 0; j < 3; j++)
    133                 {
    134                     t += ByteToBin(x[3 * i + j]);
    135                 }
    136                 r += base64Encode(t);
    137             }
    138 
    139             if (n == 1)
    140             {
    141                 t = ByteToBin(x[x.Length-1]).PadRight(12,'0');
    142                 r += base64Encode(t);
    143             }
    144             else if (n == 2)
    145             {
    146                 t = string.Empty;
    147                 for (int i = n; i > 0; i--)
    148                 {
    149                     t += ByteToBin(x[x.Length - i]);
    150                 }
    151                 t = t.PadRight(18,'0');
    152                 r += base64Encode(t);
    153             }
    154             return r;
    155         }
    156         private string base64Encode(string x)
    157         {
    158             string r = string.Empty;
    159             for (int i = 0; i < x.Length / 6; i++)
    160             {
    161                 r += T[BinToByte(x.Substring(6 * i, 6))];
    162             }
    163             return r;
    164         }
    165         
    166         private string ByteToBin(byte x)
    167         {
    168             return Convert.ToString(x,2).PadLeft(8,'0');
    169         }
    170         private byte BinToByte(string x)
    171         {
    172             return Convert.ToByte(x,2);
    173         }
    174 
    175     }
    176 }
    177  
  • 相关阅读:
    Windows网络编程:多线程技术
    Windows网络编程:OSI七层模型
    Windows网络编程:WinSock模型
    Windows网络编程:基于Scoket最简单的CS
    Windows网络编程:同步/异步 阻塞/非阻塞
    1.WebGL:简介
    无聊的面试啊:2020
    第一次面试
    实习第三周
    Eclipse新建web项目
  • 原文地址:https://www.cnblogs.com/mokeyish/p/5041909.html
Copyright © 2011-2022 走看看