您的位置:首页 > 编程语言 > C#

c# 常用编码工具类,支持base64,md5,des,crc32

2012-05-17 17:40 393 查看
using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Runtime.InteropServices;
using System.Text;
namespace YNEC.Services.Encrypt
{
/**/
/// <summary>
/// CRC 效验
/// 快速检测算法
/// </summary>
public class CRC32
{
protected ulong[] crc32Table;
/**/
/// <summary>
/// 构造:初始化效验表
/// </summary>
public CRC32()
{
const ulong ulPolynomial = 0xEDB88320;
ulong dwCrc;
crc32Table = new ulong[256];
int i, j;
for (i = 0; i < 256; i++)
{
dwCrc = (ulong)i;
for (j = 8; j > 0; j--)
{
if ((dwCrc & 1) == 1)
dwCrc = (dwCrc >> 1) ^ ulPolynomial;
else
dwCrc >>= 1;
}
crc32Table[i] = dwCrc;
}
}
/**/
/// <summary>
/// 字节数组效验
/// </summary>
/// <param name="buffer">ref 字节数组</param>
/// <returns></returns>
public ulong ByteCRC(ref byte[] buffer)
{
ulong ulCRC = 0xffffffff;
ulong len;
len = (ulong)buffer.Length;
for (ulong buffptr = 0; buffptr < len; buffptr++)
{
ulong tabPtr = ulCRC & 0xFF;
tabPtr = tabPtr ^ buffer[buffptr];
ulCRC = ulCRC >> 8;
ulCRC = ulCRC ^ crc32Table[tabPtr];
}
return ulCRC ^ 0xffffffff;
}
/**/
/// <summary>
/// 字符串效验
/// </summary>
/// <param name="sInputString">字符串</param>
/// <returns></returns>
public ulong StringCRC(string sInputString)
{
byte[] buffer = Encoding.Default.GetBytes(sInputString);
return ByteCRC(ref buffer);
}
/**/
/// <summary>
/// 文件效验
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <returns></returns>
public ulong FileCRC(string sInputFilename)
{
FileStream inFile = new System.IO.FileStream(sInputFilename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bInput = new byte[inFile.Length];
inFile.Read(bInput, 0, bInput.Length);
inFile.Close();
return ByteCRC(ref bInput);
}
}
/**/
/// <summary>
/// MD5 无逆向编码
/// 获取唯一特征串,可用于密码加密
/// (无法还原)
/// </summary>
public class MD5
{
public MD5()
{
}
/**/
/// <summary>
/// 获取字符串的特征串
/// </summary>
/// <param name="sInputString">输入文本</param>
/// <returns></returns>
public string HashString(string sInputString)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
string encoded = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(sInputString))).Replace("-", "");
return encoded;
}
/**/
/// <summary>
/// 获取文件的特征串
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <returns></returns>
public string HashFile(string sInputFilename)
{
System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
FileStream inFile = new System.IO.FileStream(sInputFilename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bInput = new byte[inFile.Length];
inFile.Read(bInput, 0, bInput.Length);
inFile.Close();
string encoded = BitConverter.ToString(md5.ComputeHash(bInput)).Replace("-", "");
return encoded;
}
}
/**/
/// <summary>
/// Base64 UUEncoded 编码
/// 将二进制编码为ASCII文本,用于网络传输
/// (可还原)
/// </summary>
public class BASE64
{
public BASE64()
{
}
/**/
/// <summary>
/// 解码字符串
/// </summary>
/// <param name="sInputString">输入文本</param>
/// <returns></returns>
public string DecryptString(string sInputString)
{
char[] sInput = sInputString.ToCharArray();
try
{
byte[] bOutput = System.Convert.FromBase64String(sInputString);
return Encoding.Default.GetString(bOutput);
}
catch (System.ArgumentNullException)
{
//base 64 字符数组为null
return "";
}
catch (System.FormatException)
{
//长度错误,无法整除4
return "";
}
}
/**/
/// <summary>
/// 编码字符串
/// </summary>
/// <param name="sInputString">输入文本</param>
/// <returns></returns>
public string EncryptString(string sInputString)
{
byte[] bInput = Encoding.Default.GetBytes(sInputString);
try
{
return System.Convert.ToBase64String(bInput, 0, bInput.Length);
}
catch (System.ArgumentNullException)
{
//二进制数组为NULL.
return "";
}
catch (System.ArgumentOutOfRangeException)
{
//长度不够
return "";
}
}
/**/
/// <summary>
/// 解码文件
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <param name="sOutputFilename">输出文件</param>
public void DecryptFile(string sInputFilename, string sOutputFilename)
{
System.IO.StreamReader inFile;
char[] base64CharArray;
try
{
inFile = new System.IO.StreamReader(sInputFilename,
System.Text.Encoding.ASCII);
base64CharArray = new char[inFile.BaseStream.Length];
inFile.Read(base64CharArray, 0, (int)inFile.BaseStream.Length);
inFile.Close();
}
catch
{//(System.Exception exp) {
return;
}
// 转换Base64 UUEncoded为二进制输出
byte[] binaryData;
try
{
binaryData =
System.Convert.FromBase64CharArray(base64CharArray,
0,
base64CharArray.Length);
}
catch (System.ArgumentNullException)
{
//base 64 字符数组为null
return;
}
catch (System.FormatException)
{
//长度错误,无法整除4
return;
}
// 写输出数据
System.IO.FileStream outFile;
try
{
outFile = new System.IO.FileStream(sOutputFilename,
System.IO.FileMode.Create,
System.IO.FileAccess.Write);
outFile.Write(binaryData, 0, binaryData.Length);
outFile.Close();
}
catch
{
// (System.Exception exp) {
//流错误
}
}
/**/
/// <summary>
/// 编码文件
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <param name="sOutputFilename">输出文件</param>
public void EncryptFile(string sInputFilename, string sOutputFilename)
{
System.IO.FileStream inFile;
byte[] binaryData;
try
{
inFile = new System.IO.FileStream(sInputFilename,
System.IO.FileMode.Open,
System.IO.FileAccess.Read);
binaryData = new Byte[inFile.Length];
long bytesRead = inFile.Read(binaryData, 0,
(int)inFile.Length);
inFile.Close();
}
catch
{ //(System.Exception exp) {
return;
}
// 转换二进制输入为Base64 UUEncoded输出
// 每3个字节在源数据里作为4个字节
long arrayLength = (long)((4.0d / 3.0d) * binaryData.Length);
// 如果无法整除4
if (arrayLength % 4 != 0)
{
arrayLength += 4 - arrayLength % 4;
}
char[] base64CharArray = new char[arrayLength];
try
{
System.Convert.ToBase64CharArray(binaryData,
0,
binaryData.Length,
base64CharArray,
0);
}
catch (System.ArgumentNullException)
{
//二进制数组为NULL.
return;
}
catch (System.ArgumentOutOfRangeException)
{
//长度不够
return;
}
// 写UUEncoded数据到文件内
System.IO.StreamWriter outFile;
try
{
outFile = new System.IO.StreamWriter(sOutputFilename,
false,
System.Text.Encoding.ASCII);
outFile.Write(base64CharArray);
outFile.Close();
}
catch
{// (System.Exception exp) {
//文件流出错
}
}
}
/**/
/// <summary>
/// DES 加密
/// 支持Key(钥匙)加密变化
/// 支持还原
///
/// 演示操作:
///  // 64位,8个字节
///  string sSecretKey;
///
///  // 获取Key
///  sSecretKey = GenerateKey();
///
///  // 托管
///  GCHandle gch = GCHandle.Alloc( sSecretKey,GCHandleType.Pinned );
///
///  // 加密文件
///  EncryptFile(@"C:\MyData.txt",
///  @"C:\Encrypted.txt",
///  sSecretKey);
///
///  // 解密文件
///  DecryptFile(@"C:\Encrypted.txt",
///  @"C:\Decrypted.txt",
///  sSecretKey);
///
///  // 释放托管内容
///  ZeroMemory(gch.AddrOfPinnedObject(), sSecretKey.Length * 2);
///  gch.Free();
/// </summary>
public class DES
{
[DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
public static extern bool ZeroMemory(IntPtr Destination, int Length);
public DES()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
/**/
/// <summary>
/// 创建Key
/// </summary>
/// <returns></returns>
public string GenerateKey()
{
// 创建一个DES 算法的实例。自动产生Key
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
// 返回自动创建的Key 用于加密
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
/**/
/// <summary>
/// 加密字符串
/// </summary>
/// <param name="sInputString">输入字符</param>
/// <param name="sKey">Key</param>
/// <returns>加密结果</returns>
public string EncryptString(string sInputString, string sKey)
{
byte[] data = Encoding.Default.GetBytes(sInputString);
byte[] result;
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
result = desencrypt.TransformFinalBlock(data, 0, data.Length);
string desString = "";
for (int i = 0; i < result.Length; i++)
{
desString += result[i].ToString() + "-";
}
//return desString.TrimEnd("-");
return BitConverter.ToString(result);
}
/**/
/// <summary>
/// 解密字符串
/// </summary>
/// <param name="sInputString">输入字符</param>
/// <param name="sKey">Key</param>
/// <returns>解密结果</returns>
public string DecryptString(string sInputString, string sKey)
{
string[] sInput = sInputString.Split("-".ToCharArray());
byte[] data = new byte[sInput.Length];
byte[] result;
for (int i = 0; i < sInput.Length; i++)
data[i] = byte.Parse(sInput[i], System.Globalization.NumberStyles.HexNumber);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateDecryptor();
result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return Encoding.Default.GetString(result);
}
/**/
/// <summary>
/// 加密文件
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <param name="sOutputFilename">输出文件</param>
/// <param name="sKey">Key</param>
public void EncryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
FileStream fsInput = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
FileStream fsEncrypted = new FileStream(sOutputFilename,
FileMode.Create,
FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted,
desencrypt,
CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsInput.Close();
fsEncrypted.Close();
}
/**/
/// <summary>
/// 解密文件
/// </summary>
/// <param name="sInputFilename">输入文件</param>
/// <param name="sOutputFilename">输出文件</param>
/// <param name="sKey">Key</param>
public void DecryptFile(string sInputFilename,
string sOutputFilename,
string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
FileStream fsread = new FileStream(sInputFilename,
FileMode.Open,
FileAccess.Read);
ICryptoTransform desdecrypt = DES.CreateDecryptor();
CryptoStream cryptostreamDecr = new CryptoStream(fsread,
desdecrypt,
CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: