您的位置:首页 > 其它

闲来没事,自己写了一个基于Base64加密解密算法

2008-12-10 20:06 477 查看
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 "";
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: