/// <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 = DESFile.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(); } } }
private void animateTimer_Tick(object sender, EventArgs e) { stayTime++; if (stayTime * (interval / 1000.0) % 20 == 0) { if (System.IO.File.Exists(userMsgPath + ".candy")) { System.IO.File.Delete(userMsgPath + ".candy"); } String userMsgStr = stayTime.ToString() + "*" + typeNum.ToString() + "*" + mouseNum.ToString() + "*" + distanceNum.ToString() + "*" + sleepNum.ToString(); System.IO.File.AppendAllText(userMsgPath, userMsgStr); string inFile2 = userMsgPath; string outFile2 = inFile2 + ".candy"; string password2 = pwd; DESFile.EncryptFile(inFile2, outFile2, password2); //加密文件 // MessageBox.Show(path); //删除加密前的文件 try { System.IO.File.Delete(inFile2); } catch { MessageBox.Show("文件保存异常!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } if (mainName == "kaki" || mainName == "fool" || mainName == "mati") { //开始计算cat休息时间 excuteTime++; } if (excuteTime * (interval / 1000.0) > 10) { //若休息时间大于10秒 mainName = "fool"; if (excuteTime * (interval / 1000.0) > 12) { //若休息时间大于12秒 mainName = "mati"; if (excuteTime * (interval / 1000.0) > 15) { //若休息时间大于20秒 mainName = "sleep"; sleepNum++; excuteTime = 0; } } } animateopr(); }
private void AboutMe_Load(object sender, EventArgs e) { this.MaximizeBox = false; string inFile = userMsgPath + ".candy"; if (File.Exists(inFile)) { string outFile = inFile.Substring(0, inFile.Length - 5); string password = pwd; DESFile.DecryptFile(inFile, outFile, password);//解密文件 //删除解密前的文件 File.Delete(inFile); String[] msgArr = File.ReadAllText(userMsgPath).Split('*'); time.Text = "我已经累计陪伴你" + (Convert.ToInt64(msgArr[0].ToString()) * 0.5 / 60 / 60).ToString("f2") + "小时了"; key.Text = "看着你敲打键盘" + msgArr[1].ToString() + "次"; mouse.Text = "点击鼠标" + msgArr[2].ToString() + "次"; distance.Text = "您的鼠标移动距离加起来有" + (Convert.ToInt64(msgArr[3]) / (System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width / 0.3)).ToString("f2") + "米哦(当然只是粗略估计啦)"; sleep.Text = "在这期间我睡着了" + Convert.ToInt64(msgArr[4]) + "次,嘻嘻,真是不好意思呢(✿◡‿◡)"; } try { string inFile2 = userMsgPath; string outFile2 = inFile2 + ".candy"; string password2 = pwd; DESFile.EncryptFile(inFile2, outFile2, password2);//加密文件 // MessageBox.Show(path); //删除加密前的文件 try { File.Delete(inFile2); } catch { MessageBox.Show("文件保存异常!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } catch { //MessageBox.Show("本程序没有权限访问您的目标文件夹,数据存储失败,请使用管理员身份运行并再次尝试!", "账号信息存储失败", MessageBoxButtons.OK, MessageBoxIcon.Error); //remPwd.Checked = false; } }
private void LittleCat_Load(object sender, EventArgs e) { CreateShortCut(); this.ShowInTaskbar = false; this.Size = new Size(50, 50); imgShowPB.Size = this.Size; imgShowPB.Location = new Point(0, 0); this.BackColor = Color.Gray; this.TransparencyKey = Color.Gray; this.TopMost = true; //初始动画 animateTimer.Interval = interval; animateTimer.Enabled = true; //初始图片路径 mainName = "sleep"; imgPath = resourcePath + mainName + "1.gif"; imgShowPB.Image = Image.FromFile(imgPath); //安装钩子 mh = new MouseHook(); mh.SetHook(); mh.MouseMoveEvent += mh_MouseMoveEvent; mh.MouseClickEvent += mh_MouseClickEvent; k_hook = new KeyboardHook(); k_hook.KeyDownEvent += new KeyEventHandler(hook_KeyDown); //钩住键按下 k_hook.Start(); //安装键盘钩子 string inFile = userMsgPath + ".candy"; if (System.IO.File.Exists(inFile)) { string outFile = inFile.Substring(0, inFile.Length - 5); string password = pwd; DESFile.DecryptFile(inFile, outFile, password);//解密文件 //删除解密前的文件 System.IO.File.Delete(inFile); String[] msgArr = System.IO.File.ReadAllText(userMsgPath).Split('*'); stayTime = Convert.ToInt64(msgArr[0].ToString()); typeNum = Convert.ToInt64(msgArr[1].ToString()); mouseNum = Convert.ToInt64(msgArr[2].ToString()); distanceNum = Convert.ToInt64(msgArr[3].ToString()); sleepNum = Convert.ToInt64(msgArr[4].ToString()); } try { string inFile2 = userMsgPath; string outFile2 = inFile2 + ".candy"; string password2 = pwd; DESFile.EncryptFile(inFile2, outFile2, password2);//加密文件 // MessageBox.Show(path); //删除加密前的文件 try { System.IO.File.Delete(inFile2); } catch { MessageBox.Show("文件保存异常!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } catch { //MessageBox.Show("本程序没有权限访问您的目标文件夹,数据存储失败,请使用管理员身份运行并再次尝试!", "账号信息存储失败", MessageBoxButtons.OK, MessageBoxIcon.Error); //remPwd.Checked = false; } }
/// <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 = DESFile.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("文件大小不匹配"); } } }