加密算法之对称加密

 

一:简介

     对称加密采用单密钥加密方式,不论是加密还是解密都是用同一个密钥,即“一把钥匙开一把锁”。对称加密的好处在于操作简单、管理方便、速度快。它的缺点在于密钥在网络传输中容易被窃听,每个密钥只能应用一次,对密钥管理造成了困难。对称加密的实现形式和加密算法的公开性使它依赖于密钥的安全性,而不是算法的安全性。

二:引入加密类库 

using System.Security.Cryptography;  //包含所有加密任务的核心类
using System.Security.Cryptography.Xml; //包含结合使用System.Security.Cryptography类,对XML文档部分内容进行加密和签名的类
using System.Security.Cryptography.X509Certificates; //包含允许检索证书信息的类

三:对称密码算法

算 法

抽象算法类

默认实现类

有效密钥大小

默认密钥大小

DES

DES

DESCryptoServiceProvider

64位

64

TripleDES

TripleDES

TripleDESCryptoServiceProvider

 

128,192

192

RC2

RC2

RC2CryptoServiceProvider

 

40-128

128

Rijndael

Rijndael

RijndaelManaged

 

128,192,256

256

①DES:对称加密算法中最经典的算法莫过于DES加密算法。DES加密采用的是分组加密的方法,使用56位密钥加密64位明文,最后产生64位密文

②TripleDES:由于DES算法安全性方面的原因,为了提高DES算法的抗攻击性,因此提出了Triple-DES算法。用两个密钥对数据进行3次加密/解密运算。即首先使用第一个密钥对数据进行加密,然后用第二个密钥对其进行解密,最后用第一个密钥再加密

③RC2:该算法设计的目的是用来取代DES算法,它采用密钥长度可变的对明文采取64位分组的分组加密算法,属于Festel网络结构。

④Rijndael:是一个反复运算的加密算法,它允许可变动的数据区块及密钥的长度。数据区块与密钥长度的变动是各自独立的。

 

 属性

说明

BlockSize 

使用该算法在一次操作中可以加密或解密的数据基本单位。

Key 

用于加密或解密数据的秘密值。

KeySize 

分配给秘密密钥的位数。

IV 

初始化向量,提供加密过程额外输入并提高安全性,初始化向量与密钥一样,加密者和解密者都必须知道,不过,它不需要保密。

重点:IV的长度总是和BlockSize 数据块的长度一样!

LegalBlockSizes

获取对称算法支持的块大小。 

LegalKeySizes

获取对称算法支持的密钥大小。

四:栗子

①DES加密算法的使用。

从第一个表可以看到密码是64位,8位一个字节,转换成byte数组就是长度为8

          DES des = DES.Create();
                Encoding e = Encoding.UTF8;
                string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
                Console.WriteLine(str);
                var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");
      /// <summary>
        /// 加密
        /// </summary>
        /// <param name="des">算法</param>
        /// <param name="str">明文</param>
        /// <param name="e">编码</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns></returns>
        private string DesCryptor(DES des, string str, Encoding e, string key, string iv)
        {
            if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(key) || string.IsNullOrEmpty(iv))
                Console.WriteLine("参数不正确!");
            CryptoStream cs = null;
            Encoding ec = e ?? Encoding.Default;
            Byte[] StrBytes = ec.GetBytes(str);
            Byte[] KeyBytes = Encoding.ASCII.GetBytes(key);
            Byte[] IVBytes = Encoding.ASCII.GetBytes(iv);
            try
            {
                MemoryStream ms = new MemoryStream();
                cs = new CryptoStream(ms, des.CreateEncryptor(KeyBytes, IVBytes), CryptoStreamMode.Write);
                cs.Write(StrBytes, 0, StrBytes.Length);
                cs.FlushFinalBlock();
                return Convert.ToBase64String(ms.ToArray());
            }
            catch (CryptographicException ex)
            {
                throw new ArgumentException(ex.Message);
            }
            finally
            {
                cs?.Close();
            }
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="des">算法</param>
        /// <param name="str">密文</param>
        /// <param name="e">编码</param>
        /// <param name="key">秘钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns></returns>
        private object DESDecryptor(DES des, string str, Encoding e, string key, string iv)
        {
            if (string.IsNullOrEmpty(str)
       || string.IsNullOrEmpty(key)
       || string.IsNullOrEmpty(iv))
                throw new ArgumentNullException("参数不正确!");
            CryptoStream cs = null;
            Encoding ec = e ?? Encoding.Default;
            Byte[] StrBytes = Convert.FromBase64String(str);
            Byte[] KeyBytes = Encoding.ASCII.GetBytes(key);
            Byte[] IVBytes = Encoding.ASCII.GetBytes(iv);
            try
            {
                MemoryStream ms = new MemoryStream();
                cs = new CryptoStream(ms, des.CreateDecryptor(KeyBytes, IVBytes), CryptoStreamMode.Write);
                cs.Write(StrBytes, 0, StrBytes.Length);
                cs.FlushFinalBlock();
                return ec.GetString(ms.ToArray());
            }
            catch (CryptographicException ex)
            {
                throw new ArgumentException(ex.Message);
            }
            finally
            {
                cs?.Close();
            }
        }

②剩下的加密算法,只需要更换类名即可

TripleDES算法:

      TripleDES des = TripleDES.Create();
       Encoding e = Encoding.UTF8;
       string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
       Console.WriteLine(str);
       var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");

RC2算法:

     RC2 des = RC2.Create();
     Encoding e = Encoding.UTF8;
     string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
     Console.WriteLine(str);
     var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");

Rijndael算法:

     Rijndael des = Rijndael.Create();
     Encoding e = Encoding.UTF8;
     string str = DesCryptor(des, "讲文明树新风,北京朝阳区", e, "beijing8", "chaoyang");
     Console.WriteLine(str);
     var txt = DESDecryptor(des, str, e, "beijing8", "chaoyang");

参考来源:http://www.cnblogs.com/hailan2012/archive/2012/02/04/2338539.html

posted @ 2017-03-13 16:43  逍遥帝君  阅读(432)  评论(0编辑  收藏  举报