C#AES加密

一、AES 加密概念

  • 定义 :AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,由美国国家标准与技术研究院(NIST)于 2001 年发布,用于替代之前的 DES(数据加密标准)。它是一种分组密码,以 128 位(16 字节)为分组长度,支持 128 位、192 位和 256 位的密钥长度,分别为 AES - 128、AES - 192 和 AES - 256,其中 AES - 128 应用最为广泛。

  • 应用场景 :适用于对数据安全性和加密效率要求较高的场景,如文件加密、网络数据传输加密、磁盘加密、移动存储设备加密、云存储数据加密以及企业内部敏感信息加密等。

二、AES 加密原理 

  • 分组加密 :AES 将明文按 128 位(16 字节)的分组长度进行分割,每个分组独立进行加密操作,生成相应的 128 位密文分组。对于不足 16 字节的数据,需要进行填充(Padding)操作,使其达到 16 字节的倍数。

  • 密钥扩展 :根据用户提供的主密钥(如 128 位、192 位或 256 位),通过特定的密钥扩展算法生成一系列轮密钥(Round Key)。这些轮密钥在加密和解密过程中逐轮使用,用于混合和混淆数据,增强加密的安全性。

  • 加密轮数 :AES - 128 需要进行 10 轮加密操作,AES - 192 需要 12 轮,AES - 256 需要 14 轮。每轮加密操作都包括字节替代(SubBytes)、行移位(ShiftRows)、列混合(MixColumns)和轮密钥加(AddRoundKey)四个步骤,除了最后一轮不进行列混合操作。

  1. 字节替代(SubBytes) :将每个字节替换为 S - 框(Substitution Box)中对应的字节。S - 框是一种非线性替换表,其设计基于有限域上的乘法逆元和仿射变换,目的是增加加密的复杂性和安全性,使明文和密文之间的关系更加混乱。

  2. 行移位(ShiftRows) :对状态矩阵(由分组数据构成的 4×4 字节矩阵)的每一行进行循环移位操作。具体来说,第 0 行不移位,第 1 行循环左移一个字节,第 2 行循环左移两个字节,第 3 行循环左移三个字节。这样可以打破分组数据的原始排列顺序,增加数据的扩散性,使明文的相邻字节在密文中分散到不同的位置,提高加密的抗攻击能力。

  3. 列混合(MixColumns) :将状态矩阵的每一列视为有限域上的多项式,并与一个固定的多项式进行乘法运算,然后取模。这一操作可以进一步混合各列的数据,使一个字节的改变影响到整个列的数据,从而增强加密的扩散性,使密文对明文的微小变化更加敏感。

  4. 轮密钥加(AddRoundKey) :将当前状态矩阵与轮密钥进行按位异或(XOR)操作。轮密钥是通过密钥扩展算法生成的,与明文数据进行异或操作可以引入密钥的随机性,使密文与明文之间的关系更加复杂,同时确保只有使用正确的密钥才能解密密文。

