• C# 常用加密方法一 AES 与 DES


    对称性加密算法

    DES (Data Encryption Standard 数据加密算法) 与 AES (Advanced Encryption Standard 高级加密标准),都是一种对称加密算法,既加密和解密使用同一个密钥。

     

    块加密算法

    AES 与 DES 同样都是一种块加密算法,会把明文按等长的块然后分别进行加密。不同之处在于DES 的密钥长度为 56 位加 8 位奇偶校验位(每组的第8位作为奇偶校验位),而AES 的密钥长度为 128,192或256位(在 C# 中为 256 位)。

    由于 DES 的密钥长度过,DES 被认为是不安全的,已被 AES 所取代。

     

    块加密算法模式

    在 C# 中,块加密算法支持 5 种模式,分别为ECB、CBC、CFB、OFB、CTS。其中在CBC、CFB、OFB模式下需要用到加密向量:IV (Initialization Vector),它是为了保证对同一明文加密时不会产生相同的密文。而ECB、CBC模式会将长度不足的源数据填充至密钥的整数倍,其余三种模式则保持长度不变,这主要是加密时的异或操作导致的。

     

    ECB (Electronic Codebook 电码本)

    ECB 相对比较简单,原理是将数据切割后,对每一块单独进行加密,不需要开头所说的 IV(加密向量)。

    这样做的优点是可以并行处理,速度可以非常快;缺点也很明显,在源数据跟密钥不变的情况下,加密后的数据都是一样的。

    未加密时 ECB 加密

     

    CBC (Cipher Block Chaining 密码分组链接)

    CBC 不同于 ECB 的是,它会将第一块与 IV 异或之后再进行加密,之后再以前一块的加密数据作为 IV,再对后一块进行加密;而解密时可以直接利用前一块的密文,因此可以并行执行。

    CBC 的优点是安全性比较好,不过缺点是加密的速度会比较慢。而且由于加密时的串行性,若之前的源明文发生改变,那往后密文也会全部改变;而解密时,密文的改变只会导致对应块解密后的明文发生变化,以及下一块的对应位改变(解密的数据需要与上一块密文异或)。

    将加密数据的某一位改变后的结果:

    明文:Some information about aes encryption method.
    解密:x?Z????Od??1^? about a*s encryption method.

     

    CFB (Cipher Feedback 密码反馈)

    在 CFB 模式中,是对向量进行加密,再与明文进行异或操作,密文再作为向量参与下一个加密。所谓反馈,就是指前一个密文作为下一次加密的输入,再进行加密。

    CFB 在解密时,也是用的加密器,因此解密过程与 CBC 的加密过程是一样的。

     

    OFB (Output Feedback 输出反馈)

    类似于 CFB 模式,先对向量加密,加密结果与明文进行异或,同时作为下一个加密的向量;其解密过程则与加密过程

    CTR (Counter 整数计数器)

    CTR 模式通过加密一个连续的“计数器”来生成密钥块,计数器可以用任何方法来生成。由于这种特性,CTR 的加密可以并行执行。

    C# 代码:

    private void AesTest()
            {
                string key = @"MyAesKeyMyAesKeyMyAesKeyMyAesKey";
                byte[] keyByte = Encoding.ASCII.GetBytes(key);
                byte[] iv = new byte[16];
                byte[] encrypted;
                string message;
                using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
                {
                    aes.Mode = CipherMode.CBC;
                    aes.Key = keyByte;
                    aes.IV = iv;
                    ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
                    using (MemoryStream msEncrypt = new MemoryStream())
                    {
                        using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                        {
                            using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                            {
                                swEncrypt.Write(original);
                            }
                            encrypted = msEncrypt.ToArray();
                        }
                    }
    
                    ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
                    using (MemoryStream msDecrypt = new MemoryStream(encrypted))
                    {
                        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                            {
                                message = srDecrypt.ReadToEnd();
                            }
                        }
                    }
                }
            }
    View Code

    DES 与 AES 的用法基本相同,只是密码与向量的长度不一样。

  • 相关阅读:
    volatile 能使得一个非原子操作变成原子操作吗?
    什么是线程局部变量?
    使用idea插件进行java代码生成
    mybatis plus+dynamic事务导致多数据源切换失败
    10_docker-compose
    Ubuntu的Python从2.x升级到3.x
    idea查看控制台数据mybatis的sql完整语句
    iframe高度处理
    angular路由
    去掉iPhone、iPad的默认按钮、输入框样式
  • 原文地址:https://www.cnblogs.com/heimao233/p/10411520.html
Copyright © 2020-2023  润新知