数据加密-AES数据加密及C#实现

news2024/11/16 15:40:05

引言

AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准与技术研究院(NIST)于2001年发布。AES以其高效、安全的特点,在数据加密领域占据了重要地位。

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // 硬编码的密钥和IV(仅为示例,请勿在生产环境中使用)  
        byte[] key = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
        byte[] iv = Encoding.UTF8.GetBytes("1234567890123456");

        // 输入的15位数字  
        string input = "123456789012345";

        // 加密  
        string encryptedText = Encrypt(input, key, iv);
        Console.WriteLine($"Encrypted: {encryptedText}");
        //string encryptedText = "iQNJPVM+M+DzzMQH5l9pmQ==";
        // 解密(可选,以验证加密是否正确)  
        string decryptedText = Decrypt(encryptedText, key, iv);
        Console.WriteLine($"Decrypted: {decryptedText}");
    }

    static string Encrypt(string plainText, byte[] Key, byte[] IV)
    {
        byte[] encrypted;

        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }
        }

        return Convert.ToBase64String(encrypted);
    }

    static string Decrypt(string cipherText, byte[] Key, byte[] IV)
    {
        cipherText = cipherText.Replace(" ", "+"); // 处理Base64中的空格问题  

        byte[] cipherBytes = Convert.FromBase64String(cipherText);

        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(cipherBytes))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }
}

该程序加密和解密的原理主要基于AES(Advanced Encryption Standard)加密算法,这是一种广泛使用的对称密钥加密算法。在AES中,加密和解密使用相同的密钥,但过程在逻辑上是相反的。下面是该程序加密和解密的具体原理:

