zoukankan      html  css  js  c++  java
  • 加密算法之对称加密

    一:简介

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

    二:引入加密类库 

    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

  • 相关阅读:
    C# 直接选择排序(史上最清晰,最通俗)
    Hadoop单节点伪分布式环境部署
    Hive安装和部署andMySQL安装和部署
    Kafka集群部署
    HA Hadoop完全分布式环境部署
    HBase集群部署
    Flume整合Kafka
    Hadoop完全分布式环境部署
    JavaScript正则表达式语法
    什么无线路由器性价高?买什么路由器好?
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/6543607.html
Copyright © 2011-2022 走看看