广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#加解密之AES算法的实现
  • 576
分享到

C#加解密之AES算法的实现

2024-04-02 19:04:59 576人浏览 薄情痞子
摘要

目录实现功能开发环境实现代码实现效果从这一篇开始呢,写一下常用的一些加解密方式。一般我们来说呢,对于加密,我们分为可逆和不可逆。可逆加密又可分为对称加密(AES、DES等)和非对称加

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

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

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

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

  • Key(密钥):AES的密钥长度必须为128Bit、192Bit、256Bit(一般又都称为AES128,AES192,AES256),我们一般使用的字母数字等,占位都是1Byte,根据换算公式 1 Byte=8 Bit,所以我们的密钥长度就只能是16、24、32;
  • IV(向量):“加密”初始块,一般为128Bit,即长度为16,与块的长度一样
  • Mode(加密模式):可分为CBC(密码块链模式)、ECB(电子密码本模式)、OFB(输出反馈模式)、 CFB(密码反馈模式)、CTS(密码文本窃用模式)、CTR(计数器模式)
  • 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;
        }

实现效果

以上就是C#加解密之AES算法的实现的详细内容,更多关于C# AES算法的资料请关注编程网其它相关文章!

--结束END--

本文标题: C#加解密之AES算法的实现

本文链接: https://www.lsjlt.com/news/165809.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#加解密之AES算法的实现
    目录实现功能开发环境实现代码实现效果从这一篇开始呢,写一下常用的一些加解密方式。一般我们来说呢,对于加密,我们分为可逆和不可逆。可逆加密又可分为对称加密(AES、DES等)和非对称加...
    99+
    2022-11-13
  • C#中实现AES算法加密解读
    目录先上效果图先添加辅助类开始实现总结先上效果图 文件和加密文件之间的转换。 先添加辅助类 public class AES_EnorDecrypt { ...
    99+
    2023-02-26
    C# AES算法加密 AES算法加密 C# AES加密
  • C#中如何实现AES算法加密
    这篇文章主要介绍了C#中如何实现AES算法加密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中如何实现AES算法加密文章都会有所收获,下面我们一起来看看吧。先上效果图文件和加密文件之间的转换。先添加辅助类&...
    99+
    2023-07-05
  • python实现AES算法及AES-CFB8加解密源码
    目录Python实现AES算法生成轮密钥加密解密完整代码如下测试测试程序Python实现AES-CFB8加解密Python实现AES算法 密码学课程老师留的作业,我觉得用python...
    99+
    2022-11-13
  • ASP.NETCore实现AES-GCM加密算法
    传统的加密算法中,一个主要的问题是无法确认密钥或密文的有效性,也就是说,当密钥或密文错误时,照样能解密,但不报错。还需要我们制定一个一个原文的校验算法。 为了简化这个过程,一种方式是...
    99+
    2022-11-13
  • C#加解密之DES算法的实现
    目录前言实现功能开发环境实现代码实现效果前言 说完了对称加密中的AES,这一篇再来介绍下DES。 加解密原理什么的就不介绍了,大家可以自行百度(主要我也不太明白,也不需要太明白),大...
    99+
    2022-11-13
  • 使用Java实现加密之AES加解密
    目录1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验...
    99+
    2023-05-18
    Java AES AES 加解密
  • Golang实现AES对称加密算法实例详解
    目录前言前置知识生成随机数生成随机字符串加密和解密加密解密总结前言 安全总是相对的,对于敏感数据最好要有一定保护措施,尤其是在线数据,通过加密可转换信息为编码,从而防止非法获取。对开...
    99+
    2023-02-21
    golang 对称加密 go语言aes加密 对称加密 aes
  • jquery实现aes加密解密
    随着互联网技术的发展,网络安全问题变得越来越突出。许多网站都要求用户输入敏感信息,如密码等。这些信息往往需要进行加密处理,以保证安全性。AES(Advanced Encryption Standard)是一种流行的加密算法,具有高效、安全、...
    99+
    2023-05-24
  • AES加密解密python实现
    1.前言         关于现代密码学算法,可以查看以下博客全面了解 CISSP考试要求里的“应用密码学”内容辅助记忆趣味串讲_晓翔仔的博客-CSDN博客         AES的细节知识,可以查阅 AES加密算法的详细介绍与实现_Tim...
    99+
    2023-09-20
    python 开发语言 密码学 非对称加密 AES
  • JAVA实现AES加密,解密
    java提供了加解密工具,可以将字节转成加密字节. 因此在加解密前需要对内容进行转换. 一般情况我们希望以字符串的形式展示加密串 可以将byte[] 转换为base64字符串 也可以转换为16进制字符串 这里提供两个工具类 加密串为base...
    99+
    2023-08-24
    java 数据库 mysql
  • Java实现加密(一)AES加解密
    目录 1.背景知识2.AES简介3.AES的加密过程(AES处理单位:字节)4.Java实现4.1 生成密钥和偏移量4.2 AESUtil.java 源码4.3 执行结果4.4 线上验证 1.背景知识 在密码学中,加...
    99+
    2023-08-18
    java
  • Java AES加密解密的简单实现方法
    废话不多说,直接上代码package com.mstf.aes; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;im...
    99+
    2023-05-31
    java rsa 加密
  • Golang如何实现AES对称加密算法
    本篇内容主要讲解“Golang如何实现AES对称加密算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang如何实现AES对称加密算法”吧!前置知识在正式学习加密解密之前,首先看看如何生成...
    99+
    2023-07-05
  • Rust实现AES加解密详解
    目录一、选择使用 rust-crypto二、Cargo.toml 文件三、工具类1、加密2、解密3、测试样例一、选择使用 rust-crypto rust-crypto 官方相关站点...
    99+
    2022-11-13
    Rust AES加解密 Rust 加密 Rust 解密
  • C#利用异或算法实现加密解密
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2023-01-03
    C#异或算法实现加密解密 C# 异或算法 C# 加密解密
  • java实现AES 32位加密解密的方案
    目录1、常用加密32位原因2、解决方案3、AES工具类1、常用加密32位原因 网上很多解密加密是16位的,用32位密钥加密会报java.security.InvalidKeyExc...
    99+
    2022-11-12
  • golang实现aes-cbc-256加密解密功能
    目录我为什么吃撑了要实现go的aes-cbc-256加密解密功能?1:面临两个问题1:go秘钥长度必须是16/24/322:go根本不支持256位的aes-cbc加密解密3:想用go...
    99+
    2023-05-18
    go aes加密解密 go 256加密解密
  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)
    目录关于加密解密AESDESRSAMD5Sha1Base64在项目开发过程中,当操作一些用户的隐私信息,诸如密码、帐户密钥等数据时,往往需要加密后可以在网上传输。这时,需要一些高效地...
    99+
    2022-11-13
  • python实现对AES加密的视频数据流解密的方法
    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 在做网络爬虫的时候,会遇到经过AES加密的数据,可以使用py...
    99+
    2023-02-21
    python实现对AES加密的视频数据流解密 python  AES加密解密
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作