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

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对文件进行加解密

介绍&#xff1a; Rijndael 是一种对称加密算法&#xff0c;也是 AES&#xff08;Advanced Encryption Standard&#xff09;的前身。它用于数据的加密和解密&#xff0c;并提供了安全且高效的加密功能。 在.NET Framework 中&#xff0c;Rijndael 类是一个实现了 Rijndael 算法…...

Elasticsearchr入门

首先在官网下载elasticsearch8.9版本&#xff0c;以及8.9版本的kibana。 解压&#xff0c;点击es8.9bin目录下的elasticsearch.bat文件启动es 如图所示即为成功。 启动之后打开idea&#xff0c;添加依赖 <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)&#xff1a;该数据集中包含2400个事件&#xff0c;每个事件指定了EEG.event结构的字段Type(类型)、position(位置)和…...

Dockerfile构建Tomcat镜像(源码)

Dockerfile构建Tomcat镜像 目录 Dockerfile构建Tomcat镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; 1、建立工作目录 [roothuyang1 ~]# mkdir tomcat[roothuyang1 ~]# cd tomcat/[roothuyang1 tomcat]# lsapach…...

Frida Error: getPackageInfoNoCheck(): has more than one overload的解决方法

使用frida绕过证书的时候执行代码&#xff1a; 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。 最近开发过程中遇到外设备的按钮点击触发相应的操作&#xff0c;需要监听对应的keycode来开启游戏或者相关操作。 这里用到了RawKeyboardListener 一、RawKeyboardListener是什么&#xff1f; RawKeyboardListe…...

Temu、希音们全托管引争议,跨境电商应变“工贸一体化”

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

某科技公司提前批测试岗

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

一次redis缓存不均衡优化经验

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

npm发布包

1.npm 登录 在控制台输入命令 npm login 按提示输入用户名&#xff0c;密码&#xff0c;邮箱后登录 如果出现如下提示 需要将淘宝镜像源切换为npm源&#xff0c;删除或注释以下内容就行 2.发布 进入准备发布的代码的根目录下&#xff0c;输入命令 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三个模块后。 直接运行&#xff0c;&#xff0c;此时报错如下&#xff1a; E:\Qt5.13.1\install\5.13.1\msvc2015_64\include\QtCore…...

软件为什么要进行性能压力测试?

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

阻塞队列BlockingQueue详解

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

pygame贪吃蛇游戏

pygame贪吃蛇游戏 贪吃蛇游戏通过enter键启动&#xff0c;贪吃蛇通过WSAD进行上下左右移动&#xff0c;每次在游戏区域中随机生成一个食物&#xff0c;每次吃完食物后&#xff0c;蛇变长并且获得积分&#xff1b;按空格键暂停。 贪吃蛇 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&#xff1a;远程桌面 IP 地址User account&#xff1a;可以选择是…...

使用 OpenCV 和深度学习对黑白图像进行着色

在本文中,我们将创建一个程序将黑白图像(即灰度图像)转换为彩色图像。我们将为此程序使用 Caffe 着色模型。您应该熟悉基本的 OpenCV 功能和用法,例如读取图像或如何使用 dnn 模块加载预训练模型等。现在让我们讨论实现该程序所遵循的过程。 给定一张灰度照片作为输入,本文…...

从价值的角度看,为何 POSE 通证值得长期看好

PoseSwap 是 Nautilus Chain 上的首个 DEX&#xff0c;基于 Nautilus Chain 也让其成为了首个以模块化构建的 Layer3 架构的 DEX。该 DEX 本身能够以 Dapp 层&#xff08;Rollup&#xff09;的形态&#xff0c;与其他应用层并行化运行。...

pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

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

OKR管理策略:为开发团队注入动力

引言 在这个快速变化的世界中&#xff0c;公司需要迅速应对市场变化&#xff0c;并保持其目标和战略的清晰性和一致性。而OKR&#xff08;Objectives and Key Results&#xff09;正是这个挑战的解决方案之一。OKR的实施可以帮助开发团队明确目标&#xff0c;关注关键结果&…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

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

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

算法打卡第18天

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