zoukankan      html  css  js  c++  java
  • 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 的用法基本相同,只是密码与向量的长度不一样。

  • 相关阅读:
    轻松搭建CAS 5.x系列(7)-在CAS Server使用第三方帐号做认证
    轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
    轻松搭建CAS 5.x系列(5)-增加密码找回和密码修改功能
    CAS 5.x搭建常见问题系列(3).Failure to find org.apereo.cas:cas-server-support-pm-jdbc:jar:5.1.9
    CAS 5.x搭建常见问题系列(2).PKIX path building failed
    CAS 5.x搭建常见问题系列(1).未认证的授权服务
    轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版
    轻松搭建CAS 5.x系列文章
    CAS实现SSO单点登录-CAS Server 5.3搭建 cas5.3搭建 cas5.3去除https cas 去除https cas 5.x 去除https
    互联网大咖都要收藏的几个网站,纯干货
  • 原文地址:https://www.cnblogs.com/heimao233/p/10411520.html
Copyright © 2011-2022 走看看