using System; using System.Collections.Generic; using System.Text; public class Base64 { #region 系统变量 /// <summary> /// Base64密码表 /// </summary> private const string CodeTable = "ABEFGHefgI6JL5MNX3K4YZabcdhiQRS89+TUVjklmnvwxyopqCDrstuz01OPW27^"; /// <summary> /// 补位符号 /// </summary> private const char CodeChar = '$'; #endregion 系统变量 /// <summary> /// Base64加密函数 /// </summary> /// <param name="code"></param> /// <returns></returns> public static string Base64EnCdoe( string code ) { List<byte> bytes = new List<byte>( Encoding.Default.GetBytes( code ) ); int bytes_len = bytes.Count; int Int_Length = bytes_len / 3 + ( bytes_len % 3 != 0 ? 1 : 0 ); bytes.Add( 0 ); bytes.Add( 0 ); StringBuilder values = new StringBuilder(); for ( int i = 0; i < Int_Length; i++ ) { values.Append( CodeTable[( byte )( bytes[i * 3] & 0x3F )] ); values.Append( CodeTable[( byte )( ( bytes[i * 3 + 1] & 0x0F ) << 2 | ( bytes[i * 3] >> 6 & 0x03 ) )] ); values.Append( CodeTable[( byte )( bytes[i * 3 + 2] << 4 & 0x30 | bytes[i * 3 + 1] >> 4 & 0x0F )] ); values.Append( CodeTable[( byte )( bytes[i * 3 + 2] >> 2 & 0x3F )] ); } return bytes_len % 3 == 1 ? values.ToString().Substring( 0, values.Length - 2 ) + CodeChar + CodeChar : bytes_len % 3 == 2 ? values.ToString().Substring( 0, values.Length - 1 ) + CodeChar : values.ToString(); } /// <summary> /// Base64解密函数 /// </summary> /// <param name="Code"></param> /// <returns></returns> public static string Base64DnCdoe( string Code ) { List<byte> bytes = new List<byte>(); // 待解码的数组 int Temp = 0, j = 0; for ( int i = 0; i < Code.Length; i++ ) {// 把密码根据密码表翻译回6位有效位的Byte数组 Temp = CodeTable.IndexOf( Code[i] ); if ( Temp >= 0 ) bytes.Add( ( byte )Temp ); else bytes.Add( 0 ); } byte[] tmps = new byte[( bytes.Count / 4 ) * 3]; // 创建明文 Byte 数组 if ( bytes.Count % 4 == 0 ) { for ( int i = 0; i < bytes.Count; ) {// 把四个Byte元素的值,去除高二位,然后存入临时 Int 变量以便于每次8位的取出 Temp = bytes[i++] | bytes[i++] << 6 | bytes[i++] << 12 | bytes[i++] << 18; tmps[j++] = ( byte )Temp; // 取低八位 tmps[j++] = ( byte )( Temp >> 8 ); // 取中八位 tmps[j++] = ( byte )( Temp >> 16 ); // 取高八位 } // 如果找到CodeChar字符(也就是补位符号,一般是‘=’)是在倒数第二,则,丢弃最后两字符, // 如果是在倒数第一,则丢弃最后一个字符,如果没有找到,则完整返回 return Encoding.Default.GetString ( tmps, 0, ( Code.IndexOf( CodeChar ) == Code.Length - 2 ? tmps.Length - 2 : Code.IndexOf( CodeChar ) == Code.Length - 1 ? tmps.Length - 1 : tmps.Length ) ); } else // 不是4的倍数,该加密字符串有不合法 return ""; } }