lizf2019 发表于 2020-11-13 22:59

C#如何加密,解密文件

本帖最后由 lizf2019 于 2020-11-13 23:02 编辑

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 文件加密(求助)
{
    public partial class Form1 : Form
    {
      public Form1()
      {
            InitializeComponent();
      }

      /// <summary>
      /// 文件加密
      /// </summary>
      public class FileSecretHelper
      {
            /// <summary>
            /// 密钥,这个密码可以随便指定
            /// </summary>
            public static string sSecretKey = "kn666";

            /// <summary>
            /// 调用该函数从内存中删除的Key后使用
            /// </summary>
            
            public static extern bool ZeroMemory(IntPtr Destination, int Length);


            /// <summary>
            /// 生成一个64位的密钥
            /// </summary>
            /// <returns>string</returns>
            public static string GenerateKey()
            {
                //创建对称算法的一个实例。自动生成的密钥和IV。
                DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

                // 使用自动生成的密钥进行加密。
                return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
            }
            /// <summary>
            /// 加密文件
            /// </summary>
            /// <param name="sInputFilename">待加密的文件的完整路径</param>
            /// <param name="sOutputFilename">加密后的文件的完整路径</param>

            
            /// -------- 疑惑:如何让button1点击后加密 "D:\t\IP地址定位.exe"并删除源文件,在源目录生成IP地址定位.kn------

            /// "D:\t\IP地址定位.exe"
            /// "D:\t\IP地址定位.kn"
            public static void EncryptFile(string sInputFilename, string sOutputFilename)
            {
                FileStream fsInput = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);

                FileStream fsEncrypted = new FileStream(sOutputFilename, FileMode.Create, FileAccess.Write);
                DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                DES.Key = ASCIIEncoding.ASCII.GetBytes(sSecretKey);
                DES.IV = ASCIIEncoding.ASCII.GetBytes(sSecretKey);
                ICryptoTransform desencrypt = DES.CreateEncryptor();
                CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

                byte[] bytearrayinput = new byte;
                fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
                cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);

                cryptostream.Flush();
                fsInput.Flush();
                fsEncrypted.Flush();
                cryptostream.Close();
                fsInput.Close();
                fsEncrypted.Close();
            }


            /// <summary>
            /// 解密文件
            /// </summary>
            /// <param name="sInputFilename">待解密的文件的完整路径</param>
            /// <param name="sOutputFilename">解密后的文件的完整路径</param>
            /// 疑惑:如何让button2点击后解密 "D:\t\IP地址定位.kn"并删除源文件,在源目录生成“IP地址定位.exe
            public static void DecryptFile(string sInputFilename, string sOutputFilename)
            {
                DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                DES.Key = ASCIIEncoding.ASCII.GetBytes(sSecretKey);
                DES.IV = ASCIIEncoding.ASCII.GetBytes(sSecretKey);

                FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
                ICryptoTransform desdecrypt = DES.CreateDecryptor();
                CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
                StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
                fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
                fsDecrypted.Flush();
                fsDecrypted.Close();
            }
      }
      private void button1_Click(object sender, EventArgs e)
            {
               
            }
      }
    }
}
--以上为大部分核心源码--
求助:
1.如何实现自动生成一个密钥保存在C:/下,在解密时导入保存的密钥才能解密【密钥暂定为pass.kps】

2.程序大致运行过程:
选择要加密的文件/目录 —— 点击加密,在C:/下生成唯一密钥文件 —— 解密时需导入密钥文件 【麻烦大佬指点下彩色部分】


求大佬帮忙做个DEMO(可以参考下上面的核心代码),
跪谢大佬!!

lizf2019 发表于 2020-11-13 23:06

欢迎各位大佬发表高见!

灿烂的小居 发表于 2020-11-14 09:44

自动生成 -- form1 load事件运行生成key代码,如果不要重复生成就检查,目标目录下是否存在,pass.kps
文件/目录 -- OpenFileDialog获取路径path,然后使用FileStream处理路径下文件流
导入密钥文件 -- OpenFileDialog获取路径path

万神fake 发表于 2020-11-14 10:56

写好了,不让传文件

万神fake 发表于 2020-11-14 10:59

万神fake 发表于 2020-11-14 10:56
写好了,不让传文件

链接:https://pan.baidu.com/s/1Kr0fcUiBXSsNDlYIybPVDg
提取码:wuai
只有百度云

万神fake 发表于 2020-11-14 11:01

写的一般,仅限参考

lizf2019 发表于 2020-11-14 20:43

万神fake 发表于 2020-11-14 11:01
写的一般,仅限参考

大佬,测试发现几个小问题,您看能修改下吗{:301_1003:}

lizf2019 发表于 2020-11-14 20:52

万神fake 发表于 2020-11-14 11:01
写的一般,仅限参考
1.【不关键】加密后拓展名可否根据文件类型改变(解密后可否也随之改下)


2.【重点问题】文件加密保存解密后显示损坏(解密后文本中文乱码)


3.【小请求】可否再加个选择文件夹后自动获取出所选文件夹下的所有文件和文件夹并全部加密

万神fake 发表于 2020-11-14 21:41

好像就压缩文件这样,我看看

lizf2019 发表于 2020-11-14 21:48

万神fake 发表于 2020-11-14 21:41
好像就压缩文件这样,我看看

exe和其他文件好像也不行{:301_973:}
页: [1] 2
查看完整版本: C#如何加密,解密文件