和传统的编码不同,BASE64编码的设计致力于混淆那些8位字节的数据流(解决网络传输中的明码问题),在网络传输、邮件等系统中被广泛应用。需要明确的是:BASE64不属于加密机制,但它却是把明码变成了一种很难识别的形式。.
BASE64的算法如下:
BASE64把所有的位分开,并且重新组合成字节,新的字节只包含6位,最后在每个字节前添加两个0,组成了新的字节数组。例如:一个字节数组只包含三个字节(每个字节又有8位比特),对其进行BASE64编码时会将其分配到4个新的字节中(为什么是4个呢?计算3*8/6=4),其中每个字节只填充低6位,最后把高2位置为零。
下图清晰地展示了上面所讲到的BASE64的算法示例:
在.NET中,BASE64编码的应用也很多,例如在ASP.NET WebForm中,默认为我们生成了一个ViewState来保持状态,如下图所示:
这里的ViewState其实就是服务器在返回给浏览器前进行了一次BASE64编码,我们可以通过一些解码工具进行反BASE64编码查看其中的奥秘:
那么,问题来了?在.NET中开发中,怎样来进行BASE64的编码和解码呢,.NET基类库中提供了一个Convert类,其中有两个静态方法提供了BASE64的编码和解码,但要注意的是:Convert类型在转换失败时会直接抛出异常,我们需要在开发中注意对潜在异常的处理(比如使用is或as来进行高效的类型转换)。下面的代码展示了其用法:
public class Program
{
public static void Main(string[] args)
{
string test = "abcde ";
// 生成UTF8字节数组
byte[] bytes = Encoding.UTF8.GetBytes(test);
// 转换成Base64字符串
string base64 = BytesToBase64(bytes);
Console.WriteLine(base64);
// 转换回UTF8字节数组
bytes = Base64ToBytes(base64);
Console.WriteLine(Encoding.UTF8.GetString(bytes));
Console.ReadKey();
}
// Bytes to Base64
static string BytesToBase64(byte[] bytes)
{
try
{
return Convert.ToBase64String(bytes);
}
catch
{
return null;
}
}
// Base64 to Bytes
static Byte[] Base64ToBytes(string base64)
{
try
{
return Convert.FromBase64String(base64);
}
catch
{
return null;
}
}
}
上面代码的执行结果如下图所示: