C# 基于Rijndael对文件进行加解密
介绍:
Rijndael 是一种对称加密算法,也是 AES(Advanced Encryption Standard)的前身。它用于数据的加密和解密,并提供了安全且高效的加密功能。 在.NET Framework 中,Rijndael 类是一个实现了 Rijndael 算法的具体加密器。它是 SymmetricAlgorithm 抽象类的子类之一,可以用于对数据进行加密和解密操作。该算法汇聚了强安全性、高性能、高效率、易用和灵活等优点。算法支持128位(16个字节)、192位(24个字节)和256位(32个字节)的密钥长度。
加密代码:
/// <summary>/// AES 加密/// </summary>/// <param name="encryptData">待加密数据流</param>/// <param name="encryptKey">加密密钥</param>/// <returns>加密的数据流</returns>public static byte[] Encrypt(byte[] encryptData, string encryptKey){if (encryptData.Length == 0) { throw (new Exception("密文不得为空")); }if (string.IsNullOrEmpty(encryptKey)) { throw (new Exception("密钥不得为空")); }byte[] m_btEncrypt;//Rijndael 是一种对称加密算法,也是 AES(Advanced Encryption Standard)的前身。它用于数据的加密和解密,并提供了安全且高效的加密功能。 在.NET Framework 中,Rijndael 类是一个实现了 Rijndael 算法的具体加密器。它是 SymmetricAlgorithm 抽象类的子类之一,可以用于对数据进行加密和解密操作。Rijndael m_AESProvider = Rijndael.Create();try{SetKeyAndIV(m_AESProvider, encryptKey);//CryptoStream 是 .NET Framework 中的一个类,用于在加密和解密过程中提供对数据流的加密或解密转换。它是 System.IO.Stream 类的派生类。CryptoStream 通过将其包装在一个输入或输出流中,提供了对数据流进行加密或解密的能力。它可以与任何实现了 SymmetricAlgorithm 或 AsymmetricAlgorithm 的加密算法一起使用。using (MemoryStream m_stream = new MemoryStream())using (CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(), CryptoStreamMode.Write)){m_csstream.Write(encryptData, 0, encryptData.Length);m_csstream.FlushFinalBlock();m_btEncrypt = m_stream.ToArray();//m_stream.Close();//m_stream.Dispose();//m_csstream.Close();//m_csstream.Dispose();}}catch (IOException ex) { throw ex; }catch (CryptographicException ex) { throw ex; }catch (ArgumentException ex) { throw ex; }catch (Exception ex) { throw ex; }finally { m_AESProvider.Clear(); }return m_btEncrypt;}/// <summary>/// 设置密钥和初始化向量/// </summary>/// <param name="algorithm"></param>/// <param name="key">密钥</param>private static void SetKeyAndIV(SymmetricAlgorithm algorithm, string key){// 生成随机密钥和初始化向量//algorithm.GenerateKey();//algorithm.GenerateIV();byte[] m_btIV = new byte[16]{2,3,73,192,68,245,71,131,2,142,97,11,230,110,216,247};byte[] m_btSalt = new byte[2] { 35, 25 };//PasswordDeriveBytes 是 .NET Framework 中的一个类,用于从密码派生加密密钥。它是 System.Security.Cryptography.DeriveBytes 类的子类。PasswordDeriveBytes 通过在密码和盐值(salt)之间进行迭代哈希操作来生成强大的加密密钥。它可用于生成符合特定算法要求的密钥,例如 AES、TripleDES 和 RC2。PasswordDeriveBytes passwordDeriveBytes = new PasswordDeriveBytes(key, m_btSalt);//Key是一个字节数组,表示对称算法所使用的密钥。密钥的长度通常由所选的对称算法确定,通常为 128 比特、192 比特或 256 比特。对于相同的密钥和相同的输入,在相同的对称算法下会产生相同的输出。algorithm.Key = passwordDeriveBytes.GetBytes(32);//IV 是一个字节数组,表示对称算法的初始化向量。初始化向量是在加密过程中用于生成随机性的初始输入值。它与密钥一起用于变换数据,并确保即使相同的输入也能得到不同的加密结果。algorithm.IV = m_btIV;}
解密代码:
/// <summary>/// AES 解密/// </summary>/// <param name="decryptData">待解密数据流</param>/// <param name="decryptKey">解密密钥</param>/// <returns>解密的数据流</returns>public static byte[] Decrypt(byte[] decryptData, string decryptKey){if (decryptData.Length == 0) { throw (new Exception("密文不得为空")); }if (string.IsNullOrEmpty(decryptKey)) { throw (new Exception("密钥不得为空")); }byte[] m_btDecrypt;Rijndael m_AESProvider = Rijndael.Create();try{SetKeyAndIV(m_AESProvider, decryptKey);using (MemoryStream m_stream = new MemoryStream())using (CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(), CryptoStreamMode.Write)){m_csstream.Write(decryptData, 0, decryptData.Length);m_csstream.FlushFinalBlock();m_btDecrypt = m_stream.ToArray();//m_stream.Close();//m_stream.Dispose();//m_csstream.Close();//m_csstream.Dispose();}}catch (IOException ex) { throw ex; }catch (CryptographicException ex) { throw ex; }catch (ArgumentException ex) { throw ex; }catch (Exception ex) { throw ex; }finally { m_AESProvider.Clear(); }return m_btDecrypt;}
应用示例:
1、加解密字符串
string key = "ae125efkk4_54eeff444ferfkny6ox22666";
string encryptText = "张三";
byte[] encryptData = Encoding.Default.GetBytes(encryptText);byte[] btencryptResult = Encrypt(encryptData, key);
Console.WriteLine(Convert.ToBase64String(btencryptResult)); //结果显示: XXXXXXXbyte[] btdecryptResult = Decrypt(btencryptResult, key);
Console.WriteLine(Encoding.Default.GetString(btdecryptResult)); //结果显示: 张三
2、加解密文件
string key = "ae125efkk4_54eeff444ferfkny6ox22666";
//针对文件的加解密
string filePath = @"D:\data\test.aes";
string encryptPath = filePath + "en";
int dataSize = 104096;
AESFile(filePath, encryptPath, dataSize, key, Encrypt);int deSize = 104112;//Rijndael 算法(也称为 AES)以固定大小的数据块进行加密,默认情况下为 128 位(16 字节)。
string decryptPath = filePath + "de";
AESFile(encryptPath, decryptPath, deSize, key, Decrypt);
/// <summary>
/// AES加解密文件
/// </summary>
/// <param name="sourcePath">源文件路径</param>
/// <param name="tarPath">目标路径</param>
/// <param name="dataSize">数据流大小</param>
/// <param name="key">密钥</param>
/// <param name="action">方法</param>
private static void AESFile(string sourcePath, string tarPath, int dataSize, string key, Func<byte[], string, byte[]> action)
{using (FileStream fileStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)){using (FileStream fileStream2 = new FileStream(tarPath, FileMode.OpenOrCreate, FileAccess.Write)){int num = (int)((fileStream.Length - 1) / dataSize + 1);for (int i = 0; i < num; i++){int relSize = dataSize;if (i == num - 1){relSize = (int)(fileStream.Length - i * dataSize);}byte[] array = new byte[relSize];fileStream.Read(array, 0, relSize);byte[] array2 = action?.Invoke(array, key);fileStream2.Write(array2, 0, array2.Length);fileStream2.Flush();}fileStream2.Close();fileStream2.Dispose();}}
}
黑云压城城欲摧,甲光向日金鳞开。--李贺《雁门太守行》
相关文章:
C# 基于Rijndael对文件进行加解密
介绍: Rijndael 是一种对称加密算法,也是 AES(Advanced Encryption Standard)的前身。它用于数据的加密和解密,并提供了安全且高效的加密功能。 在.NET Framework 中,Rijndael 类是一个实现了 Rijndael 算法…...

Elasticsearchr入门
首先在官网下载elasticsearch8.9版本,以及8.9版本的kibana。 解压,点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea,添加依赖 <dependency><groupId>com.fasterxml.jackson.core</g…...
【ARM】imx6ul移植kernel记录,恩智浦github提供的最新kernel(2023年7月31)
❤️作者主页:凉开水白菜 ❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步! ❤️专栏目录: ❤️专栏资料: ❤️点赞 👍 收藏 ⭐再看,养成习惯 订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑! 文章目录 一、简介二、源码下载三、官方…...

eeglab(自用)
目录 1.加载、显示数据 2.绘制脑电头皮图 3.绘制通道光谱图 4.预处理工具 5.ICA去除伪迹 5. 提取数据epoch 1.加载、显示数据 观察事件值(Event values):该数据集中包含2400个事件,每个事件指定了EEG.event结构的字段Type(类型)、position(位置)和…...

Dockerfile构建Tomcat镜像(源码)
Dockerfile构建Tomcat镜像 目录 Dockerfile构建Tomcat镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试: 1、建立工作目录 [roothuyang1 ~]# mkdir tomcat[roothuyang1 ~]# cd tomcat/[roothuyang1 tomcat]# lsapach…...
Frida Error: getPackageInfoNoCheck(): has more than one overload的解决方法
使用frida绕过证书的时候执行代码: frida -U -f de.robv.android.xposed.installer --codeshare akabe1/frida-multiple-unpinning --no-pause遇到这样的错误 Error: getPackageInfoNoCheck(): has more than one overload, use .overload() to choose from: 网上查…...
flutter开发实战-RawKeyboardListener监听键盘事件及keycode。
flutter开发实战-RawKeyboardListener监听键盘事件及keycode。 最近开发过程中遇到外设备的按钮点击触发相应的操作,需要监听对应的keycode来开启游戏或者相关操作。 这里用到了RawKeyboardListener 一、RawKeyboardListener是什么? RawKeyboardListe…...

