c#使用自带库对字符串进行AES加密、解密

文章目录

      • 1 代码
        • 1.1 定义Aes加密类块
        • 1.2 在主函数中调用
      • 2 获取Key和IV
        • 2.1 基本方法
        • 2.2 自定义Key
        • 2.3 技术方面的原理

参考文章: C#软件加密实例? 。
参考官文: Aes 类。

在使用C#的自带的System.Security.Cryptography.Aes模块进行加密和解密时,需要注意的点是:定义用于对称算法的密钥Key和初始化向量IV
如果不定义,就算是对相同字符串加密,每次得到的加密结果也都不一样。

1 代码

1.1 定义Aes加密类块
using System.IO;
using System.Security.Cryptography;namespace Encryption
{internal class AesModule{Aes myAes = null;public AesModule(){// 创建一个Aes对象myAes = Aes.Create();// 【key的值获取方法见2.1】 myAes.Key = new byte[32] { 0xDD, 0xB7, 0xAA, 0xE5, 0xC6, 0x68, 0x95, 0x39, 0x72, 0x7C, 0x7F, 0xDC, 0x5B, 0xC9, 0x77, 0x21, 0x62, 0x59, 0xC4, 0x92, 0xBC, 0x7D, 0x44, 0xA7, 0x3D, 0x02, 0x37, 0x7B, 0x3C, 0x19, 0xEB, 0x7F };// 【IV的值获取方法见2.1】myAes.IV = new byte[16] { 0x84, 0xAA, 0xCD, 0x08, 0x21, 0xCE, 0x4D, 0xA7, 0x7B, 0x34, 0xD9, 0x9F, 0x28, 0x51, 0x8A, 0xEB };}~AesModule(){myAes.Dispose();}/// <summary>/// 将字符串加密为字节数组/// </summary>/// <param name="original">待加密的字符串</param>/// <returns>加密好的字节数组</returns>public byte[] EncryptAes(string original){if (original == null || original.Length <= 0) return null;byte[] encrypted;// 创建一个加密器来执行流转换。ICryptoTransform encryptor = myAes.CreateEncryptor(myAes.Key, myAes.IV);// 创建加密流。using (MemoryStream msEncrypt = new MemoryStream()){using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)){using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)){//将原始文本写入流。swEncrypt.Write(original);}encrypted = msEncrypt.ToArray();}}return encrypted;}/// <summary>/// 将字节数组解密为字符串/// </summary>/// <param name="bArr">待解密的字节数组</param>/// <returns>解密好的字符串</returns>public string DecryptAes(byte[] bArr){if (bArr == null || bArr.Length <= 0) return null;string plaintext = null;ICryptoTransform decryptor = myAes.CreateDecryptor(myAes.Key, myAes.IV);using (MemoryStream msDecrypt = new MemoryStream(bArr)){using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)){using (StreamReader srDecrypt = new StreamReader(csDecrypt)){// 从解密流中读取解密的字节。plaintext = srDecrypt.ReadToEnd();}}}return plaintext;}}
}
1.2 在主函数中调用
internal class Program
{static void Main(string[] args){string original = "Here is some data to encrypt!";AesModule aes = new AesModule();	// 创建自定义Aes模块的对象Console.WriteLine("Original:   {0}", original);byte[] bArr = aes.EncryptAes(original);	// 加密Console.WriteLine("Encrypted:  {0}", BitConverter.ToString(bArr));Console.WriteLine("Decrypted: {0}", aes.DecryptAes(bArr));	// 解密Console.ReadLine();}
}

调用结果:

Original:   Here is some data to encrypt!
Encrypted:  6B-AB-9D-2A-54-16-59-1B-B7-5F-5C-F5-43-6B-D0-C2-E3-6A-72-98-8D-42-99-D9-38-DC-20-09-9C-94-6B-27
Decrypted: Here is some data to encrypt!

2 获取Key和IV

2.1 基本方法

其实方法就是:
定义Aes对象,然后调用它的函数GenerateXXX()方法,来生成Key和IV,并且写死到程序中。

internal class demo
{static void Main(){    	using (Aes myAes = Aes.Create())	// 定义Aes对象{myAes.GenerateKey();			// 生成keyConsole.WriteLine("Key");			PrintBytes(myAes.Key);	myAes.GenerateIV();				// 生成IVConsole.WriteLine("IV");PrintBytes(myAes.IV);}Console.ReadLine();}/// <summary>/// 输出字节数组,加0x并按逗号分割/// </summary>/// <param name="bArr">待输出字节数组</param>static void PrintBytes(byte[] bArr){for (int i = 0; i < bArr.Length; i++){if (i != 0) Console.Write(",");Console.Write("0x" + bArr[i].ToString("X2")); // 其中"X2"表示以大写十六进制格式输出,并且占两个字符的宽度(不足两位时前面补0)}Console.WriteLine();}
}

得到结果(每次运行都不一样):

Key
0xDD,0xB7,0xAA,0xE5,0xC6,0x68,0x95,0x39,0x72,0x7C,0x7F,0xDC,0x5B,0xC9,0x77,0x21,0x62,0x59,0xC4,0x92,0xBC,0x7D,0x44,0xA7,0x3D,0x02,0x37,0x7B,0x3C,0x19,0xEB,0x7F
IV
0x84,0xAA,0xCD,0x08,0x21,0xCE,0x4D,0xA7,0x7B,0x34,0xD9,0x9F,0x28,0x51,0x8A,0xEB

将结果拷贝到代码中下述位置即可:

myAes.Key = new byte[32] { 【key】};
myAes.IV = new byte[16] {【IV】};
2.2 自定义Key

如果你想要生成自定义的Key,那么,也可以使用如下方法来生成。

byte[] key = Encoding.UTF8.GetBytes("Heisagoodboyandwillfindtruelove!");
PrintBytes(key);

会得到专属Key:

0x48,0x65,0x69,0x73,0x61,0x67,0x6F,0x6F,0x64,0x62,0x6F,0x79,0x61,0x6E,0x64,0x77,0x69,0x6C,0x6C,0x66,0x69,0x6E,0x64,0x74,0x72,0x75,0x65,0x6C,0x6F,0x76,0x65,0x21
2.3 技术方面的原理

这里仅略述该预定义AES类的使用原理:
Key定义了get-set函数,而且会自动生成Key,其源代码如下:

public virtual byte[] Key
{get{if (KeyValue == null){GenerateKey();}...}set{...KeyValue = (byte[])value.Clone();}
}

IV类似。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/32725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spdlog日志库的安装配置与源码解析(Linux)

为什么使用日志库而不是控制台输出&#xff1f; 日志库通常提供了更丰富的功能&#xff0c;比如可以设置日志输出级别、输出到不同的目标&#xff08;比如控制台、文件、网络等&#xff09;&#xff0c;以及格式化输出等。 使用日志库可以使代码更易于维护。通过统一的日志接口…

Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符&#xff0c;今天我们使用pytesseract.image_to_data来检测文本并显示 实战教程 和上一次一样&#xff0c;添加opencv-python和pytesseract库 首先我们先来了解一下pytesseract.image_to_data pytesseract.image_to_data(…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口切换SMB共享WMI管道DCOM组件Impacket套件CS插件

红队内网攻防渗透 1. 内网横向移动1.1 WMI进行横向移动1.1.1 利用条件:1.1.1 利用详情1.1.1.1 wmic1.1.1.1.1 正向shell上线1.1.1.1.2 反向shell上线1.1.1.2 cscript(不建议使用)1.1.1.3 wmiexec-impacket1.1.1.4 cs插件1.2 SMB横向移动1.2.1 利用条件:1.2.2 利用详情1.2.2…

基于YOLOv5的火灾检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

基于YOLOv5的火灾检测系统的设计与实现 概述系统架构主要组件代码结构功能描述YOLOv5检测器视频处理器主窗口详细代码说明YOLOv5检测器类视频处理类主窗口类使用说明环境配置运行程序操作步骤检测示例图像检测视频检测实时检测数据集介绍数据集获取数据集规模YOLOv5模型介绍YOL…

对日期的处理

对日期的处理 对编码进行统一&#xff0c;在脚本最开始&#xff1a; # -*- coding: utf-8 -*-这里涉及到两个操作&#xff0c;一个是将数据进行标准化&#xff0c;比如有些日期是2024/05/06这并不符合日期的标准格式&#xff0c;需要转换成这样的2024-05-06 def tran_std(st…

java基于ssm+jsp 社区疫情防控管理信息系统

1前台首页功能模块 社区疫情防控管理信息系统&#xff0c;在社区疫情防控管理信息系统可以查看首页、物品信息、论坛信息、新闻资讯、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 用户登录、用户注册&#xff0c;通过注册填写账号、密码、姓名、身份证、…

正则表达式,linux文本三剑客

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容&#xff0c;按行进行匹配 文本三剑客&#xff1a; grep 过滤文本内容 sed 针对文本内容进行增删改查 awd 按行取列 一.grep命令 作用就是使用正则表达式来匹配文本内容 -m 数字&#xff1a;匹配…

在linux系统中使用docker、mysql实例

systemctl 是一个命令行工具&#xff0c;用于控制和管理基于 systemd 的 Linux 发行版中的系统和服务。 启动服务 &#xff1a;使用 systemctl start [service-name] 开始一个服务。 如启动docker&#xff1a;systemctl start docker 停止服务 &#xff1a;使用 systemctl st…

直播预约丨《袋鼠云大数据实操指南》No.3:数据资产管理实操,如何有效进行数据治理

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

[Shell编程学习路线]——While循环应用技巧 (详细讲解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 基本结构 图示原理 示例 测试 …

链动2+1模式:解锁用户留存与复购的增长密码

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的软件开发公司&#xff0c;专注于为用户打造卓越的产品体验。今天&#xff0c;我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式&#xff0c;以及它是如何助力我们提升用户留存和复购率的。 尽管链…

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…

中国能源统计年鉴(1986-2023年)

数据年份&#xff1a;1986-2023年&#xff0c;无1987、1988、1990三年&#xff0c;1991-2023年齐 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《中国能源统计年鉴》是一部反映中国能源建设、生产、消费、供需平衡的权威性资料书。 共分为7个篇章&#xff1a;1.综合&a…

51-52Windows密码安全性测试与Windows提权

目录 Windows密码安全性测试 一、本地管理员密码如何直接提取 1、直接通过mimikatz读取管理员密码 2、使用laZagne工具读取管理员密码 二、利用Hash远程登录系统 window提权 三、远程webshell执行命令解决 不能执行原因&#xff1a; 解决方法&#xff1a;单独上传cmd.e…

linux系统cpu飙高如何排查

1.通过top命令查看cpu占比较高的进程ID 2.通过top -H -p <进程ID>命令查看该进程中具体线程&#xff0c;可以看到第一个线程 4311 占用了88.2%的cpu 3.通过 printf "%x\n" <线程ID> 把10进制的线程id转为16进制 4.通过jstack <进程ID> | grep &…

【大疆pocket3】到手后5个必改初始设置关键点(下)

【大疆pocket3】到手后5个必改初始设置关键点&#xff08;下&#xff09; 一&#xff0c;简介二&#xff0c;必改关键点2.1 数字变焦2.2 慢动作拍摄2.3 神奇的小摇杆2.4 云台模式使用方法&#xff08;默认增稳模式和俯仰角锁定的差异化以及使用场景&#xff09;2.5 云台转向速度…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于已知电网场景分段拟合智能体智能评估与自主进化方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

为什么 JakeWharton 建议:App 只要用到一个 Activity ?

我们来看看这条回答都提到了哪些内容&#xff0c;对 Activity 和 Fragment 之间的爱恨情仇有何独到的见解&#xff0c;凭什么能得到 JakeWharton 本尊的青睐有加。 因为 Activity 是一个程序入口。你可以将其视为 app 的一个 main 函数。站在用户的立场上&#xff0c;通常你进入…

cesium 包络线

cesium 包络线 以下为源码直接复制可用 1、实现思路 通过turf.js中union方法来计算包络线官方地址:https://turfjs.fenxianglu.cn/ 闪烁线请查看cesium轨迹线(闪烁轨迹线) 2、示例代码 <!DOCTYPE html> <html lang="en"&g

Vue3中使用el-table遇到的问题

我在使用element-plus中el-table组件的时候&#xff0c;对于某一<el-table-column>标签内的内容设置show-overflow-tooltip属性&#xff0c;但这里溢出展示的tooltip的默认样式是无法像el-tooltip标签那样&#xff0c;直接可以修改的。默认的样式是这样&#xff1a; 因此…