Net对文件进行加密解密

Net对文件进行加密解密

对文件进行加密解密主要用到System.Security.Cryptography 命名空间下的RijndaelManaged类的CreateEncryptor方法、CreateDecryptor方法和CryptoStream类的Write方法,下面分别对其进行详解。

(1) RijndaelManaged类。

该类是访问System.Security.Cryptography.Rijndael对称加密算法的托管版本。语法格式如下:
public sealed class RijndaelManaged : Rijndael
ps:此算法支持128、192或256位密钥长度。

(2) CreateDecryptor方法。

该方法位于RijndaelManaged类中,使用指定的Key和初始化向量(IV)创建对称Rijndael解密对象,语法格式如下:
public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV)
参数说明:
rgbKey:用于对称算法的机密密钥。
RgbIV:用于对称算法的IV。
返回值:对称的Rrjndael解密器对象。

(3) CreateEncryptor方法

该方法位于RijndaelManaged类中,该方法位于RijndaelManaged类中,使用指定的Key和初始化向量(IV)创建对称Rijndael解、加密对象。
语法格式如下:
public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV);
参数说明:
rgbKey:用于对称算法机密密钥。
rgbIV:用于对称算法的IV。
返回值:对称的RijndaeManaged加密对象。

(4) CryptoStream类

该类定义将数据流链接找到加密转换的,它的构造方法格式如下:
public CryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode)
参数说明:
stream:对其进行加密转换的流。
transform:要对流执行的加密转换。
mode: CryptoStreamMode 枚举值之一。CryptoStreamMode枚举值及说明如下:
Read:对加密流进行读访问。
Write:对加密流的写访问。

(5) CryptoStream类的Write方法。

该方法将一个字节序列写入当前CryptoStream类中,并从当前位置写入指定的字节数。语法格式如下:
public override void Write(byte[] buffer, int offset, int count)
参数说明:
buffer:字节数组,该方法将count个字节从buffer复制到当前流。
offset:buffer中的字节偏移量,从此偏移量开始将字节复制到当前流。
count:要写入当期 流的字节数。

(6) 程序实例布局及代码如下:

代码:

using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.IO;

namespace EncryptTextFileOne
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //选择加密解密文件路径
        private void button1_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "文本文件|*.txt|*.*|*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }
        ///*************************/

        //加密
        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            { MessageBox.Show("请选择要加密的文件"); }
            else
            {
                try
                {
                    string strPath = textBox1.Text;//加密文件的路径
                    int intLent = strPath.LastIndexOf("\\") + 1;
                    int intLong = strPath.Length;
                    string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
                    int intTxt = strName.LastIndexOf(".");
                    int intTextLeng = strName.Length;
                    string strTxt = strName.Substring(intTxt, intTextLeng - intTxt);//取出文件的扩展名
                    strName = strName.Substring(0, intTxt);
                    //加密后的文件名及路径
                    string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt;
                    byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };
                    byte[] IV = { 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 };
                    RijndaelManaged myRijndael = new RijndaelManaged();
                    FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write);
                    FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read);
                    //写入加密文本文件
                    CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateEncryptor(key, IV), CryptoStreamMode.Write);
                    //读加密文本
                    BinaryReader br = new BinaryReader(fsIn);
                    csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length);
                    csDecrypt.FlushFinalBlock();
                    csDecrypt.Close();
                    fsIn.Close();
                    fsOut.Close();
                    if (MessageBox.Show("加密成功!加密后的文件名及路径为:\n" + strOutName + ",是否册除源文件", "信息提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        File.Delete(strPath);
                        textBox1.Text = "";
                    }
                    else
                    { textBox1.Text = ""; }
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message);
                }
            }
        }
        //解密
        private void button3_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
            {
                MessageBox.Show("请选择要解密的文件路径");
            }
            else
            {
                string strPath = textBox1.Text;//加密文件的路径
                int intLent = strPath.LastIndexOf("\\") + 1;
                int intLong = strPath.Length;
                string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名称
                int intTxt = strName.LastIndexOf(".");
                int intTextLeng = strName.Length;
                strName = strName.Substring(0, intTxt);
                if (strName.LastIndexOf("Out") != -1)
                {
                    strName = strName.Substring(0, strName.LastIndexOf("Out"));
                }
                else
                {
                    strName = strName + "In";
                }
                //加密后的文件名及路径
                string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + ".txt";
                byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };
                byte[] IV = { 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 };
                RijndaelManaged myRijndael = new RijndaelManaged();
                FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read);
                CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, IV), CryptoStreamMode.Read);
                StreamReader sr = new StreamReader(csDecrypt);//把文件读出来
                StreamWriter sw = new StreamWriter(strInName);//解密后文件写入一个新的文件
                sw.Write(sr.ReadToEnd());
                sw.Flush();
                sw.Close();
                sr.Close();
                fsOut.Close();
                if (MessageBox.Show("解密成功!解密后的文件名及路径为:"+strInName+",是否册除源文件", "信息提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    File.Delete(strPath);
                    textBox1.Text = "";
                }
                else
                {
                    textBox1.Text = "";
                }
            }
        }
        /***************************/
    }
}

运行结果如图所示:
加密源文件

在这里插入图片描述

加密后文件:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值