吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1382|回复: 10
收起左侧

[求助] C#如何加密,解密文件

[复制链接]
lizf2019 发表于 2020-11-13 22:59
本帖最后由 lizf2019 于 2020-11-13 23:02 编辑

[C#] 纯文本查看 复制代码
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>
            [DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
            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.Length];
                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(可以参考下上面的核心代码),
跪谢大佬!!
image.png
image.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
哇卡s + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 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
只有百度云

免费评分

参与人数 1热心值 +1 收起 理由
lizf2019 + 1 谢谢大佬

查看全部评分

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

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
lizf2019 + 2 + 1 谢谢大佬

查看全部评分

 楼主| lizf2019 发表于 2020-11-14 20:43
万神fake 发表于 2020-11-14 11:01
写的一般,仅限参考

大佬,测试发现几个小问题,您看能修改下吗
 楼主| lizf2019 发表于 2020-11-14 20:52
万神fake 发表于 2020-11-14 11:01
写的一般,仅限参考

1.【不关键】加密后拓展名可否根据文件类型改变(解密后可否也随之改下 image.png


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


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

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

exe和其他文件好像也不行
image.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 11:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表