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