C#文件加解密

本文详细介绍了如何使用C#进行文件的加密和解密操作,结合蓝桥杯比赛中的相关知识点,探讨了利用LINQ进行数据处理在文件加密过程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


        #region 加密文件
        /// <summary>
        /// 加密文件函数
        /// </summary>
        /// <param name="myInFileName">需要加密的文件地址</param>
        /// <param name="myOutFileName">加密后的文件地址与名称</param>
        /// <param name="myKeyString">密钥</param>
        public static void EncryptedFiles(string myInFileName, string myOutFileName, string myKeyString)
        {
            try
            {
                //设定初始变量
                byte[] myDESIV ={ 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53, 0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
                byte[] myDESKey ={ };
                switch (myKeyString.Length)
                {
                    case 8:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7] };
                        break;
                    case 9:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8] };
                        break;
                    case 10:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9] };
                        break;
                    case 11:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10] };
                        break;
                    case 12:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11] };
                        break;
                    case 13:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12] };
                        break;
                    case 14:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13] };
                        break;
                    case 15:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14] };
                        break;
                    case 16:
                        myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14], (byte)myKeyString[15] };
                        break;
                    default:
                        if (myKeyString.Length > 8 && myKeyString.Length < 16)
                        {
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7] };
                        }
                        else
                        {
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14], (byte)myKeyString[15] };
                        }
                        break;
                }
                //创建输入和输出文件流
                FileStream myInFileStream = new FileStream(myInFileName, FileMode.Open, FileAccess.Read);
                FileStream myOutFileStream = new FileStream(myOutFileName, FileMode.OpenOrCreate, FileAccess.Write);
                myOutFileStream.SetLength(0);
                //每次的中间流
                byte[] inSertData = new byte[100];
                //代表已经加密流的大小
                int completedLength = 0;
                //代表要加密文件总的大小
                long inFileSize = myInFileStream.Length;
                //创建RijndaelManaged加密对象
                RijndaelManaged myRijndael = new RijndaelManaged();
                //创建加密流
                CryptoStream enCrytoStream = new CryptoStream(myOutFileStream, myRijndael.CreateEncryptor(myDESKey, myDESIV), CryptoStreamMode.Write);
                //从输入文件中读取流,然后加密到输出文件流
                while (completedLength < inFileSize)
                {
                    //每次写入加密文件的数据大小
                    int length = myInFileStream.Read(inSertData, 0, 100);
                    enCrytoStream.Write(inSertData, 0, length);
                    completedLength += length;
                }
                //关闭流
                try
                {
                    enCrytoStream.Close();
                    myInFileStream.Close();
                    myOutFileStream.Close();
                }
                catch (Exception)
                {
                    myInFileStream.Close();
                    myOutFileStream.Close();
                }

                FileInfo fi = new FileInfo(myInFileName);
                fi.Delete();//删除临时文件

            }
            catch (Exception ex)
            {
                WriteLogFile("加密文件:" + ex.ToString());
            }
        }
        #endregion

        #region 解密文件
        /// <summary>
        /// 解密文件函数
        /// </summary>
        /// <param name="filepath">解压文件夹地址</param>
        /// <param name="myInFileName">需要解密的文件地址</param>
        /// <param name="myOutFileName">解密后的文件地址与名称</param>
        /// <param name="myKeyString">密钥</param>
        public static bool DecryptFiles(string filepath, string myKeyString)
        {
            try
            {
                DirectoryInfo TheFolder = new DirectoryInfo(filepath);
                foreach (FileInfo NextFolder in TheFolder.GetFiles())
                {
                    //文件夹路径
                    string Path = NextFolder.DirectoryName;

                    //获得被加密文件名
                    string myInFileName = NextFolder.FullName;

                    //获得加密文件名
                    string myOutFileName = "temp" + NextFolder.Name;
                    //设定初始变量
                    byte[] myDESIV ={ 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53, 0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
                    byte[] myDESKey ={ };
                    switch (myKeyString.Length)
                    {
                        case 8:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7] };
                            break;
                        case 9:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8] };
                            break;
                        case 10:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9] };
                            break;
                        case 11:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10] };
                            break;
                        case 12:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11] };
                            break;
                        case 13:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12] };
                            break;
                        case 14:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13] };
                            break;
                        case 15:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14] };
                            break;
                        case 16:
                            myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14], (byte)myKeyString[15] };
                            break;
                        default:
                            if (myKeyString.Length > 8 && myKeyString.Length < 16)
                            {
                                myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7] };
                            }
                            else
                            {
                                myDESKey = new byte[] { (byte)myKeyString[0], (byte)myKeyString[1], (byte)myKeyString[2], (byte)myKeyString[3], (byte)myKeyString[4], (byte)myKeyString[5], (byte)myKeyString[6], (byte)myKeyString[7], (byte)myKeyString[8], (byte)myKeyString[9], (byte)myKeyString[10], (byte)myKeyString[11], (byte)myKeyString[12], (byte)myKeyString[13], (byte)myKeyString[14], (byte)myKeyString[15] };
                            }
                            break;
                    }
                    //创建输入和输出文件流
                    FileStream myInFileStream = new FileStream(myInFileName, FileMode.Open, FileAccess.Read);
                    FileStream myOutFileStream = new FileStream(Path + "\\" + myOutFileName, FileMode.OpenOrCreate, FileAccess.Write);
                    myOutFileStream.SetLength(0);
                    //每次的中间流
                    byte[] inSertData = new byte[100];
                    //代表已经加密流的大小
                    int completedLength = 0;
                    //代表要加密文件总的大小
                    long inFileSize = myInFileStream.Length;
                    //创建RijndaelManaged加密对象
                    RijndaelManaged myRijndael = new RijndaelManaged();
                    //创建加密流
                    CryptoStream enCrytoStream = new CryptoStream(myOutFileStream, myRijndael.CreateDecryptor(myDESKey, myDESIV), CryptoStreamMode.Write);
                    //从输入文件中读取流,然后加密到输出文件流
                    while (completedLength < inFileSize)
                    {
                        //每次写入加密文件的数据大小
                        int length = myInFileStream.Read(inSertData, 0, 100);
                        enCrytoStream.Write(inSertData, 0, length);
                        completedLength += length;
                    }
                    //关闭流
                    try
                    {
                        enCrytoStream.Close();
                        myInFileStream.Close();
                        myOutFileStream.Close();
                    }
                    catch (Exception)
                    {
                        myInFileStream.Close();
                        myOutFileStream.Close();
                        return false;
                    }

                    FileInfo fi = new FileInfo(myInFileName);
                    fi.Delete();//将未解迷原文件删除


                    FileInfo fiOut = new FileInfo(Path + "\\" + myOutFileName);
                    fiOut.MoveTo(myInFileName);//将已解密的文件重命名成原未解密的文件名
                }
                return true;

            }
            catch (Exception)
            {
                return false;
            }
        }
        #endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值