三、AES 加密用法(以 C# 为例) 

  • 加密文件示例

    using System;
    using System.IO;
    using System.Security.Cryptography;public class AESFileEncryption
    {public static void Main(){string sourceFilePath = @"C:\input.txt"; // 明文文件路径string destinationFilePath = @"C:\encrypted.enc"; // 加密后的文件保存路径string password = "MySecurePassword123"; // 加密密码string salt = "MySaltValue"; // 盐值try{using (Aes aes = Aes.Create()){// 根据密码和盐值生成密钥和 IVRfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));aes.Key = pdb.GetBytes(aes.KeySize / 8);aes.IV = pdb.GetBytes(aes.BlockSize / 8);// 创建加密器ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);// 使用加密流加密文件using (FileStream inputStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))using (FileStream outputStream = new FileStream(destinationFilePath, FileMode.Create, FileAccess.Write))using (CryptoStream cryptoStream = new CryptoStream(outputStream, encryptor, CryptoStreamMode.Write)){byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0){cryptoStream.Write(buffer, 0, bytesRead);}}Console.WriteLine("文件加密完成!");}}catch (Exception ex){Console.WriteLine("文件加密过程中发生错误: " + ex.Message);}}
    }
  • 解密文件示例

    using System;
    using System.IO;
    using System.Security.Cryptography;public class AESFileDecryption
    {public static void Main(){string sourceFilePath = @"C:\encrypted.enc"; // 密文文件路径string destinationFilePath = @"C:\decrypted.txt"; // 解密后的文件保存路径string password = "MySecurePassword123"; // 解密密码(需与加密时的密码相同)string salt = "MySaltValue"; // 盐值(需与加密时的盐值相同)try{using (Aes aes = Aes.Create()){// 根据密码和盐值生成密钥和 IVRfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));aes.Key = pdb.GetBytes(aes.KeySize / 8);aes.IV = pdb.GetBytes(aes.BlockSize / 8);// 创建解密器ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);// 使用解密流解密文件using (FileStream inputStream = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))using (FileStream outputStream = new FileStream(destinationFilePath, FileMode.Create, FileAccess.Write))using (CryptoStream cryptoStream = new CryptoStream(inputStream, decryptor, CryptoStreamMode.Read)){byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = cryptoStream.Read(buffer, 0, buffer.Length)) > 0){outputStream.Write(buffer, 0, bytesRead);}}Console.WriteLine("文件解密完成!");}}catch (Exception ex){Console.WriteLine("文件解密过程中发生错误: " + ex.Message);}}
    }
  • 加密字符串示例

    using System;
    using System.Security.Cryptography;
    using System.Text;public class AESEncryptionExample
    {public static void Main(){string plainText = "这是一段需要加密的文本"; // 明文string password = "MySecurePassword123"; // 密码string salt = "MySaltValue"; // 盐值try{using (Aes aes = Aes.Create()){// 根据密码和盐值生成密钥和 IVRfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));aes.Key = pdb.GetBytes(aes.KeySize / 8);aes.IV = pdb.GetBytes(aes.BlockSize / 8);// 创建加密器ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);// 加密字符串byte[] plainBytes = Encoding.UTF8.GetBytes(plainText);using (MemoryStream ms = new MemoryStream()){using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)){cs.Write(plainBytes, 0, plainBytes.Length);}byte[] encryptedBytes = ms.ToArray();string encryptedText = Convert.ToBase64String(encryptedBytes);Console.WriteLine("加密后的文本: " + encryptedText);}}}catch (Exception ex){Console.WriteLine("加密过程中发生错误: " + ex.Message);}}
    }
  • 解密字符串示例

    using System;
    using System.Security.Cryptography;
    using System.Text;public class AESDecryptionExample
    {public static void Main(){string encryptedText = "加密后的文本"; // 密文(Base64 编码)string password = "MySecurePassword123"; // 密码string salt = "MySaltValue"; // 盐值try{using (Aes aes = Aes.Create()){// 根据密码和盐值生成密钥和 IVRfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(salt));aes.Key = pdb.GetBytes(aes.KeySize / 8);aes.IV = pdb.GetBytes(aes.BlockSize / 8);// 创建解密器ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);// 解密字符串byte[] encryptedBytes = Convert.FromBase64String(encryptedText);using (MemoryStream ms = new MemoryStream(encryptedBytes)){using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)){using (StreamReader sr = new StreamReader(cs)){string decryptedText = sr.ReadToEnd();Console.WriteLine("解密后的文本: " + decryptedText);}}}}}catch (Exception ex){Console.WriteLine("解密过程中发生错误: " + ex.Message);}}
    }

    四、AES 加密的优缺点

优点 

  • 安全性高 :AES 经过了广泛的安全分析和测试,目前没有被公开破解的有效方法。其加密强度随着密钥长度的增加而显著提高,如 AES - 256 的密钥空间极大,使得暴力破解几乎不可能实现。

  • 加密效率高 :AES 算法在现代计算机硬件上具有较高的加密和解密速度,能够快速处理大量数据,适用于对实时性要求较高的应用场景,如网络数据传输加密和视频流加密等。

  • 灵活性强 :支持多种密钥长度(128 位、192 位和 256 位),用户可以根据实际安全需求和性能要求选择合适的密钥长度。同时,AES 还可以与其他加密技术(如哈希算法、数字签名等)结合使用,构建更强大的安全体系。

  • 广泛应用 :由于其优异的性能和安全性,AES 已经成为全球广泛使用的加密标准之一,得到了众多软件和硬件厂商的支持。在操作系统、数据库管理系统、网络设备、加密软件等领域都有广泛的应用,用户可以方便地找到各种实现和工具来使用 AES 加密。

缺点 

  • 密钥管理复杂 :作为对称加密算法,加密和解密使用相同的密钥,因此密钥的分发和管理是一个关键问题。如果密钥在传输或存储过程中泄露,攻击者就可以轻易地解密密文,获取敏感信息。在分布式系统或多用户环境中,密钥的共享和更新需要采用安全的密钥交换协议和密钥管理系统,增加了系统的复杂性和管理成本。

  • 不适合大规模密钥分发 :在需要与大量用户进行加密通信的场景下,对称加密算法的密钥分发问题会变得更加突出。例如,如果有 n 个用户,每个用户之间都需要共享一个唯一的密钥,则总共需要 n(n-1)/2 个密钥。当 n 很大时,密钥的数量会呈平方级增长,给密钥管理带来巨大的挑战。

  • 无法实现数字签名 :对称加密算法只能保证数据的机密性,无法像非对称加密算法那样实现数字签名功能,用于验证数据的完整性和发送者的身份。因此,在需要同时满足数据加密和身份认证的场景下,通常需要将对称加密算法与非对称加密算法结合使用。

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

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

相关文章

搞了两天的win7批处理脚本问题

目录 问题 原因: 经过各种对比 解决方法 问题 比如 echo "yes" | find /c /v "" 这个统计非空串的行数,在其它系统都是 1;但在win7里非正常的反应,为空。 原因: 在wvpCheckStart.bat 首…

手阳明大肠经之温溜穴

个人主页:云纳星辰怀自在 座右铭:“所谓坚持,就是觉得还有希望!” 温溜又名: 1.《针灸甲乙经》:逆注、蛇头。 2.《资生》:池头。 所属经络:手阳明大肠经 定位 屈肘,在前臂…

传统Web应用和RESTful API模式

传统Web应用和RESTful API 传统模式 传统模式没有实现前后端分离,服务器处理完业务后直接返回完整的HTML页面,每次操作都要刷新整个页面。类似下面的情况: Controller public class UserController {RequestMapping("/addUser")…

JS开发node包并发布流程

开发一个可发布到 npm 的 JavaScript 插件,需要遵循标准的开发、测试、打包和发布流程。以下是详细步骤指南: 1. 初始化项目 创建项目目录并初始化 package.json mkdir my-js-plugin cd my-js-plugin npm init -y手动修改 package.json,确保…

对比学习(Contrastive Learning)方法详解

对比学习(Contrastive Learning)方法详解 对比学习(Contrastive Learning)是一种强大的自监督或弱监督表示学习方法,其核心思想是学习一个嵌入空间,在这个空间中,相似的样本(“正样…

1.6 http模块nodejs 对比 go

我们以go语言 原生实现 和浏览器交互.到现在学习 nodejs http模块. nodejs 对于请求分发,也需要我们自己处理. 我们应该也对 http 服务是建立在 tcp协议基础上.有更深入的体会了吧. 对于我们之后 学习 java web容器. 能有更深入的认知. 请求分发 请求分发是指 Web 框架或服务器…

护照阅读器在景区的应用

护照阅读器在景区的应用可以显著提升游客管理效率、增强安全性并优化游客体验。以下是其主要应用场景、优势及实施建议: 一、核心应用场景 快速入园核验 自动身份识别:通过扫描护照芯片(MRZ码或NFC读取),1-3秒完成身份…

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…

什么是遥测数据?

遥测数据定义 遥测数据提供了关于系统性能的重要洞察,对主动解决问题和做出明智决策至关重要。要实现这一点,不能只依赖原始数据 —— 你需要实时的洞察,而这正是遥测数据提供的。 遥测是从远程来源(如服务器、应用程序和监控设…

【JavaAPI搜索引擎】项目测试报告

JavaAPI搜索引擎测试报告 项目背景与项目介绍项目功能自动化测试单元测试测试ansj分词器测试能否获取到正确的URL测试能否正确解析文件中的正文 测试计划界面测试测试1 页面布局是否合理美观,元素是否正确显示测试2 测试是否可以正常显示出搜索结果测试3 点击搜索结…

如何选择合适的IP轮换周期

选择合适的IP轮换周期需综合业务目标、目标平台风控规则、IP类型与质量等多维度因素,以下是系统化决策框架及实操建议: 🔄 一、核心决策要素 业务场景类型 高频操作型(如数据采集、广告点击): 轮换周期短&a…

GO Goroutine 与并发模型面试题及参考答案

目录 什么是 Goroutine,它与线程有何区别? 如何创建一个 Goroutine?有哪些方式? Goroutine 执行函数时传递参数应注意什么问题? 使用 Goroutine 时如何确保主线程不会提前退出? 多个 Goroutine 写共享变量时会出现什么问题?如何解决? 如何用 sync.WaitGroup 管理 …

Leetcode-11 2 的幂

Leetcode-11 2 的幂(简单) 题目描述思路分析通过代码(python) 题目描述 给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。 如果存在一个整数…

【Java】【力扣】121.买卖股票的最佳时机

思路 所以后续的每次都是在&#xff1a;1-判断是否更新最低点 2-如果不需要更新最低点 则计算差值 代码 class Solution { public int maxProfit(int[] prices) { int minprices[0]; int max0; for (int i 1; i < prices.length; i) { //假设0就是最低点 // 判…

微服务架构下大型商城系统的事务一致性攻坚:Saga、TCC与本地消息表的实战解析

当用户在商城完成支付却看到"订单异常"提示时&#xff0c;背后往往是分布式事务一致性缺失导致的业务裂缝。在微服务拆分的商城系统中&#xff0c;如何保障跨服务的交易原子性&#xff0c;成为架构设计的生死线。 一、商城分布式事务的典型场景与痛点 在某家电品牌商…

深入理解 Vue.observable:轻量级响应式状态管理利器

目录 引言 一、什么是 Vue.observable&#xff1f; 二、为什么需要 Vue.observable&#xff1f;解决什么问题&#xff1f; 三、核心原理&#xff1a;响应式系统如何工作 四、如何使用 Vue.observable 功能说明 技术要点 五、关键注意事项与最佳实践 六、实际应用案例 …

JS设计模式(5): 发布订阅模式

解锁JavaScript发布订阅模式&#xff1a;让代码沟通更优雅 在JavaScript的世界里&#xff0c;我们常常会遇到这样的场景&#xff1a;多个模块之间需要相互通信&#xff0c;但是又不想让它们产生过于紧密的耦合。这时候&#xff0c;发布订阅模式就像一位优雅的信使&#xff0c;…

【电路物联网】SDN架构与工作原理介绍

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

vscode 保存 js 时会自动格式化,取消设置也不好使

vscode 里的设置搜索 Editor: Format On Save 取消勾选 卸载 Prettier - Code formatter 这个插件后好使了&#xff0c;本来以为是插件的问题&#xff0c;后来发现是工作区设置的问题。 因为我是用 GitHub 下载的工程打开后&#xff0c; vscode 认为是工作区了, 因为 .vscode…

xcode中project.pbxproj点开为空白问题

由于需要修改signing里面的配置&#xff0c;点击了project.pbxproj。但是发现一片空白&#xff0c;如图 以为是配置文件损坏&#xff0c;邮件show in Finder看了一通后没看出什么所以然。并且发现entitlement文件、list文件全都是点开为白&#xff0c;并且没有任何保存 最后发…