AES对称加密
作者:admin 来源:原创 2022/9/13 11:33:48

    加密算法分为对称加密和非对称加密算法。对称加密算法有AES、DES等。非对称加密算法有RSA加密算法。

    本文简单记录使用C#实现AES加密算法的过程,不涉及太底层原理。

    首先定义AesModel,用于承载AES加密的参数。


        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; }
        }
     其中加密模式分为ECB、CBC、CFB。(以下2点来源于网络)

    1)ECB是最简单和最早的模式,首先是密钥扩展,将加密的数据按照16字节的大小分成若干组,对每组都用同样的密钥加密。

    2)CBC和ECB的区别就是添加了一个初始向量(16字节),在将密钥分成若干组之后,第一组与初始化向量异或之后再进行与ECB相同的加密流程,后面的每一组都与上一组的密文进行异或之后再与密钥加密。

    填充模式分为以下几种:

    None:不填充
    PKCS7:缺几个字节就填几个缺的字节数
    Zeros:全部填充0x00,无论缺多少全部填充0x00
    ANSIX923:跟ISO 10126很像,只不过ANSI X9.23其他字节填的都是0而不是随机数
    ISO10126:最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数

    加密主要函数:

    

        /// <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 算法
            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;
        }

下载码:E3F9640E6D

下载码是啥?如何下载=》点击查看

称      呼:
联系方式:
您的评论:
技术支持:l.w.dong@qq.com www.luweidong.cn
广州市   wx:lwdred
Copyright © 2014 三味书屋 All Rights Reserved
技术支持:l.w.dong@qq.com  sitemap xml  sitemap html

粤公网安备44010602011869号

粤ICP备13031080号-1