C# 加解密之AES

news2024/9/19 11:00:46

        从这一篇开始呢,写一下常用的一些加解密方式。一般我们来说呢,对于加密,我们分为可逆和不可逆。可逆加密又可分为对称加密(AES、DES等)和非对称加密(RSA),还有就是一些编码加密等(BASE64);不可逆的呢,大部分又都称为摘要算法(MD5、SHA)。

        其实上面扯这些也是白扯,对于一般用户来讲,我从明文能变成看不懂的密文就是加密了,管他叫什么,为什么要写这些,因为我发现很多人喜欢较真,拿MD5来说吧,专业点来讲,他确实是摘要算法而不是加密算法,但很多人就是喜欢称为MD5加密,反正我觉得没啥大问题,因为的确可以理解成一种不可逆的加密,大家既然说顺口了就按顺口的来吧,反正都懂就行。

        这一篇主要来写一下对称加密算法中的AES加密,什么是对称加密?简单理解来说,我只有这一把钥匙,它既可以开锁也可以关锁,其他钥匙肯定不行。

        AES是块加密,稍微介绍一些AES的参数以及约束:

  1. Key(密钥):AES的密钥长度必须为128Bit、192Bit、256Bit(一般又都称为AES128,AES192,AES256),我们一般使用的字母数字等,占位都是1Byte,根据换算公式 1 Byte=8 Bit,所以我们的密钥长度就只能是16、24、32;
  2. IV(向量):“加密”初始块,一般为128Bit,即长度为16,与块的长度一样
  3. Mode(加密模式):可分为CBC(密码块链模式)、ECB(电子密码本模式)、OFB(输出反馈模式)、 CFB(密码反馈模式)、CTS(密码文本窃用模式)、CTR(计数器模式)
  4. Padding(填充模式):NoPadding(不填充)、PKCS7(每个字节填充该字节序列的长度)、Zeros(填充0)、ANSIX923(最后一个字节填充字节序列的长度,其余字节均填充数字零)、ISO10126(最后一个字节填充字节序列的长度,其余字节填充随机数据)、PKCS5(和PKCS7一样)

理解了上面所描述的那些参数之后(其实不理解有没关系,只是做一下基础了解,我们大部分都只是做应用层,能用就行了);接下来我们使用代码来实现,更直观的感受下。

实现功能:

使用AES加密方式加解密文本数据

开发环境:

开发工具: Visual Studio 2013

.NET Framework版本:4.5

