当前位置: 首页 > news >正文

C# 使用 AES 加解密文件

[作者:张赐荣]

对称加密是一种加密技术,它使用相同的密钥来加密和解密数据。换句话说,加密者和解密者需要共享同一个密钥,才能进行通信。
对称加密的优点是速度快,效率高,适合大量数据的加密。对称加密的缺点是密钥的管理和分发比较困难,如果密钥泄露或被破解,那么加密的数据就会失去保密性。
AES是一种高级加密标准,它是一种对称加密算法,也就是说,它使用相同的密钥来加密和解密数据。AES是美国国家标准技术研究所(NIST)在2001年选定的一种加密算法,用于替代旧的DES算法。AES支持三种不同的密钥长度:128位,192位和256位。AES的安全性很高,目前还没有找到有效的攻击方法。

下面两个函数使用AES,加/解密文件。
需要引用 "System.Security.Cryptography" 命名空间。

// 加密文件
        public static async Task<bool> EncryptFileAsync (string inputFilePath, string outputFilePath, string key, Action<double> progressCallback = default, CancellationToken cancellationToken = default)
        {
            HashSet<IDisposable> disposables = new HashSet<IDisposable>();
            try
            {
                var md5 = MD5.Create();
                disposables.Add(md5);
                var md5Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
                var aes = Aes.Create();
                disposables.Add(aes);
                aes.Key = md5Key;
                var aesEncryptor = aes.CreateEncryptor();
                disposables.Add(aesEncryptor);
                var inputStream = File.OpenRead(inputFilePath);
                disposables.Add(inputStream);
                var outputStream = File.OpenWrite(outputFilePath);
                disposables.Add(outputStream);
                aes.GenerateIV();
                await outputStream.WriteAsync(aes.IV,0,aes.IV.Length,cancellationToken);
                var encryptoWriterStream = new CryptoStream(outputStream,aesEncryptor,CryptoStreamMode.Write);
                disposables.Add(encryptoWriterStream);
                var buffer = new byte[65536];
                var readLength = -1;
                while ((readLength = await inputStream.ReadAsync(buffer,0,buffer.Length,cancellationToken)) > 0)
                {
                    await encryptoWriterStream.WriteAsync(buffer,0,readLength,cancellationToken);
                    progressCallback?.Invoke(Math.Round(((double)(inputStream.Position +1 - aes.IV.Length) / inputStream.Length) * 100,2));
                }
                if (!encryptoWriterStream.HasFlushedFinalBlock)
                {
                    encryptoWriterStream.FlushFinalBlock();
                    progressCallback?.Invoke(100.00);
                }
                return (true);
            }
            catch (Exception ex)
            {
                return (false);
            }
            finally
            {
                foreach (var disposableObject in disposables)
                {
                    try
                    {
                        disposableObject.Dispose();
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
            }
        }

// 解密文件
        public static async Task<bool> DecryptFileAsync (string inputFilePath, string outputFilePath, string key, Action<double> progressCallback = default, CancellationToken cancellationToken = default)
        {
            HashSet<IDisposable> disposables = new HashSet<IDisposable>();
            try
            {
                var md5 = MD5.Create();
                disposables.Add(md5);
                var md5Key = md5.ComputeHash(Encoding.Unicode.GetBytes(key));
                var inputStream = File.OpenRead(inputFilePath);
                disposables.Add(inputStream);
                byte[] iv = new byte[16];
                await inputStream. ReadAsync(iv,0,iv.Length,cancellationToken);
                var aes = Aes.Create();
                disposables.Add(aes);
                aes.Key = md5Key;
                aes.IV = iv;
                var aesDecryptor = aes.CreateDecryptor();
                disposables.Add(aesDecryptor);
                var DecryptorReaderStream = new CryptoStream(inputStream,aesDecryptor,CryptoStreamMode.Read);
                disposables.Add(DecryptorReaderStream);
                var outputStream = File.OpenWrite(outputFilePath);
                disposables.Add(outputStream);
                var buffer = new byte[65536];
                var readLength = -1;
                while ((readLength = await DecryptorReaderStream.ReadAsync(buffer,0,buffer.Length,cancellationToken)) > 0)
                {
                    await outputStream.WriteAsync(buffer,0,readLength,cancellationToken);
                    progressCallback?.Invoke(Math.Round(((double)(inputStream.Position + 1) / inputStream.Length) * 100, 2));
                }
                if (!DecryptorReaderStream.HasFlushedFinalBlock)
                {
                    DecryptorReaderStream.FlushFinalBlock();
                    progressCallback?.Invoke(100.00);
                }
                return (true);
            }
            catch (Exception ex)
            {
                return (false);
            }
            finally
            {
                foreach (var disposableObject in disposables)
                {
                    try
                    {
                        disposableObject.Dispose();
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
            }
        }
 

相关文章:

C# 使用 AES 加解密文件

[作者:张赐荣] 对称加密是一种加密技术&#xff0c;它使用相同的密钥来加密和解密数据。换句话说&#xff0c;加密者和解密者需要共享同一个密钥&#xff0c;才能进行通信。 对称加密的优点是速度快&#xff0c;效率高&#xff0c;适合大量数据的加密。对称加密的缺点是密钥的管…...

SSM培训报名管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 培训报名管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…...

锁表后引发的几种删除方式与不同的扩展

在开发过程可能会遇到一些特殊场景&#xff0c;诸如我想删除某表&#xff0c;但是无法删除&#xff0c;去找原因发现是发生了锁表&#xff0c; 锁表指的是在执行一个事务时&#xff0c;该事务获取了一个锁并保持其锁定状态&#xff0c;直到事务完成或手动释放锁&#xff0c;导…...

20.2 OpenSSL 非对称RSA加解密算法

RSA算法是一种非对称加密算法&#xff0c;由三位数学家Rivest、Shamir和Adleman共同发明&#xff0c;以他们三人的名字首字母命名。RSA算法的安全性基于大数分解问题&#xff0c;即对于一个非常大的合数&#xff0c;将其分解为两个质数的乘积是非常困难的。 RSA算法是一种常用…...

MySQL安装『适用于 CentOS 7』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; MySQL 学习 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 &#x1f381;软件版本&#xff1a; MySQL 5.7.44 文章目录 1.MySQL 的清理与安装1.1查看是否存在 MySQL 服务1.2.卸载原有服务1.…...

国家数据局成立,公共数据如何掘金?

国家数据局揭牌&#xff1a;引领新时代数据要素管理和开发的重大举措 筹建7个多月后&#xff0c;10月25日&#xff0c;国家数据局正式揭牌。根据《党和国家机构改革方案》&#xff0c;国家数据局负责协调推进数据基础制度建设&#xff0c;统筹数据资源整合共享和开发利用&…...

PostgreSQL基于Patroni方案的高可用启动流程分析

什么是Patroni 在很多生产环境中&#xff0c;分布式数据库以高可用性、数据分布性、负载均衡等特性&#xff0c;被用户广泛应用。而作为高可用数据库的解决方案——Patroni&#xff0c;是专门为PostgreSQL数据库设计的&#xff0c;一款以Python语言实现的高可用架构模板。该架…...

opencv+yolov8实现监控画面报警功能

项目背景 最近停在门前的车被人开走了&#xff0c;虽然有监控&#xff0c;但是看监控太麻烦了&#xff0c;于是想着框选一个区域用yolov8直接检测闯入到这个区域的所有目标&#xff0c;这样1ms一帧&#xff0c;很快就可以跑完一天的视频 用到的技术 COpenCVYolov8 OnnxRunt…...

基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号

摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…...

C++递归实现验证⼆叉搜索树

C递归实现验证⼆叉搜索树 文章目录 C递归实现验证⼆叉搜索树题目链接题目描述解题思路C算法代码&#xff1a; 题目链接 98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你⼀个⼆叉树的根节点root&#xff0c;判断其是否是⼀个有效的⼆叉搜索树。 有效⼆…...

♥ uniapp 环境搭建

♥ uniapp 环境搭建 开发uniapp需要用到的工具有两个&#xff1a; 1、用到的平台和地址&#xff1a; 需要了解的几个平台以及地址&#xff1a; &#xff08;1&#xff09;微信公众平台 https://mp.weixin.qq.com/ &#xff08;2&#xff09;微信开发文档 https://develo…...

京东商品链接获取京东商品评论数据(用 Python实现京东商品评论信息抓取),京东商品评论API接口,京东API接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取京东多网站上的商品详情页面评论内容。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…...

docker容器中安装ROS1/ROS2(不用配任何环境,10分钟搞定)

默认电脑已经安装了docker&#xff0c;没安装看这篇文章Docker 安装 (完整详细版) ROS和docker各种结合看官方文档 dockerTutorials 在OSRF中拉取想要的 ROS 版本 docker 镜像 网址为 拉取命令在这里 我是安装noetic版本&#xff0c;因为这个兼容比较多现有的工程 docker pul…...

如何解决ssh登录报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

原因&#xff1a; 当两个设备第一次进行链接时&#xff0c;会在~/.ssh/konwn_hosts 中将被连接设备的公钥信息进行保存&#xff0c;后续再次链接时OpenSSH会核对公钥来进行一个简单的验证 然而有时候被链接的那台设备系统被重装、IP 冲突等原因&#xff0c;会导致公钥信息没…...

Mysql5.7安装配置详细图文教程(msi版本)

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

运行dl4j-examples的主要一些依赖

直接从git获取dl4j-examples后本地无法用IJ直接运行样例&#xff0c;于是自己新建了一个springboot项目&#xff0c;主要使用了下面的一些依赖用来运行官方样例 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache…...

PSRAM伪静态RAM芯片APS6404L

PSRAM伪静态RAM能结合SRAM和DRAM的优点&#xff0c;即容量大,又接口驱动简单&#xff0c;PSRAM接口和SRAM一样简单&#xff0c;驱动简单&#xff1b;而存储形式则和DRAM一样&#xff0c;容量远大于SRAM&#xff0c;介于SRAM和DRAM之间。 PSRAM厂家也有很多,以AP用的最多。最常…...

低级语言汇编真的各个面不如汇编吗?

今日话题&#xff0c;低级语言汇编真的各个面不如C语言吗&#xff1f;C语言因其可移植性、开发效率和可读性而在各领域广泛使用&#xff0c;市场占有率极高。然而&#xff0c;汇编语言在特定场景下仍然具有独特优势&#xff0c;稳固地占据一席之地。如果你对这方面感兴趣&#…...

PyG edge index 转换回 邻接矩阵

PyG的edge index形式是 [ ( n o d e 1 , n o d e 2 ) , ( n o d e 1 , n o d e 3 ) . . . ] [(node_1,node_2), (node_1, node_3)...] [(node1​,node2​),(node1​,node3​)...]这种edge pair。 naive 直接for循环&#xff0c;吧edge index里面的位置填充1&#xff1a; imp…...

JavaSE19——file文件类

file文件类 在 Java File 类是 java.io 包中唯一代表磁盘文件本身的对象 File 类不能访问文件内容本身&#xff0c;如果需要访问文件内容本身&#xff0c;则需要使用输入/输出流。 File(String path)&#xff1a;如果 path 是实际存在的路径&#xff0c;则该 File 对象表示的…...

RocketMQ Dashboard监控告警配置全攻略:集成Prometheus+Grafana+钉钉

RocketMQ企业级监控告警体系构建指南&#xff1a;从Dashboard到智能预警 1. 监控体系架构设计基础 在分布式消息中间件的运维实践中&#xff0c;一套完善的监控告警系统如同人体的神经系统&#xff0c;能够实时感知集群状态并及时响应异常。RocketMQ Dashboard作为官方提供的管…...

Paimon数据湖实战:Merge Engines深度解析与应用场景

1. Paimon数据湖中的Merge Engines核心机制 第一次接触Paimon的Merge Engines时&#xff0c;我完全被它强大的数据合并能力震撼到了。这就像是一个智能的数据管家&#xff0c;能够根据不同的业务需求&#xff0c;自动帮你处理各种复杂的数据合并场景。在实际项目中&#xff0c;…...

思源宋体:免费商用中文字体的全面应用指南

思源宋体&#xff1a;免费商用中文字体的全面应用指南 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计领域&#xff0c;字体如同视觉沟通的语言。Source Han Serif TTF&…...

三轴 MEMS 加速度传感器在工业预测性维护中的关键应用

1. 三轴MEMS加速度传感器如何成为工业设备的"听诊器" 想象一下医生用听诊器检查病人心跳的场景。三轴MEMS加速度传感器在工业领域扮演着类似的角色&#xff0c;只不过它"听诊"的对象换成了电机、风机这些设备。这个火柴盒大小的装置&#xff08;303019mm&…...

DICOM RT Structure深度解析——从文件结构到靶区可视化

1. DICOM RT Structure文件基础认知 第一次接触DICOM RT Structure文件时&#xff0c;我完全被那些密密麻麻的标签和序列搞晕了。这就像拿到一份没有目录的医学百科全书&#xff0c;所有内容都堆在一起。但经过几个项目的实战&#xff0c;我发现只要抓住三个核心序列&#xff0…...

OS17.【Linux】进程基础知识(1)

目录 1.浅层定义 程序和进程的区别 2.查看进程的方法 ps ajx top 查看/proc目录 ​编辑 PID 3.手动用ps查看自己运行的程序 在/proc手动查看自己运行的程序目录 杀死进程的常用方法 进程目录中的文件 cwd 理解"当前路径"的含义 4.如何管理一个进程 程…...

3大核心技术构建ESP32智能语音交互系统:从离线唤醒到物联网控制的完整实现方案

3大核心技术构建ESP32智能语音交互系统&#xff1a;从离线唤醒到物联网控制的完整实现方案 【免费下载链接】xiaozhi-esp32 Build your own AI friend 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 在物联网和智能硬件快速发展的今天&#xff0c;如…...

终极指南:掌握Starlight文档导航自定义排序的7个高级技巧

终极指南&#xff1a;掌握Starlight文档导航自定义排序的7个高级技巧 【免费下载链接】starlight &#x1f31f; Build beautiful, accessible, high-performance documentation websites with Astro 项目地址: https://gitcode.com/gh_mirrors/st/starlight Starlight是…...

3个ONNX运行时故障的系统性修复方案:ComfyUI DWPose预处理器实战指南

3个ONNX运行时故障的系统性修复方案&#xff1a;ComfyUI DWPose预处理器实战指南 【免费下载链接】comfyui_controlnet_aux 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 在ComfyUI工作流中&#xff0c;DWPose预处理器作为姿态估计的核心组件&…...

AI 开发实战:技术支持流程里,怎么让 AI 真正减负

AI 开发实战&#xff1a;技术支持流程里&#xff0c;怎么让 AI 真正减负 一、这个问题为什么值得专门拿出来做&#xff1f; 在 AI 工程落地里&#xff0c;真正拖慢团队的往往不是模型本身&#xff0c;而是流程和协作方式没有跟上。 围绕“技术支持流程里&#xff0c;怎么让 AI …...