using System; using System.Security.Cryptography; using System.Text; using System.IO; using System.Windows.Forms; namespace Curllion { public class Crypt { /// /// 新建一个大小为10261B的文件,以便将加密数据写入固定大小的文件。 /// /// 文件保存的地址,包含文件名 public static void InitBinFile(string filePath) { byte[] tmp = new byte[10261]; try //创建文件流,将其内容全部写入0 { System.IO.FileStream writeFileStream = new FileStream(filePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None,512,false); for(int i = 0 ;i< 10261;i++) tmp[i] = 0; writeFileStream.Write(tmp,0,10261); writeFileStream.Flush(); writeFileStream.Close(); } catch(System.IO.IOException) { MessageBox.Show("文件操作错误!","错误!",MessageBoxButtons.OK,MessageBoxIcon.Error); } } /// /// 将文本数据加密后写入一个文件,其中,这个文件是用InitBinFile建立的,这个文件将被分成十块, /// 用来分别保存10组不同的数据,第一个byte位保留,第2位到第21位分别用来存放每块数据的长度,但 /// 一个byte的取值为0-127,所以,用两个byte来存放一个长度。 /// /// 要加密的文本 /// 要写入的文件 /// 写入第几块,取值为1--10 /// 是否操作成功 public static bool EncryptToFile(string toEncryptText,string filePath,int dataIndex) { bool r = false; if(dataIndex > 10 && dataIndex < 1) { MessageBox.Show("数据索引的取值范围在1至10之间!","错误!", MessageBoxButtons.OK,MessageBoxIcon.Error); return r; } byte[] encrypted; //初始化向量 byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204}; //密匙 byte[] IV = {135,186,133,136,184,149,153,144}; //创建UTF-16 编码,用来在byte[]和string之间转换 System.Text.UnicodeEncoding textConverter = new UnicodeEncoding(); //创建RC2服务 RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); //打开要写入的文件,主要是为了保持原文件的内容不丢失 System.IO.FileStream tmpFileStream= new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None,1024,true); byte[] index = new byte[10261]; //将读取的内容写到byte数组 tmpFileStream.Read(index,0,10261); tmpFileStream.Close(); //定义基本的加密转换运算 System.Security.Cryptography.ICryptoTransform Encryptor = rc2CSP.CreateEncryptor(key,IV); System.IO.MemoryStream msEncrypt = new MemoryStream(); //在此加密转换流中,加密将从csEncrypt,加密后,结果在msEncrypt流中。 System.Security.Cryptography.CryptoStream csEncrypt = new CryptoStream(msEncrypt, Encryptor,CryptoStreamMode.Write); //将要加密的文本转换成UTF-16 编码,保存在tmp数组。 byte[] tmp = textConverter.GetBytes(toEncryptText); //将tmp输入csEncrypt,将通过Encryptor来加密。 csEncrypt.Write(tmp,0,tmp.Length); //输出到msEnctypt csEncrypt.FlushFinalBlock(); //将流转成byte[] encrypted = msEncrypt.ToArray(); if(encrypted.Length>1024) { MessageBox.Show("加密后,数据长度大于1KB,无法保存"); return false; } //得到加密后数据的大小,将结果存在指定的位置。 index[dataIndex*2 - 1] = Convert.ToByte(Convert.ToString(encrypted.Length/128)); index[dataIndex*2] = Convert.ToByte(Convert.ToString(encrypted.Length%128)); //将加密后的结果写入index(覆盖) for(int i=0;i 10 && dataIndex < 1) { MessageBox.Show("数据索引的取值范围在1至10之间!","错误!", MessageBoxButtons.OK,MessageBoxIcon.Error); return r; } byte[] decrypted; byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204}; byte[] IV = {135,186,133,136,184,149,153,144}; System.Text.UnicodeEncoding textConverter = new UnicodeEncoding(); RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); System.IO.FileStream tmpFileStream = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None,1024,true); System.Security.Cryptography.ICryptoTransform Decryptor = rc2CSP.CreateDecryptor(key,IV); System.IO.MemoryStream msDecrypt = new MemoryStream(); System.Security.Cryptography.CryptoStream csDecrypt = new CryptoStream(msDecrypt, Decryptor,CryptoStreamMode.Write); byte[] index = new byte[10261]; tmpFileStream.Read(index,0,10261); int startIndex = 1024*(dataIndex-1)+21; int count = index[dataIndex*2 - 1]*128 + index[dataIndex*2]; byte[] tmp = new byte[count]; Array.Copy(index,1024*(dataIndex-1)+21,tmp,0,count); csDecrypt.Write(tmp,0,count); csDecrypt.FlushFinalBlock(); decrypted = msDecrypt.ToArray(); r = textConverter.GetString(decrypted,0,decrypted.Length); tmpFileStream.Close(); return r; } /// /// 将一段文本加密后保存到一个文件 /// /// 要加密的文本数据 /// 要保存的文件 /// 是否加密成功 public static bool EncryptToFile(string toEncryptText,string filePath) { bool r = false; byte[] encrypted; byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204}; byte[] IV = {135,186,133,136,184,149,153,144}; System.Text.UnicodeEncoding textConverter = new UnicodeEncoding(); RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); System.IO.FileStream tmpFileStream = new FileStream(filePath, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write, System.IO.FileShare.None,1024,true); System.Security.Cryptography.ICryptoTransform Encryptor = rc2CSP.CreateEncryptor(key,IV); System.IO.MemoryStream msEncrypt = new MemoryStream(); System.Security.Cryptography.CryptoStream csEncrypt = new CryptoStream(msEncrypt, Encryptor,CryptoStreamMode.Write); byte[] tmp = textConverter.GetBytes(toEncryptText); csEncrypt.Write(tmp,0,tmp.Length); csEncrypt.FlushFinalBlock(); encrypted = msEncrypt.ToArray(); tmpFileStream.Write(encrypted,0,encrypted.Length); tmpFileStream.Flush(); r = true; tmpFileStream.Close(); return r; } /// /// 将一个被加密的文件解密 /// /// 要解密的文件 /// 解密后的文本 public static string DecryptFromFile(string filePath) { string r = ""; byte[] decrypted; byte[] key = {106,51,25,141,157,142,23,111,234,159,187,154,215,34,37,204}; byte[] IV = {135,186,133,136,184,149,153,144}; System.Text.UnicodeEncoding textConverter = new UnicodeEncoding(); RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider(); System.IO.FileStream tmpFileStream = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None,1024,true); System.Security.Cryptography.ICryptoTransform Decryptor = rc2CSP.CreateDecryptor(key,IV); System.IO.MemoryStream msDecrypt = new MemoryStream(); System.Security.Cryptography.CryptoStream csDecrypt = new CryptoStream(msDecrypt, Decryptor,CryptoStreamMode.Write); byte[] tmp = new byte[tmpFileStream.Length]; tmpFileStream.Read(tmp,0,tmp.Length); csDecrypt.Write(tmp,0,tmp.Length); csDecrypt.FlushFinalBlock(); decrypted = msDecrypt.ToArray(); r = textConverter.GetString(decrypted,0,decrypted.Length); tmpFileStream.Close(); return r; } } }