Temu、希音们全托管引争议,跨境电商应变“工贸一体化”
自7月27日Shopee宣布正式上线全托管模式起,全托管似乎突然又进入了爆发期。 在7月31日至8月1日举行的2023第八届深圳国际跨境电商贸易博览会上,全托管成为SHEIN、Wish、Lazada等平台力推的运营模式。进入8月,跨境圈突然涌现大批传言称&#…...

某科技公司提前批测试岗
文章目录 题目 今天给大家带来一家提前批测试岗的真题,目前已经发offer 题目 1.自我介绍 2.登录页面测试用例设计 3.如何模拟多用户登录 可以使用Jmeter,loadRunner性能测试工具来模拟大量用户登录操作去观察一些参数变化 4.有使用过Jmeter,loadRunner做过性能压…...

一次redis缓存不均衡优化经验
背景 高并发接口,引入redis作为缓存之后,运行一段时间发现redis各个节点在高峰时段的访问量严重不均衡,有的节点访问量7000次/s,有的节点访问量500次/s 此种现象虽然暂时不影响系统使用,但是始终是个安全隐患&#x…...

npm发布包
1.npm 登录 在控制台输入命令 npm login 按提示输入用户名,密码,邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源,删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下,输入命令 npm publish 3.删除已发…...

Qt5.13引入QtWebApp的模块后报错: error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”
1、开发环境 Win10-64 qt5.13 msvc2015-64bit-release 2、报错 新建一个demo工程。 引入QtWebApp的httpserver、logging、templateengine三个模块后。 直接运行,,此时报错如下: E:\Qt5.13.1\install\5.13.1\msvc2015_64\include\QtCore…...

软件为什么要进行性能压力测试?
软件为什么要进行性能压力测试?随着软件应用的不断增多和复杂度的提高,软件的性能对用户体验和业务成功至关重要。性能问题可能导致软件运行缓慢、崩溃或无响应,给用户带来不便甚至损失。为了确保软件能够在高负载和压力下正常运行࿰…...

阻塞队列BlockingQueue详解
一、阻塞队列介绍 1、队列 队列入队从队首开始添加,直至队尾;出队从队首出队,直至队尾,所以入队和出队的顺序是一样的 Queue接口 add(E) :在指定队列容量条件下添加元素,若成功返回true,若当前…...

pygame贪吃蛇游戏
pygame贪吃蛇游戏 贪吃蛇游戏通过enter键启动,贪吃蛇通过WSAD进行上下左右移动,每次在游戏区域中随机生成一个食物,每次吃完食物后,蛇变长并且获得积分;按空格键暂停。 贪吃蛇 import random, sys, time, pygame from …...

Mac系统下使用远程桌面连接Windows系统
一、远程桌面工具 Microsoft Remote Desktop 二、下载地址 https://go.microsoft.com/fwlink/?linkid868963 三、下载并安装 四、添加远程PC PC name:云服务器IP。 User account: 添加系统用户 PC name:远程桌面 IP 地址User account:可以选择是…...
使用 OpenCV 和深度学习对黑白图像进行着色
在本文中,我们将创建一个程序将黑白图像(即灰度图像)转换为彩色图像。我们将为此程序使用 Caffe 着色模型。您应该熟悉基本的 OpenCV 功能和用法,例如读取图像或如何使用 dnn 模块加载预训练模型等。现在让我们讨论实现该程序所遵循的过程。 给定一张灰度照片作为输入,本文…...

从价值的角度看,为何 POSE 通证值得长期看好
PoseSwap 是 Nautilus Chain 上的首个 DEX,基于 Nautilus Chain 也让其成为了首个以模块化构建的 Layer3 架构的 DEX。该 DEX 本身能够以 Dapp 层(Rollup)的形态,与其他应用层并行化运行。...

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值
pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。 net nn.Linear(4, 2) loss nn.CrossEntropyLoss() X torch.rand(10, 4) y torch.ones(10, dt…...

OKR管理策略:为开发团队注入动力
引言 在这个快速变化的世界中,公司需要迅速应对市场变化,并保持其目标和战略的清晰性和一致性。而OKR(Objectives and Key Results)正是这个挑战的解决方案之一。OKR的实施可以帮助开发团队明确目标,关注关键结果&…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...