实现代码:

  public class AesUtil
    {
        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="aesModel"></param>
        /// <returns></returns>
        public static byte[] Encrypt(AesModel aesModel)
        {
            //使用32位密钥
            byte[] key32 = new byte[32];
            //如果我们的密钥不是32为,则自动补全到32位
            byte[] byteKey = Encoding.UTF8.GetBytes(aesModel.Key.PadRight(key32.Length));
            //复制密钥
            Array.Copy(byteKey, key32, key32.Length);

            //使用16位向量
            byte[] iv16 = new byte[16];
            //如果我们的向量不是16为,则自动补全到16位
            byte[] byteIv = Encoding.UTF8.GetBytes(aesModel.IV.PadRight(iv16.Length));
            //复制向量
            Array.Copy(byteIv, iv16, iv16.Length);

            // 创建加密对象,Rijndael 算法
            //Rijndael RijndaelAes = Rijndael.Create();
            RijndaelManaged RijndaelAes = new RijndaelManaged();
            RijndaelAes.Mode = aesModel.Mode;
            RijndaelAes.Padding = aesModel.Padding;
            RijndaelAes.Key = key32;
            RijndaelAes.IV = iv16;
            byte[] result = null;
            try
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream EncryptStream = new CryptoStream(ms, RijndaelAes.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        EncryptStream.Write(aesModel.Data, 0, aesModel.Data.Length);
                        EncryptStream.FlushFinalBlock();
                        result = ms.ToArray();
                    }
                }
            }
            catch { }
            return result;
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="aesModel"></param>
        /// <returns></returns>
        public static byte[] Decrypt(AesModel aesModel)
        {
            //使用32位密钥
            byte[] key32 = new byte[32];
            //如果我们的密钥不是32为,则自动补全到32位
            byte[] byteKey = Encoding.UTF8.GetBytes(aesModel.Key.PadRight(key32.Length));
            //复制密钥
            Array.Copy(byteKey, key32, key32.Length);

            //使用16位向量
            byte[] iv16 = new byte[16];
            //如果我们的向量不是16为,则自动补全到16位
            byte[] byteIv = Encoding.UTF8.GetBytes(aesModel.IV.PadRight(iv16.Length));
            //复制向量
            Array.Copy(byteIv, iv16, iv16.Length);

            // 创建解密对象,Rijndael 算法
            //Rijndael RijndaelAes = Rijndael.Create();
            RijndaelManaged RijndaelAes = new RijndaelManaged();
            RijndaelAes.Mode = aesModel.Mode;
            RijndaelAes.Padding = aesModel.Padding;
            RijndaelAes.Key = key32;
            RijndaelAes.IV = iv16;
            byte[] result = null;
            try
            {
                using (MemoryStream ms = new MemoryStream(aesModel.Data))
                {
                    using (CryptoStream DecryptStream = new CryptoStream(ms, RijndaelAes.CreateDecryptor(), CryptoStreamMode.Read))
                    {
                        using (MemoryStream msResult = new MemoryStream())
                        {
                            byte[] temp = new byte[1024*1024];
                            int len = 0;
                            while ((len = DecryptStream.Read(temp, 0, temp.Length)) > 0)
                            {
                                msResult.Write(temp, 0, len);
                            }

                            result = msResult.ToArray();
                        }
                    }
                }
            }
            catch { }
            return result;
        }

        /// <summary>
        /// AES加密字符串
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        public static string Encrypt(string data, string key, string iv="")
        {
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            byte[] result = Encrypt(new AesModel
            {
                Data = bytes,
                Key = key,
                IV = iv,
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            });
            if (result == null)
            {
                return "";
            }
            return Convert.ToBase64String(result);
        }

        /// <summary>
        /// AES解密字符串
        /// </summary>
        /// <param name="data"></param>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        public static string Decrypt(string data, string key, string iv = "")
        {
            byte[] bytes = Convert.FromBase64String(data);
            byte[] result = Decrypt(new AesModel
            {
                Data = bytes,
                Key = key,
                IV = iv,
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            });
            if (result == null)
            {
                return "";
            }
            return Encoding.UTF8.GetString(result);
        }


        public class AesModel
        {
            /// <summary>
            /// 需要加密/解密的数据
            /// </summary>
            public byte[] Data { get; set; }

            /// <summary>
            /// 密钥
            /// </summary>
            public string Key { get; set; }

            /// <summary>
            /// 向量
            /// </summary>
            public string IV { get; set; }

            /// <summary>
            /// 加密模式
            /// </summary>
            public CipherMode Mode { get; set; }

            /// <summary>
            /// 填充模式
            /// </summary>
            public PaddingMode Padding { get; set; }
        }
    }
    private void btn_Aes_Encrypt_Click(object sender, EventArgs e)
        {
          string result= AesUtil.Encrypt(textBox1.Text, "12345678900987654321");
          textBox2.Text = result;
        }

        private void btn_Aes_Decrypt_Click(object sender, EventArgs e)
        {
            string result = AesUtil.Decrypt(textBox2.Text, "12345678900987654321");
            textBox1.Text = result;
        }

实现效果:

由简入繁,拿来即用

更多精彩,请搜索公 Z 号:Csharp 小记

 

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

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

相关文章

适用于C/C++开发人员的HOOPS

1.编译和运行时信息 1.1编制和执行 编译和运行基于C的应用程序需要以下步骤&#xff1a; 编译&#xff1a; 所有3DGS应用: hoops.lib 使用HOOPS/MVO的应用: hoops_mvo.lib 使用HOOPS/Stream的应用: hoops_stream.lib 执行&#xff1a;确保以下本地DLL位于应用程序的目录或…

学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作 dreamweaver网页设计与制作代码 web前端期末大作业

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

MCE | 癌症诊断和靶向治疗的“遍地开花”

据研究报道&#xff0c;很多癌细胞分泌的外泌体 (Exosome) 比正常细胞分泌的多 10 倍以上。外泌体参与了癌症的发生、进展、转移和耐药性&#xff0c;并通过转运蛋白和核酸&#xff0c;建立与肿瘤微环境的联系。例如&#xff0c;外泌体可导致免疫逃逸&#xff0c;癌细胞的免疫逃…

java 云MAS业务平台_中国移动

云MAS业务平台_中国移动http://mas.10086.cn/login 首页可下载不同协议的接口对接文档,这里以https为例 接口报文数据结构 连接地址:https://:/sms/submit 请求方式:post 数据类型:json(base64加密) A:请求报文内容(一对一或多对一模式*注1): 名称类型说明ecNameSt…

企业年会直播来个虚拟舞台场景如何?

阿酷TONY / 2022-11-21 / 长沙 绿幕抠像 虚拟场景&#xff08;三维场景&#xff09;实时渲染&#xff0c;降低直播成本&#xff0c;带来线下活动所没有的沉浸式视听体验&#xff0c;来吧&#xff0c;来一场精彩纷呈的虚拟年会直播吧。 目录 1. 绿幕虚拟直播间 2. 虚拟场景(…

html实现爱情浪漫表白甜蜜时刻(附源码)

文章目录1.设计来源1.1 主界面1.2 相识界面1.3 相知界面1.4 相爱界面2.效果和源码2.1 动态效果2.2 源代码源码下载作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/128006618 html实现爱情浪漫表白甜蜜时刻(附源码) html爱…