加密原理

  1. 密钥和初始化向量(IV)
    • 密钥(Key)是用于加密和解密数据的秘密值。
    • 初始化向量(IV)是一个随机或伪随机的值,用于增加加密的随机性,使得即使相同的明文块在多次加密时也会产生不同的密文块。
    • 在这个程序中,密钥和IV被硬编码为字符串,然后转换为字节数组。然而,在实际应用中,密钥和IV应该安全地生成和存储。
  2. AES算法
    • AES算法将明文数据分成固定大小的块(AES的块大小是128位或16字节)。
    • 对于每个块,AES算法使用密钥和可能的IV(在CBC、CFB等模式下)来生成一个密文块。
    • 如果明文长度不是块大小的整数倍,则需要进行填充(如PKCS#7填充),以确保最后一个块的大小正确。
  3. 加密过程
    • 创建一个Aes对象,并设置其密钥和IV。
    • 使用CreateEncryptor方法创建一个加密器对象。
    • 将明文数据写入一个MemoryStream中,然后将该流包装在一个CryptoStream中,该CryptoStream使用加密器进行加密。
    • 将加密后的数据从MemoryStream中读取出来,并转换为字节数组。
    • 最后,将字节数组转换为Base64字符串以便于存储或传输。

解密原理

解密是加密的逆过程:

  1. 读取密文
    • 首先,将Base64编码的密文字符串转换回字节数组。
  2. AES算法
    • 同样,创建一个Aes对象,并设置与加密时相同的密钥和IV。
    • 使用CreateDecryptor方法创建一个解密器对象。
  3. 解密过程
    • 将密文字节数组包装在一个MemoryStream中,然后将该流包装在一个CryptoStream中,该CryptoStream使用解密器进行解密。
    • CryptoStream中读取解密后的数据,并将其转换回明文。
  4. 处理填充
    • 如果加密时使用了填充(如PKCS#7),解密时会自动移除这些填充字节,以恢复原始明文数据。

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

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

相关文章

XGP怎么免费玩暗黑4 暗黑4XGP免费白嫖教程

暗黑四新赛季已经开启了,全新赛季一定能给你带来完全不一样的感受,在新赛季中,恶魔入侵,炼狱大军来袭,玩家在完成世界阶级三任务线之后,就可以参与炼狱大军的战斗,怪物会一波一波的形式攻击&…

html+css+js网页制作 船票网1个订单页面带js 有增加和删除功能

htmlcssjs网页制作 船票网1个订单页面带js 有增加和删除功能 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。…

一个在国内好用且免费的AI网站,可以让自己的学习或者工作方面,事半功倍!它就是codemoss_能用AI

一、开头放重点 🔥世界主流大模型集聚地 免魔法 白玩GPT4 AI智能工作流 Codemoss_能用AI 传送门:https://www.nyai.chat/chat?invitenyai_1141439 还是那句话,一个好用的AI工具,可以在学习或者工作上,事半功倍。…

如何建立强大的谷歌外链网络?

​要建立一个强大的谷歌外链网络,要理清楚一个观念,质量和数量同等重要,没有垃圾的,质量低下的外链,只有有效跟无效的外链,在弄清楚这一点的前提下,你要知道,一个网站,尤…

在Fiddler中的Composer使用post方法发送非法数据

1、如图所示,先通过fiddler抓取接口 2、抓取接口后复制url 3、在fillder中切换到Composer界面,复制的url粘贴到接口输入框中,并将请求类型改为POST. 4、点击该接口,切换到Inspectors-Raw下 复制请求头以及请求参数 5、将请求头复制…

windows端口转发

使用场景 前提条件: 双网段网络环境(A网段、B网段)跳板机一台,或者称为目标服务器一台。 目标: (在A网段)访问这台服务器的IP端口(例如10.143.21.62:10000),提供服务的是B网段的服务…

【HarmonyOS NEXT星河版开发学习】界面开发实战b-支付宝界面

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 难度系数: 目录 前言 知识点概述 Scroll组件 基本用法 注意事项 层叠布局 层叠布局的特性 层叠布局的应用场景 Stack组…

windows10搭建maxkb开发环境(劝退指南)

windows搭建maxkb开发环境踩坑记录,先说结论吧,windows上面搞不下去了,直接在ubuntu等linux环境搭建吧,别浪费时间了。 1.maxKB开发环境搭建 官方文档:https://maxkb.cn/docs/dev_manual/dev_environment/ 2.各种坑 …

C++知识点总结:5.多态和虚函数(自用)

多态和虚函数 1. 多态和虚函数2. 引用形式的多态3. 虚函数注意事项4. 构成多态的条件5. 为什么构造函数不能是虚函数6. 虚析构函数的必要性7. 纯虚函数8. 抽象类9. 虚函数表10. typeid运算符:获取类型信息11. RTTI机制(C运行时类型识别机制)1…

加速开发利器:代码生成器如何快速生成后端接口?

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 在现代软件开发中,重复性的增删改查逻辑代码的编写往往非常耗时且容易出错。为了提高开发效率,减少手动维护的成本,代码生成器就成为了一个非常…

MySQL常用的日期和时间函数

文章目录 概述日期和时间函数 概述 在 MySQL 中,有许多常用的日期和时间函数,可以帮助你处理和操作日期和时间字段。 日期和时间函数 获取当前日期和时间 NOW(): 返回当前的日期和时间。CURRENT_DATE() 或 CURDATE(): 返回当前的日期(不包括…

3C产品手册制作7步骤:让消费者快速了解产品

引言 在这个信息爆炸的时代,如何让消费者在众多3C产品(计算机、通讯、消费电子)中快速了解并选择您的产品?一份精心制作的产品手册无疑是关键。它不仅是产品的“名片”,更是连接品牌与消费者的桥梁。接下来&#xff0…

2024年湖北省建筑施工特种作业人员证书延期申请/年审

2024年湖北省建筑施工特种作业人员证书延期申请/年审 建筑电工、建筑架子工、建筑起重机械司机、信号工、施工升降机等延期,要注意提前3个月内进行延期,2年1延期。 湖北特种作业考核管理系统跳转至延期申请申报页面,再点击“新增”按钮&…

Games101--shading 3

1.重心坐标 为什么要进行插值?(因为有很多的计算实在三角形内部进行的,而我们需要形成一个平滑的过渡) 插值需要插值什么内容?(颜色,纹理映射,法线插值,可以对三角形的…

计算机毕业设计选题推荐-C语言学习辅导网站-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

springboot工程,无法访问index.html主页

1、问题概述? 我们使用springboot开发了工程后,会将项目打包成jar包或者war包放到服务器端进行发布,但是在打包后,时长会出现index.html主页无法访问的情况。 先分析几种常见的主页无法访问的解决方案,助你解决问题&…

【wiki知识库】08.添加用户登录功能--后端SpringBoot部分

目录 一、今日目标 二、SpringBoot后端实现 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代码 2.4 创建用户上下文工具类 2.5 通过token校验用户(重要) 2.6 创建WebMvcConfig 2.7 用户权限校验拦截器 一、今日目标 上篇…

职业本科大数据实训室

一、职业本科大数据实训室建设背景 在数字化浪潮汹涌澎湃的今天,大数据已跃升为引领社会进步和经济发展的新引擎。随着《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》的深入实施,数字化转型作为国家战略的重要组成部分&…

微信小程序登录获取 session_key 和 openid

一、申请测试小程序,只要微信扫码授权就可以申请了。 二、调用接口获取登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识&#xf…

黔东南苗族文化展示小程序的设计与实现-计算机毕业设计源码85589

摘要 黔东南苗族文化作为中国传统文化的重要组成部分之一,具有悠久的历史和丰富的民俗传统。然而,随着社会的发展和现代化进程,苗族文化面临着传承和保护的挑战。为了更好地传播和展示黔东南苗族文化,本研究设计并实现了一款专注…