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 的用法基本相同,只是密码与向量的长度不一样。

原文地址:https://www.cnblogs.com/heimao233/p/10411520.html