分享
 
 
 

深入浅析RC2加密算法在C#的应用

王朝c#·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

using System;

using System.Security.Cryptography;

using System.Text;

using System.IO;

using System.Windows.Forms;

namespace Curllion

{

public class Crypt

{

/// <summary

/// 新建一个大小为10261B的文件,以便将加密数据写入固定大小的文件。

/// </summary

/// <param name="filePath"文件保存的地址,包含文件名</param

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);

}

}

/// <summary

/// 将文本数据加密后写入一个文件,其中,这个文件是用InitBinFile建立的,这个文件将被分成十块,

/// 用来分别保存10组不同的数据,第一个byte位保留,第2位到第21位分别用来存放每块数据的长度,但

/// 一个byte的取值为0-127,所以,用两个byte来存放一个长度。

/// </summary

/// <param name="toEncryptText"要加密的文本</param

/// <param name="filePath"要写入的文件</param

/// <param name="dataIndex"写入第几块,取值为1--10</param

/// <returns是否操作成功</returns

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.Length1024)

{

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<encrypted.Length;i++)

index[1024*(dataIndex-1)+21+i]=encrypted[i];

//建立文件流

tmpFileStream = new FileStream(filePath,

System.IO.FileMode.Truncate,

System.IO.FileAccess.Write,

System.IO.FileShare.None,1024,true);

//写文件

tmpFileStream.Write(index,0,10261);

tmpFileStream.Flush();

r = true;

tmpFileStream.Close();

return r;

}

/// <summary

/// 从一个文件中解密出一段文本,其中,这个文件是由InitBinFile建立的,并且由 EncryptToFile加密的

/// </summary

/// <param name="filePath"要解密的文件</param

/// <param name="dataIndex"要从哪一个块中解密</param

/// <returns解密后的文本</returns

public static string DecryptFromFile(string filePath,int dataIndex)

{

string r = "";

if(dataIndex 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;

}

/// <summary

/// 将一段文本加密后保存到一个文件

/// </summary

/// <param name="toEncryptText"要加密的文本数据</param

/// <param name="filePath"要保存的文件</param

/// <returns是否加密成功</returns

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;

}

/// <summary

/// 将一个被加密的文件解密

/// </summary

/// <param name="filePath"要解

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有