Esempio n. 1
0
 /// <summary>
 /// 加密文件
 /// </summary>
 /// <param name="inFile">待加密文件</param>
 /// <param name="outFile">加密后输入文件</param>
 /// <param name="password">加密密码</param>
 public static void EncryptFile(string inFile, string outFile, string password)
 {
     using (FileStream fin = File.OpenRead(inFile),
            fout = File.OpenWrite(outFile))
     {
         long   lSize = fin.Length;            // 输入文件长度
         int    size  = (int)lSize;
         byte[] bytes = new byte[BUFFER_SIZE]; // 缓存
         int    read  = -1;                    // 输入文件读取数量
         int    value = 0;
         // 获取IV和salt
         byte[] IV   = GenerateRandomBytes(16);
         byte[] salt = GenerateRandomBytes(16);
         // 创建加密对象
         SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
         sma.IV = IV;
         // 在输出文件开始部分写入IV和salt
         fout.Write(IV, 0, IV.Length);
         fout.Write(salt, 0, salt.Length);
         // 创建散列加密
         HashAlgorithm hasher = SHA256.Create();
         using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write),
                chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
         {
             BinaryWriter bw = new BinaryWriter(cout);
             bw.Write(lSize);
             bw.Write(FC_TAG);
             // 读写字节块到加密流缓冲区
             while ((read = fin.Read(bytes, 0, bytes.Length)) != 0)
             {
                 cout.Write(bytes, 0, read);
                 chash.Write(bytes, 0, read);
                 value += read;
             }
             // 关闭加密流
             chash.Flush();
             chash.Close();
             // 读取散列
             byte[] hash = hasher.Hash;
             // 输入文件写入散列
             cout.Write(hash, 0, hash.Length);
             // 关闭文件流
             cout.Flush();
             cout.Close();
         }
     }
 }
Esempio n. 2
0
        /// <summary>
        /// 输出日志信息到本地日志文件Debug中
        /// </summary>
        /// <param name="operatorDT">当前操作时间</param>
        /// <param name="operators">当前操作人</param>
        /// <param name="describe">操作描述</param>
        /// <param name="state">操作状态</param>
        /// <param name="info">返回信息</param>
        /// <returns></returns>
        public static void FileLogToLocal(DateTime operatorDT, string operators, string describe, string state, string info)
        {
            string password = "******";
            //string debugPath = System.Windows.Forms.Application.StartupPath;//获取debug文件路径
            string UserPath    = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); //获取当前系统登录用户目录
            string LogPath     = Path.Combine(UserPath, "CmstStorageLog");                                    //在当前系统登录用户目录下创建CmstStorageLog文件夹
            string YearString  = DateTime.Now.Year.ToString();                                                //获取当前年份
            string YearPath    = Path.Combine(LogPath, YearString + "年");
            string MonthString = DateTime.Now.Month.ToString("00");                                           //获取当前月份
            string MonthPath   = Path.Combine(YearPath, MonthString + "月");

            Directory.CreateDirectory(MonthPath);
            File.SetAttributes(MonthPath, FileAttributes.Hidden | FileAttributes.System);//设置Log文件夹隐藏,并设置为系统文件

            string nowString  = DateTime.Today.ToString("yyyy年MM月dd日");
            string logName    = nowString + ".txt";
            string txtLogPath = Path.Combine(MonthPath, logName); //按当天日期新建TXT文件,保存加密前日志文件
            string datName    = nowString + ".dat";
            string datLogPath = Path.Combine(MonthPath, datName); //按当天日期新建DAT文件,保存加密后日志文件

            if (File.Exists(datLogPath))
            {
                File.SetAttributes(datLogPath, FileAttributes.Normal);      //取消文件的特殊属性,进行文件读写
                DESFileClass.DecryptFile(datLogPath, txtLogPath, password); //日志文件解密
            }
            using (StreamWriter sw = new StreamWriter(txtLogPath, true, Encoding.Default))
            {
                string str = "**********************************************************************\r\n"
                             + "操作时间:\r\n" + "\t" + operatorDT.ToString() + "\r\n"
                             + "操作人:\r\n" + " \t" + operators + "\r\n"
                             + "操作描述:\r\n" + "\t" + describe + "\r\n"
                             + "操作状态:\r\n" + "\t" + state + "\r\n"
                             + "返回信息:\r\n" + "\t" + info + "\r\n"
                             + "**********************************************************************\r\n" + "\r\n";
                sw.Write(str);
            }


            DESFileClass.EncryptFile(txtLogPath, datLogPath, password);
            File.SetAttributes(datLogPath, FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly);//设置日志文件为系统文件,并隐藏,只读
            File.Delete(txtLogPath);
        }
Esempio n. 3
0
 /// <summary>
 /// 解密文件
 /// </summary>
 /// <param name="inFile">待解密文件</param>
 /// <param name="outFile">解密后输出文件</param>
 /// <param name="password">解密密码</param>
 public static void DecryptFile(string inFile, string outFile, string password)
 {
     // 创建打开文件流
     using (FileStream fin = File.OpenRead(inFile),
            fout = File.OpenWrite(outFile))
     {
         int    size     = (int)fin.Length;
         byte[] bytes    = new byte[BUFFER_SIZE];
         int    read     = -1;
         int    value    = 0;
         int    outValue = 0;
         byte[] IV       = new byte[16];
         fin.Read(IV, 0, 16);
         byte[] salt = new byte[16];
         fin.Read(salt, 0, 16);
         SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
         sma.IV = IV;
         value  = 32;
         long lSize = -1;
         // 创建散列对象, 校验文件
         HashAlgorithm hasher = SHA256.Create();
         using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read),
                chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
         {
             // 读取文件长度
             BinaryReader br = new BinaryReader(cin);
             lSize = br.ReadInt64();
             ulong tag = br.ReadUInt64();
             if (FC_TAG != tag)
             {
                 throw new CryptoHelpException("文件被破坏");
             }
             long numReads = lSize / BUFFER_SIZE;
             long slack    = (long)lSize % BUFFER_SIZE;
             for (int i = 0; i < numReads; ++i)
             {
                 read = cin.Read(bytes, 0, bytes.Length);
                 fout.Write(bytes, 0, read);
                 chash.Write(bytes, 0, read);
                 value    += read;
                 outValue += read;
             }
             if (slack > 0)
             {
                 read = cin.Read(bytes, 0, (int)slack);
                 fout.Write(bytes, 0, read);
                 chash.Write(bytes, 0, read);
                 value    += read;
                 outValue += read;
             }
             chash.Flush();
             chash.Close();
             fout.Flush();
             fout.Close();
             byte[] curHash = hasher.Hash;
             // 获取比较和旧的散列对象
             byte[] oldHash = new byte[hasher.HashSize / 8];
             read = cin.Read(oldHash, 0, oldHash.Length);
             if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash)))
             {
                 throw new CryptoHelpException("文件被破坏");
             }
         }
         if (outValue != lSize)
         {
             throw new CryptoHelpException("文件大小不匹配");
         }
     }
 }