web前端课程设计——重庆旅游7页 HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计&#x1f469;‍&#x1f393;&#xff0c;一般的网页作业需要融入以下知识点&#xff1a;div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

数据结构 | 栈和队列

… &#x1f4d8;&#x1f4d6;&#x1f4c3;本文已收录至&#xff1a;数据结构 | C语言 更多知识尽在此专栏中!文章目录&#x1f4d8;前言&#x1f4d8;正文&#x1f4d6;栈&#x1f4c3;结构&#x1f4c3;初始化&#x1f4c3;销毁&#x1f4c3;入栈、出栈&#x1f4c3;查看栈…

化工机械基础试题及答案

一、 名词解释&#xff08;10分&#xff09; 1、无力矩理论&#xff1a;在旋转薄壳的受力分析中忽略了弯矩的作用&#xff0c;该情况下的应力状态和承受内压的薄膜相似&#xff0c;又称薄膜理论。 2、法兰的公称压力&#xff1a;以16MnR在200℃时的力学性能为基础&#xff0c;其…

力扣刷题(代码回忆录)——动态规划

关于动态规划&#xff0c;你该了解这些&#xff01;动态规划&#xff1a;斐波那契数动态规划&#xff1a;爬楼梯动态规划&#xff1a;使用最小花费爬楼梯本周小结&#xff01;&#xff08;动态规划系列一&#xff09;动态规划&#xff1a;不同路径动态规划&#xff1a;不同路径…

在vmware虚拟机中安装Linux系统CentOS7详细教程

一、CentOS的下载 CentOS是免费版&#xff0c;推荐在官网上直接下载。 https://www.centos.org/download/ DVD ISO&#xff1a;普通光盘完整安装版镜像&#xff0c;可离线安装到计算机硬盘上&#xff0c;包含大量的常用软件&#xff0c;一般选择这种镜像类型即可。 Everythin…

使用html+css+js实现一个静态页面(含源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

A Review of Generalized Zero-Shot Learning Methods

摘要 生成式零样本目的是训练一个模型&#xff0c;监督学习下&#xff0c;输出类别不可知条件下&#xff0c;该模型对数据样本进行分类。为了解决这个任务&#xff0c;生成式零样本利用可见的语义信息和不可见类别在不可见和可见类别间构建桥梁&#xff0c;结论&#xff0c;许…

一篇文章带你搞懂使用PID

节选自本人博客&#xff1a;https://www.blog.zeeland.cn/archives/pid-learning 本文为笔者参考了网上众多大神的解析之后加上自己的理解整合起来的&#xff0c;因此在内容上部分参考了其他作者&#xff0c;目的仅用作参考以便更好地学习&#xff0c;如有侵犯&#xff0c;可联…

慎投:这两本期刊被剔除SCI/SSCI, 11月WOS数据库已更新~

2022年11月22日, Clarivate更新了Journal List, 虽然影响因子每年仅更新一次&#xff0c;但是WOS数据库每个月都会不定期地进行调整&#xff0c;经过审查陆续将部分期刊剔除或新增。 本次更新&#xff0c;SCIE&SSCI期刊数据库剔除(Dropped)或停止检索(Ceased)了6本期刊&am…

运动装备品牌排行榜,运动爱好者必备好物分享

健身运动就像打游戏一样&#xff0c;如何区分你和其他玩家的差别呢&#xff1f;有时候靠身材&#xff0c;当然有时候也会拼装备&#xff0c;那么这些运动装备能否增加buff呢&#xff1f;是否值得入手呢&#xff1f;作为一名资深的运动爱好者&#xff0c;下面我就从实用角度聊一…

计算机组成原理4小时速成:硬件软件,编译,控制器,存储器,运算器,输入输出设备,存储字长

计算机组成原理4小时速成&#xff1a;硬件软件&#xff0c;编译&#xff0c;控制器&#xff0c;存储器&#xff0c;运算器&#xff0c;输入输出设备&#xff0c;存储字长 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能…

软件测试V模型

以“编码”为黄金分割线&#xff0c;将整个过程分为开发和测试&#xff0c;并且开发和测试之间是串行的关系 特点&#xff1a; 明确标注了测试的类型 明确标注了测试阶段和开发阶段之间的对应关系 缺点&#xff1a; 测试后置 V模型是基于瀑布模型的&#xff0c;将测试放在…

PowerShell 批量部署windows_exporter到所有Windows主机

前提条件 参考 批量拷贝脚本到远程主机 $local_path"D:\PowerShell\Powershell-Windows_Admin_Center-install\" #本地脚本存放目录$Destination"d:\" #本地拷贝的脚本到目标主机的目录Invoke-Command -filepath D:\powershell-install-windows_exporter-…

【构建ML驱动的应用程序】第 8 章 :部署模型时的注意事项

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…