精华内容
下载资源
问答
  • 常用数据加密和解密方法

    千次阅读 2018-07-17 13:54:07
    ASP.NET(C#)常用数据加密和解密方法汇总  一、数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 ...

    http://www.cnblogs.com/sunxuchu/p/5484018.html

    关键词:数据加密用哪种方式更好?

    ASP.NET(C#)常用数据加密和解密方法汇总 

    一、数据加密的概念

    1、  基本概念

    2、  基本功能

    3、  加密形式 

    二、 数据加密的项目应用和学习

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

    三、 数据加密的发展趋势 

    四、 网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书: 

    五、对称加密之DES加密和解密的讲解 

    六、 非对称加密之RSA加密和解密的讲解 

    七、 ASP.NET(C#) 常用加密类实例调用讲解

    ASP.NET(C#)常用数据加密和解密方法汇总 

      

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念 

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSIOpen System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用 

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

     

    三.加密技术发展趋势 

    私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类 

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题; 

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。 

    五、对称加密之DES加密与解密 

    一、  对称加密 

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    二、  加密解密过程 

     

    Figure 1. DES加密解密过程

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1 生成keyIV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

     

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
    byte[] keyArray = tDESalg.Key;
    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2 字符串明文转成某一代码页对应的编码字节流 

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding("utf-8");

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

     

    3 加密操作 

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流

    复制代码

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream mStream = new MemoryStream();
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream cStream = new CryptoStream(mStream,
            new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
            CryptoStreamMode.Write);
        // 将加密后的字节流写入到MemoryStream
        cStream.Write(plainTextArray, 0, plainTextArray.Length);
        //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
        cStream.FlushFinalBlock();
        // 把解密后的数据流转成字节流
        byte[] ret = mStream.ToArray();
        // 关闭两个streams.
        cStream.Close();
        mStream.Close();
        return ret;
    }

    复制代码

    4 解密操作 

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]

    复制代码

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);
    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)
    {
        // 建立一个MemoryStream,这里面存放加密后的数据流
        MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);
        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
        CryptoStream csDecrypt = new CryptoStream(msDecrypt,
            new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
            CryptoStreamMode.Read);
        // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
        byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];
        // 把解密后的数据读入到DecryptDataArray
        csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);
        msDecrypt.Close();
        csDecrypt.Close();
        return DecryptDataArray;
    }

    复制代码

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    "Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

    5 从编码字节流转成字符串明文 

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解 

          RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

      RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

      RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

     

    保密级别

    对称密钥长度(bit)

    RSA密钥长度(bit)

    ECC密钥长度(bit)

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

      RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

      RSA的算法涉及三个参数,n、e1、e2。

      其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

      e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

      (n及e1),(n及e2)就是密钥对。

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即:

      A=B^e2 mod n;B=A^e1 mod n;

     

    C#代码实现

    需引用using System.Security.Cryptography;

    复制代码

    /// <summary>
            /// RSA加密
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSAEncrypt(string publickey, string content)
            {
                publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(publickey);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
    
                return Convert.ToBase64String(cipherbytes);
            }
    
            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSADecrypt(string privatekey, string content)
            {
                privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(privatekey);
                cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
    
                return Encoding.UTF8.GetString(cipherbytes);
            }
    

    复制代码

    七、ASP.NET(C#)常用加密类调用的讲解

    1C#常用加密解密类库代码如下: 

    复制代码

    /// <summary>
          /// MD5 加密静态方法
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <returns>returns</returns>
          public static string MD5Encrypt(string EncryptString)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              MD5 m_ClassMD5 = new MD5CryptoServiceProvider();
              string m_strEncrypt = "";
              try
              {
                  m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");
              }
             catch (ArgumentException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
              finally { m_ClassMD5.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="EncryptString">待加密的密文</param>
          /// <param name="EncryptKey">加密的密钥</param>
          /// <returns>returns</returns>
          public static string DESEncrypt(string EncryptString, string EncryptKey)
          {
              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
              if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
              string m_strEncrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
              try
              {
                  byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                  MemoryStream m_stream = new MemoryStream();
                  CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                  m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                  m_cstream.FlushFinalBlock();
                  m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                  m_stream.Close(); m_stream.Dispose();
                  m_cstream.Close(); m_cstream.Dispose();
              }
              catch (IOException ex) { throw ex; }
              catch (CryptographicException ex) { throw ex; }
              catch (ArgumentException ex) { throw ex; }
              catch (Exception ex) { throw ex; }
              finally { m_DESProvider.Clear(); }
              return m_strEncrypt;
          }
    
          /// <summary>
          /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)
          /// </summary>
          /// <param name="DecryptString">待解密的密文</param>
          /// <param name="DecryptKey">解密的密钥</param>
          /// <returns>returns</returns>
          public static string DESDecrypt(string DecryptString, string DecryptKey)
          {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
              if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
              if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
             try
            {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_DESProvider.Clear(); }
             return m_strDecrypt;
         }
         /// <summary>
         /// RC2 加密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Encrypt(string EncryptString, string EncryptKey)
         {
             if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             string m_strEncrypt = "";
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
             try
            {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_RC2Provider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// RC2 解密(用变长密钥对大量数据进行加密)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns>returns</returns>
         public static string RC2Decrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
            if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
             string m_strDecrypt = "";
             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
            try
            {
                byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
                 m_cstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_cstream.Close(); m_cstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
            catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
            finally { m_RC2Provider.Clear(); }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey1">密钥一</param>
         /// <param name="EncryptKey2">密钥二</param>
        /// <param name="EncryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)
         {
             string m_strEncrypt = "";
             try
             {
                 m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);
                 m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);
                m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);
             }
             catch (Exception ex) { throw ex; }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey1">密钥一</param>
         /// <param name="DecryptKey2">密钥二</param>
         /// <param name="DecryptKey3">密钥三</param>
         /// <returns>returns</returns>
         public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)
         {
             string m_strDecrypt = "";
             try
             {
                m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);
                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);
             }
             catch (Exception ex) { throw ex; }
             return m_strDecrypt;
         }
    
         /// <summary>
         /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="EncryptString">待加密密文</param>
         /// <param name="EncryptKey">加密密钥</param>
        /// <returns></returns>
        public static string AESEncrypt(string EncryptString, string EncryptKey)
         {
            if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strEncrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();
                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strEncrypt;
         }
    
         /// <summary>
         /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
         /// </summary>
         /// <param name="DecryptString">待解密密文</param>
         /// <param name="DecryptKey">解密密钥</param>
         /// <returns></returns>
         public static string AESDecrypt(string DecryptString, string DecryptKey)
         {
             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
             string m_strDecrypt = "";
             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
             Rijndael m_AESProvider = Rijndael.Create();
             try
             {
                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
                 MemoryStream m_stream = new MemoryStream();
                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
                 m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();
                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
                 m_stream.Close(); m_stream.Dispose();
                 m_csstream.Close(); m_csstream.Dispose();
             }
             catch (IOException ex) { throw ex; }
             catch (CryptographicException ex) { throw ex; }
             catch (ArgumentException ex) { throw ex; }
             catch (Exception ex) { throw ex; }
             finally { m_AESProvider.Clear(); }
             return m_strDecrypt;
         }

    复制代码

    2、数据加密和解密简单代码调用如下: 

    Response.Write("<br>-----------MD5加密---------------<br>");        

    Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
    Response.Write("<br>-----------DES加密---------------<br>");        

    Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));        

    Response.Write("<br>-----------DES解密---------------<br>");        

    Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
    Response.Write("<br>-----------AES加密---------------<br>");    

    Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));        

    Response.Write("<br>-----------AES解密---------------<br>");        

    Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));

    3、数据加密和解密调用后运行效果图如下: 

    为系统而生,为框架而死,为debug奋斗一辈子; 吃符号的亏,上大小写的当,最后死在需求上。

    展开全文
  • 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。 一、加密的基本概念 “加密”,是一种...

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念

    “加密”,是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用

    1、 媒体加密:DRM

    2、 文件加密:文本加密、pdf、word

    3、 数据加密:ASP.NET(C#)中的数据加密

    4、 硬件加密:加密狗

    三.加密技术发展趋势

    ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题;

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。

    五、对称加密之DES加密与解密

    1、 对称加密

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    2、 加密解密过程

    Figure 1. DES加密解密过程

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1、 生成key和IV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
    byte[] keyArray = tDESalg.Key;
    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2、 字符串明文转成某一代码页对应的编码字节流

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = “Here is some data to encrypt. 这里是一些要加密的数据。”;

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding(“utf-8”);

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

    3、 加密操作

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流
    复制代码

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);
    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)
    {
    // 建立一个MemoryStream,这里面存放加密后的数据流
    MemoryStream mStream = new MemoryStream();
    // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
    CryptoStream cStream = new CryptoStream(mStream,
    new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
    CryptoStreamMode.Write);
    // 将加密后的字节流写入到MemoryStream
    cStream.Write(plainTextArray, 0, plainTextArray.Length);
    //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区
    cStream.FlushFinalBlock();
    // 把解密后的数据流转成字节流
    byte[] ret = mStream.ToArray();
    // 关闭两个streams.
    cStream.Close();
    mStream.Close();
    return ret;
    }

    复制代码

    4、 解密操作

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]
    复制代码

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);
    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)
    {
    // 建立一个MemoryStream,这里面存放加密后的数据流
    MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);
    // 使用MemoryStream 和key、IV新建一个CryptoStream 对象
    CryptoStream csDecrypt = new CryptoStream(msDecrypt,
    new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
    CryptoStreamMode.Read);
    // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]
    byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];
    // 把解密后的数据读入到DecryptDataArray
    csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);
    msDecrypt.Close();
    csDecrypt.Close();
    return DecryptDataArray;
    }

    复制代码

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    “Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0”

    5、 从编码字节流转成字符串明文

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解

      RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。
    

    RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

    RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

    保密级别

    对称密钥长度(bit)

    RSA密钥长度(bit)

    ECC密钥长度(bit)

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

    这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

    RSA的算法涉及三个参数,n、e1、e2。

    其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

    e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)(q-1)互质;再选择e2,要求(e2e1)mod((p-1)*(q-1))=1。

    (n及e1),(n及e2)就是密钥对。

    RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

    e1和e2可以互换使用,即:

    A=B^e2 mod n;B=A^e1 mod n;

    C#代码实现

    需引用using System.Security.Cryptography;
    复制代码

    ///
    /// RSA加密
    ///
    ///
    ///
    ///
    public static string RSAEncrypt(string publickey, string content)
    {
    publickey = @“5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=AQAB”;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
    byte[] cipherbytes;
    rsa.FromXmlString(publickey);
    cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);

            return Convert.ToBase64String(cipherbytes);
        }
    
        /// <summary>
        /// RSA解密
        /// </summary>
        /// <param name="privatekey"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public static string RSADecrypt(string privatekey, string content)
        {
            privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            byte[] cipherbytes;
            rsa.FromXmlString(privatekey);
            cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
    
            return Encoding.UTF8.GetString(cipherbytes);
        }
    

    复制代码

    七、ASP.NET(C#)常用加密类调用的讲解

    1、C#常用加密解密类库代码如下:
    复制代码

    ///
    /// MD5 加密静态方法
    ///
    /// 待加密的密文
    /// returns
    public static string MD5Encrypt(string EncryptString)
    {
    if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception(“密文不得为空”)); }
    MD5 m_ClassMD5 = new MD5CryptoServiceProvider();
    string m_strEncrypt = “”;
    try
    {
    m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", “”);
    }
    catch (ArgumentException ex) { throw ex; }
    catch (CryptographicException ex) { throw ex; }
    catch (Exception ex) { throw ex; }
    finally { m_ClassMD5.Clear(); }
    return m_strEncrypt;
    }

      /// <summary>
      /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)
      /// </summary>
      /// <param name="EncryptString">待加密的密文</param>
      /// <param name="EncryptKey">加密的密钥</param>
      /// <returns>returns</returns>
      public static string DESEncrypt(string EncryptString, string EncryptKey)
      {
          if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
          if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
          if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
          byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
          string m_strEncrypt = "";
         DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
          try
          {
              byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
              MemoryStream m_stream = new MemoryStream();
              CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
              m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
              m_cstream.FlushFinalBlock();
              m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
              m_stream.Close(); m_stream.Dispose();
              m_cstream.Close(); m_cstream.Dispose();
          }
          catch (IOException ex) { throw ex; }
          catch (CryptographicException ex) { throw ex; }
          catch (ArgumentException ex) { throw ex; }
          catch (Exception ex) { throw ex; }
          finally { m_DESProvider.Clear(); }
          return m_strEncrypt;
      }
    
      /// <summary>
      /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)
      /// </summary>
      /// <param name="DecryptString">待解密的密文</param>
      /// <param name="DecryptKey">解密的密钥</param>
      /// <returns>returns</returns>
      public static string DESDecrypt(string DecryptString, string DecryptKey)
      {
         if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
          if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
          if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }
          byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
         string m_strDecrypt = "";
         DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();
         try
        {
             byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
             MemoryStream m_stream = new MemoryStream();
             CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
             m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
             m_cstream.FlushFinalBlock();
             m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
             m_stream.Close(); m_stream.Dispose();
             m_cstream.Close(); m_cstream.Dispose();
         }
         catch (IOException ex) { throw ex; }
         catch (CryptographicException ex) { throw ex; }
         catch (ArgumentException ex) { throw ex; }
         catch (Exception ex) { throw ex; }
         finally { m_DESProvider.Clear(); }
         return m_strDecrypt;
     }
     /// <summary>
     /// RC2 加密(用变长密钥对大量数据进行加密)
     /// </summary>
     /// <param name="EncryptString">待加密密文</param>
     /// <param name="EncryptKey">加密密钥</param>
     /// <returns>returns</returns>
     public static string RC2Encrypt(string EncryptString, string EncryptKey)
     {
         if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
         if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
         if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
         string m_strEncrypt = "";
         byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
         RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
         try
        {
             byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
             MemoryStream m_stream = new MemoryStream();
             CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
             m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);
             m_cstream.FlushFinalBlock();
             m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
             m_stream.Close(); m_stream.Dispose();
            m_cstream.Close(); m_cstream.Dispose();
         }
         catch (IOException ex) { throw ex; }
         catch (CryptographicException ex) { throw ex; }
         catch (ArgumentException ex) { throw ex; }
         catch (Exception ex) { throw ex; }
         finally { m_RC2Provider.Clear(); }
         return m_strEncrypt;
     }
    
     /// <summary>
     /// RC2 解密(用变长密钥对大量数据进行加密)
     /// </summary>
     /// <param name="DecryptString">待解密密文</param>
     /// <param name="DecryptKey">解密密钥</param>
     /// <returns>returns</returns>
     public static string RC2Decrypt(string DecryptString, string DecryptKey)
     {
         if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
         if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
        if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }
         byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
         string m_strDecrypt = "";
         RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();
        try
        {
            byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
             MemoryStream m_stream = new MemoryStream();
             CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
             m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);
             m_cstream.FlushFinalBlock();
             m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
             m_stream.Close(); m_stream.Dispose();
             m_cstream.Close(); m_cstream.Dispose();
         }
         catch (IOException ex) { throw ex; }
        catch (CryptographicException ex) { throw ex; }
         catch (ArgumentException ex) { throw ex; }
         catch (Exception ex) { throw ex; }
        finally { m_RC2Provider.Clear(); }
         return m_strDecrypt;
     }
    
     /// <summary>
     /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
     /// </summary>
     /// <param name="EncryptString">待加密密文</param>
     /// <param name="EncryptKey1">密钥一</param>
     /// <param name="EncryptKey2">密钥二</param>
    /// <param name="EncryptKey3">密钥三</param>
     /// <returns>returns</returns>
     public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)
     {
         string m_strEncrypt = "";
         try
         {
             m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);
             m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);
            m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);
         }
         catch (Exception ex) { throw ex; }
         return m_strEncrypt;
     }
    
     /// <summary>
     /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)
     /// </summary>
     /// <param name="DecryptString">待解密密文</param>
     /// <param name="DecryptKey1">密钥一</param>
     /// <param name="DecryptKey2">密钥二</param>
     /// <param name="DecryptKey3">密钥三</param>
     /// <returns>returns</returns>
     public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)
     {
         string m_strDecrypt = "";
         try
         {
            m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);
             m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);
             m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);
         }
         catch (Exception ex) { throw ex; }
         return m_strDecrypt;
     }
    
     /// <summary>
     /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
     /// </summary>
     /// <param name="EncryptString">待加密密文</param>
     /// <param name="EncryptKey">加密密钥</param>
    /// <returns></returns>
    public static string AESEncrypt(string EncryptString, string EncryptKey)
     {
        if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }
         if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
         string m_strEncrypt = "";
         byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
         Rijndael m_AESProvider = Rijndael.Create();
         try
         {
             byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);
             MemoryStream m_stream = new MemoryStream();
             CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);
             m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();
             m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());
             m_stream.Close(); m_stream.Dispose();
             m_csstream.Close(); m_csstream.Dispose();
         }
         catch (IOException ex) { throw ex; }
         catch (CryptographicException ex) { throw ex; }
         catch (ArgumentException ex) { throw ex; }
         catch (Exception ex) { throw ex; }
         finally { m_AESProvider.Clear(); }
         return m_strEncrypt;
     }
    
     /// <summary>
     /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
     /// </summary>
     /// <param name="DecryptString">待解密密文</param>
     /// <param name="DecryptKey">解密密钥</param>
     /// <returns></returns>
     public static string AESDecrypt(string DecryptString, string DecryptKey)
     {
         if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }
         if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
         string m_strDecrypt = "";
         byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
         Rijndael m_AESProvider = Rijndael.Create();
         try
         {
             byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);
             MemoryStream m_stream = new MemoryStream();
             CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);
             m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();
             m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());
             m_stream.Close(); m_stream.Dispose();
             m_csstream.Close(); m_csstream.Dispose();
         }
         catch (IOException ex) { throw ex; }
         catch (CryptographicException ex) { throw ex; }
         catch (ArgumentException ex) { throw ex; }
         catch (Exception ex) { throw ex; }
         finally { m_AESProvider.Clear(); }
         return m_strDecrypt;
     }
    

    复制代码

    2、数据加密和解密简单代码调用如下:

    Response.Write("
    -----------MD5加密---------------
    ");

    Response.Write(SDKSecurity.MD5Encrypt(“仰天一笑”));
    Response.Write("
    -----------DES加密---------------
    ");

    Response.Write(SDKSecurity.DESEncrypt(“仰天一笑”, “anson-xu”));

    Response.Write("
    -----------DES解密---------------
    ");

    Response.Write(SDKSecurity.DESDecrypt(“l06JvJ45r/lb9iKzSXl47Q==”, “anson-xu”));
    Response.Write("
    -----------AES加密---------------
    ");

    Response.Write(SDKSecurity.AESEncrypt(“仰天一笑”, “ansonxuyu”));

    Response.Write("
    -----------AES解密---------------
    ");

    Response.Write(SDKSecurity.AESDecrypt(“avwKL+MO8+zoLHvzk0+TBA==”, “ansonxuyu”));

    3、数据加密和解密调用后运行效果图如下:

    注:本篇为转载的文章!

    展开全文
  • ASP.NET(C#)常用数据加密和解密方法

    千次阅读 2017-02-09 09:40:27
    ASP.NET(C#)常用数据加密和解密方法汇总  一、 数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 数据...
    
    ASP.NET(C#)常用数据加密和解密方法汇总 

    一、            数据加密的概念

    1、  基本概念

    2、  基本功能

    3、  加密形式 

    二、            数据加密的项目应用和学习

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

    三、            数据加密的发展趋势 

    四、            网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书: 

    五、            对称加密之DES加密和解密的讲解 

    六、            非对称加密之RSA加密和解密的讲解 

    七、            ASP.NET(C#) 常用加密类实例调用讲解及免费下载( 源代码免费下载点击此处>> )

     

    ASP.NET(C#)常用数据加密和解密方法汇总 

      

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念 

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用 

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

     

    三.加密技术发展趋势 

    ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类 

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题; 

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。 

    五、对称加密之DES加密与解密 

    一、  对称加密 

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    二、  加密解密过程 


    Figure 1. DES加密解密过程

     

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1、 生成key和IV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

     

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

    byte[] keyArray = tDESalg.Key;

    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2、 字符串明文转成某一代码页对应的编码字节流 

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding("utf-8");

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

     

    3、 加密操作 

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)

    {

        // 建立一个MemoryStream,这里面存放加密后的数据流

        MemoryStream mStream = new MemoryStream();

        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象

        CryptoStream cStream = new CryptoStream(mStream,

            new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),

            CryptoStreamMode.Write);

        // 将加密后的字节流写入到MemoryStream

        cStream.Write(plainTextArray, 0, plainTextArray.Length);

        //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区

        cStream.FlushFinalBlock();

        // 把解密后的数据流转成字节流

        byte[] ret = mStream.ToArray();

        // 关闭两个streams.

        cStream.Close();

        mStream.Close();

        return ret;

    }

    4、 解密操作 

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);

    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)

    {

        // 建立一个MemoryStream,这里面存放加密后的数据流

        MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);

        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象

        CryptoStream csDecrypt = new CryptoStream(msDecrypt,

            new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),

            CryptoStreamMode.Read);

        // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]

        byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];

        // 把解密后的数据读入到DecryptDataArray

        csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);

        msDecrypt.Close();

        csDecrypt.Close();

        return DecryptDataArray;

    }

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    "Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

    5、 从编码字节流转成字符串明文 

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解 

          RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

      RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

      RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

     

    保密级别

    对称密钥长度(bit)

    RSA密钥长度(bit)

    ECC密钥长度(bit)

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

      RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

      RSA的算法涉及三个参数,n、e1、e2。

      其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

      e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

      (n及e1),(n及e2)就是密钥对。

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即:

      A=B^e2 mod n;B=A^e1 mod n;

     

    C#代码实现

    需引用using System.Security.Cryptography;

    /// <summary>
            /// RSA加密
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSAEncrypt(string publickey, string content)
            {
                publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(publickey);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);

                return Convert.ToBase64String(cipherbytes);
            }

            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSADecrypt(string privatekey, string content)
            {
                privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(privatekey);
                cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);

                return Encoding.UTF8.GetString(cipherbytes);
            }

     

     

     

    七、ASP.NET(C#)常用加密类调用的讲解

    1、C#常用加密解密类库代码如下: 

    /// <summary>

          /// MD5 加密静态方法

          /// </summary>

          /// <param name="EncryptString">待加密的密文</param>

          /// <returns>returns</returns>

          public static string MD5Encrypt(string EncryptString)

          {

              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

              MD5 m_ClassMD5 = new MD5CryptoServiceProvider();

     

              string m_strEncrypt = "";

     

              try

              {

                  m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");

              }

             catch (ArgumentException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

              finally { m_ClassMD5.Clear(); }

     

              return m_strEncrypt;

          }

     

          /// <summary>

          /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)

          /// </summary>

          /// <param name="EncryptString">待加密的密文</param>

          /// <param name="EncryptKey">加密的密钥</param>

          /// <returns>returns</returns>

          public static string DESEncrypt(string EncryptString, string EncryptKey)

          {

              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

              if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

              if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }

     

              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

              string m_strEncrypt = "";

     

             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();

     

              try

              {

                  byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                  MemoryStream m_stream = new MemoryStream();

     

                  CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                  m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);

     

                  m_cstream.FlushFinalBlock();

     

                  m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                  m_stream.Close(); m_stream.Dispose();

     

                  m_cstream.Close(); m_cstream.Dispose();

              }

              catch (IOException ex) { throw ex; }

              catch (CryptographicException ex) { throw ex; }

              catch (ArgumentException ex) { throw ex; }

              catch (Exception ex) { throw ex; }

              finally { m_DESProvider.Clear(); }

     

              return m_strEncrypt;

          }

          /// <summary>

          /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)

          /// </summary>

          /// <param name="DecryptString">待解密的密文</param>

          /// <param name="DecryptKey">解密的密钥</param>

          /// <returns>returns</returns>

          public static string DESDecrypt(string DecryptString, string DecryptKey)

          {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

              if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

              if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }

     

              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             string m_strDecrypt = "";

     

             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();

     

             try

            {

                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_DESProvider.Clear(); }

     

             return m_strDecrypt;

         }

         /// <summary>

         /// RC2 加密(用变长密钥对大量数据进行加密)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey">加密密钥</param>

         /// <returns>returns</returns>

         public static string RC2Encrypt(string EncryptString, string EncryptKey)

         {

             if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

             if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }

     

             string m_strEncrypt = "";

     

             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();

     

             try

            {

                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_RC2Provider.Clear(); }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// RC2 解密(用变长密钥对大量数据进行加密)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey">解密密钥</param>

         /// <returns>returns</returns>

         public static string RC2Decrypt(string DecryptString, string DecryptKey)

         {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

            if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }

     

             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             string m_strDecrypt = "";

     

             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();

     

            try

            {

                byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

            catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

            finally { m_RC2Provider.Clear(); }

             return m_strDecrypt;

         }

         /// <summary>

         /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey1">密钥一</param>

         /// <param name="EncryptKey2">密钥二</param>

        /// <param name="EncryptKey3">密钥三</param>

         /// <returns>returns</returns>

         public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)

         {

             string m_strEncrypt = "";

     

             try

             {

                 m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);

     

                 m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);

     

                m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);

             }

             catch (Exception ex) { throw ex; }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey1">密钥一</param>

         /// <param name="DecryptKey2">密钥二</param>

         /// <param name="DecryptKey3">密钥三</param>

         /// <returns>returns</returns>

         public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)

         {

             string m_strDecrypt = "";

     

             try

             {

                m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);

     

                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);

     

                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);

             }

             catch (Exception ex) { throw ex; }

     

             return m_strDecrypt;

         }

         /// <summary>

         /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey">加密密钥</param>

        /// <returns></returns>

        public static string AESEncrypt(string EncryptString, string EncryptKey)

         {

            if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

             string m_strEncrypt = "";

     

             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

     

             Rijndael m_AESProvider = Rijndael.Create();

     

             try

             {

                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();

     

                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_csstream.Close(); m_csstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_AESProvider.Clear(); }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey">解密密钥</param>

         /// <returns></returns>

         public static string AESDecrypt(string DecryptString, string DecryptKey)

         {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

             string m_strDecrypt = "";

     

             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

     

             Rijndael m_AESProvider = Rijndael.Create();

     

             try

             {

                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_csstream.Close(); m_csstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_AESProvider.Clear(); }

     

             return m_strDecrypt;

         }

    2、数据加密和解密简单代码调用如下: 

    Response.Write("<br>-----------MD5加密---------------<br>");        

    Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
    Response.Write("<br>-----------DES加密---------------<br>");        

    Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));        

    Response.Write("<br>-----------DES解密---------------<br>");        

    Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
    Response.Write("<br>-----------AES加密---------------<br>");    

    Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));        

    Response.Write("<br>-----------AES解密---------------<br>");        

    Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));

    3、数据加密和解密调用后运行效果图如下:

    展开全文
  • 常用数据加密和解密方法汇总

    万次阅读 2015-06-18 15:35:48
    ASP.NET(C#)常用数据加密和解密方法汇总  一、 数据加密的概念 1、 基本概念 2、 基本功能 3、 加密形式  二、 数据加密的项目应用和学习 1、 媒体加密:DRM 2、 文件加密:文本加密、pdf、word 3、 数据...

    ASP.NET(C#)常用数据加密和解密方法汇总 

    一、            数据加密的概念

    1、  基本概念

    2、  基本功能

    3、  加密形式 

    二、            数据加密的项目应用和学习

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

    三、            数据加密的发展趋势 

    四、            网络数据加密算法分类

    1、  根本不考虑解密问题:MD5、

    2、  私用密钥加密:DES、AES

    3、  公用密钥加密:RSA

    4、  数字证书: 

    五、            对称加密之DES加密和解密的讲解 

    六、            非对称加密之RSA加密和解密的讲解 

    七、            ASP.NET(C#) 常用加密类实例调用讲解及免费下载( 源代码免费下载点击此处>> )

     

    ASP.NET(C#)常用数据加密和解密方法汇总 

      

    数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。

    一、加密的基本概念 

    "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。

    加密的基本功能包括:

    1. 防止不速之客查看机密的数据文件;

    2. 防止机密数据被泄露或篡改;

    3. 防止特权用户(如系统管理员)查看私人数据文件;

    4. 使入侵者不能轻易地查找一个系统的文件。

    数据加密是确保计算机网络安全的一种重要机制,虽然由于成本、技术和管理上的复杂性等原因,目前尚未在网络中普及,但数据加密的确是实现分布式系统和网络环境下数据安全的重要手段之一。

    数据加密可在网络OSI七层协议(OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。)的多层上实现、所以从加密技术应用的逻辑位置看,有三种方式:

    ①链路加密:通常把网络层以下的加密叫链路加密,主要用于保护通信节点间传输的数据,加解密由置于线路上的密码设备实现。根据传递的数据的同步方式又可分为同步通信加密和异步通信加密两种,同步通信加密又包含字节同步通信加密和位同步通信加密。

    ②节点加密:是对链路加密的改进。在协议传输层上进行加密,主要是对源节点和目标节点之间传输数据进行加密保护,与链路加密类似.只是加密算法要结合在依附于节点的加密模件中,克服了链路加密在节点处易遭非法存取的缺点。

    ③端对端加密:网络层以上的加密称为端对端加密。是面向网络层主体。对应用层的数据信息进行加密,易于用软件实现,且成本低,但密钥管理问题困难,主要适合大型网络系统中信息在多个发方和收方之间传输的情况。

    二、数据加密的应用 

    1、  媒体加密:DRM

    2、  文件加密:文本加密、pdf、word

    3、  数据加密:ASP.NET(C#)中的数据加密

    4、  硬件加密:加密狗

     

    三.加密技术发展趋势 

    ①私用密钥加密技术与公开密钥加密技术相结合:鉴于两种密码体制加密的特点,在实际应用中可以采用折衷方案,即结合使用DES/IDEA和RSA,以DES为"内核",RSA为"外壳",对于网络中传输的数据可用DES或IDEA加密,而加密用的密钥则用RSA加密传送,此种方法既保证了数据安全又提高了加密和解密的速度,这也是目前加密技术发展的新方向之一。

    ②寻求新算法:跳出以常见的迭代为基础的构造思路,脱离基于某些数学问题复杂性的构造方法。如刘尊全先生提出的刘氏算法,是一种基于密钥的公开密钥体制,它采用了随机性原理构造加解密变换,并将其全部运算控制隐匿于密钥中,密钥长度可变。它是采用选取一定长度的分割来构造大的搜索空间,从而实现一次非线性变换。此种加密算法加密强度高、速度快、计算开销低。

    ③加密最终将被集成到系统和网络中,例如IPV6协议就已有了内置加密的支持,在硬件方面,Intel公司正研制一种加密协处理器。它可以集成到微机的主极上。

    四、加密技术的分类 

    加密类型可以简单地分为四种:

    1. 根本不考虑解密问题; 

    2. 私用密钥加密技术:对称式加密(Symmetric Key Encryption):对称式加密方式对加密和解密使用相同的密钥。通常,这种加密方式在应用中难以实施,因为用同一种安全方式共享密钥很难。如:RC4、RC2、DES 和 AES 系列加密算法。

    3. 公开密钥加密技术:非对称密钥加密(Asymmetric Key Encryption):非对称密钥加密使用一组公共/私人密钥系统,加密时使用一种密钥,解密时使用另一种密钥。公共密钥可以广泛的共享和透露。当需要用加密方式向服务器外部传送数据时,这种加密方式更方便。如: RSA

    4. 数字证书。(Certificate):数字证书是一种非对称密钥加密,但是,一个组织可以使用证书并通过数字签名将一组公钥和私钥与其拥有者相关联。 

    五、对称加密之DES加密与解密 

    一、  对称加密 

    对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密。

    单钥密码系统的安全性依赖于以下两个因素:

    第一、加密算法必须是足够强的,仅仅基于密文本身去解密信息在实践上是不可能的。

    第二、加密方法的安全性依赖于密钥的秘密性,而不是算法的秘密性,因此,我们没有必要确保算法的秘密性(事实上,现实中使用的很多单钥密码系统的算法都是公开的),但是我们一定要保证密钥的秘密性。

    DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。

    DES和TripleDES基本算法一致,只是TripleDES算法提供的key位数更多,加密可靠性更高。

    DES使用的密钥key为8字节,初始向量IV也是8字节。

    TripleDES使用24字节的key,初始向量IV也是8字节。

    两种算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。

    二、  加密解密过程 


    Figure 1. DES加密解密过程

     

    上图是整个DES和TripleDES算法的加密解密过程,下面以TripleDES为例,结合dotnet分析加密解密的各个步骤,并给出相关实现代码。

    1、 生成key和IV

    System.Security.Cryptography. TripleDESCryptoServiceProvider类是dotnet中实现TripleDES算法的主要的类。

    TripleDESCryptoServiceProvider类只有一个构造方法TripleDESCryptoServiceProvider(),这个方法把一些属性初始化:

    KeySize(加密密钥长度,以位为单位)= 192(24字节)

    BlockSize(加密处理的数据块大小,以位为单位)= 64(8字节)

    FeedbackSize(加密数据块后返回的数据大小,以位为单位)= 64(8字节)

     

    TripleDESCryptoServiceProvider构造方法同时会初始化一组随机的key和IV。

    默认的TripleDESCryptoServiceProvider的key为24字节,IV为8字节,加密数据块为8字节。

    生成key和IV的代码很简单:

    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

    byte[] keyArray = tDESalg.Key;

    byte[] IVArray = tDESalg.IV;

    生成的key和IV在加密过程和解密过程都要使用。

    2、 字符串明文转成某一代码页对应的编码字节流 

    待加密的数据可能有两种形式,一种是二进制的数据,本身就是一组字节流,这样的数据可以跳过这一步,直接进入加密步骤。还有一种情况是字符串数据,字符串中同样的字符使用不同的代码页会生成不同的字节码,所以从字符串到字节流的转换是需要指定使用何种编码的。在解密之后,要从字节流转换到字符串就要使用相同的代码页解码,否则就会出现乱码。

    // 待加密的字符串

    string plainTextString = "Here is some data to encrypt. 这里是一些要加密的数据。";

    // 使用utf-8编码(也可以使用其它的编码)

    Encoding sEncoding = Encoding.GetEncoding("utf-8");

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

     

    3、 加密操作 

    加密的原料是明文字节流,TripleDES算法对字节流进行加密,返回的是加密后的字节流。同时要给定加密使用的key和IV。

    // 把字符串明文转换成utf-8编码的字节流

    byte[] plainTextArray = sEncoding.GetBytes(plainTextString);

    public static byte[] EncryptString(byte[] plainTextArray, byte[] Key, byte[] IV)

    {

        // 建立一个MemoryStream,这里面存放加密后的数据流

        MemoryStream mStream = new MemoryStream();

        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象

        CryptoStream cStream = new CryptoStream(mStream,

            new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),

            CryptoStreamMode.Write);

        // 将加密后的字节流写入到MemoryStream

        cStream.Write(plainTextArray, 0, plainTextArray.Length);

        //把缓冲区中的最后状态更新到MemoryStream,并清除cStream的缓存区

        cStream.FlushFinalBlock();

        // 把解密后的数据流转成字节流

        byte[] ret = mStream.ToArray();

        // 关闭两个streams.

        cStream.Close();

        mStream.Close();

        return ret;

    }

    4、 解密操作 

    解密操作解密上面步骤生成的密文byte[],需要使用到加密步骤使用的同一组Key和IV。

    // 调用解密方法,返回已解密数据的byte[]

    byte[] finalPlainTextArray = DecryptTextFromMemory(Data, keyArray, IVArray);

    public static byte[] DecryptTextFromMemory(byte[] EncryptedDataArray, byte[] Key, byte[] IV)

    {

        // 建立一个MemoryStream,这里面存放加密后的数据流

        MemoryStream msDecrypt = new MemoryStream(EncryptedDataArray);

        // 使用MemoryStream 和key、IV新建一个CryptoStream 对象

        CryptoStream csDecrypt = new CryptoStream(msDecrypt,

            new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),

            CryptoStreamMode.Read);

        // 根据密文byte[]的长度(可能比加密前的明文长),新建一个存放解密后明文的byte[]

        byte[] DecryptDataArray = new byte[EncryptedDataArray.Length];

        // 把解密后的数据读入到DecryptDataArray

        csDecrypt.Read(DecryptDataArray, 0, DecryptDataArray.Length);

        msDecrypt.Close();

        csDecrypt.Close();

        return DecryptDataArray;

    }

    有一点需要注意,DES加密是以数据块为单位加密的,8个字节一个数据块,如果待加密明byte[]的长度不是8字节的整数倍,算法先用值为“0”的byte补足8个字节,然后进行加密。所以加密后的密文长度一定是8的整数倍。这样的密文解密后如果补了0值的byte,则解密后这些0值的byte依然存在。比如上例中要加密的明文是:

    “Here is some data to encrypt. 这里是一些要加密的数据。”

    转成明文byte[]后是66个字节,DES算法就会补上6个0值的byte,补到72个字节。这样加密后再解密回来的密文byte[]解码后的字符串就是这样的:

    "Here is some data to encrypt. 这里是一些要加密的数据。\0\0\0\0\0\0"

    5、 从编码字节流转成字符串明文 

    // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串

    plainTextString = sEncoding.GetString(finalPlainTextArray);

    六、非对称加密之RSA加密和解密的讲解 

          RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

      RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

      RSA的缺点主要有:

    A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

    B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

    长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

     

    保密级别

    对称密钥长度(bit

    RSA密钥长度(bit

    ECC密钥长度(bit

    保密年限

    80

    80

    1024

    160

    2010

    112

    112

    2048

    224

    2030

    128

    128

    3072

    256

    2040

    192

    192

    7680

    384

    2080

    256

    256

    15360

    512

    2120

     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

      RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

      RSA的算法涉及三个参数,n、e1、e2。

      其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

      e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

      (n及e1),(n及e2)就是密钥对。

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即:

      A=B^e2 mod n;B=A^e1 mod n;

     

    C#代码实现

    需引用using System.Security.Cryptography;

    /// <summary>
            /// RSA加密
            /// </summary>
            /// <param name="publickey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSAEncrypt(string publickey, string content)
            {
                publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(publickey);
                cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);

                return Convert.ToBase64String(cipherbytes);
            }

            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RSADecrypt(string privatekey, string content)
            {
                privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(privatekey);
                cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);

                return Encoding.UTF8.GetString(cipherbytes);
            }

     

     

     

    七、ASP.NET(C#)常用加密类调用的讲解


    1、C#常用加密解密类库代码如下: 

    /// <summary>

          /// MD5 加密静态方法

          /// </summary>

          /// <param name="EncryptString">待加密的密文</param>

          /// <returns>returns</returns>

          public static string MD5Encrypt(string EncryptString)

          {

              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

              MD5 m_ClassMD5 = new MD5CryptoServiceProvider();

     

              string m_strEncrypt = "";

     

              try

              {

                  m_strEncrypt = BitConverter.ToString(m_ClassMD5.ComputeHash(Encoding.Default.GetBytes(EncryptString))).Replace("-", "");

              }

             catch (ArgumentException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

              finally { m_ClassMD5.Clear(); }

     

              return m_strEncrypt;

          }

     

          /// <summary>

          /// DES 加密(数据加密标准,速度较快,适用于加密大量数据的场合)

          /// </summary>

          /// <param name="EncryptString">待加密的密文</param>

          /// <param name="EncryptKey">加密的密钥</param>

          /// <returns>returns</returns>

          public static string DESEncrypt(string EncryptString, string EncryptKey)

          {

              if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

              if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

              if (EncryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }

     

              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

              string m_strEncrypt = "";

     

             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();

     

              try

              {

                  byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                  MemoryStream m_stream = new MemoryStream();

     

                  CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                  m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);

     

                  m_cstream.FlushFinalBlock();

     

                  m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                  m_stream.Close(); m_stream.Dispose();

     

                  m_cstream.Close(); m_cstream.Dispose();

              }

              catch (IOException ex) { throw ex; }

              catch (CryptographicException ex) { throw ex; }

              catch (ArgumentException ex) { throw ex; }

              catch (Exception ex) { throw ex; }

              finally { m_DESProvider.Clear(); }

     

              return m_strEncrypt;

          }

          /// <summary>

          /// DES 解密(数据加密标准,速度较快,适用于加密大量数据的场合)

          /// </summary>

          /// <param name="DecryptString">待解密的密文</param>

          /// <param name="DecryptKey">解密的密钥</param>

          /// <returns>returns</returns>

          public static string DESDecrypt(string DecryptString, string DecryptKey)

          {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

              if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

              if (DecryptKey.Length != 8) { throw (new Exception("密钥必须为8位")); }

     

              byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             string m_strDecrypt = "";

     

             DESCryptoServiceProvider m_DESProvider = new DESCryptoServiceProvider();

     

             try

            {

                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_DESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_DESProvider.Clear(); }

     

             return m_strDecrypt;

         }

         /// <summary>

         /// RC2 加密(用变长密钥对大量数据进行加密)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey">加密密钥</param>

         /// <returns>returns</returns>

         public static string RC2Encrypt(string EncryptString, string EncryptKey)

         {

             if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

             if (EncryptKey.Length < 5 || EncryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }

     

             string m_strEncrypt = "";

     

             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();

     

             try

            {

                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btEncryptString, 0, m_btEncryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_RC2Provider.Clear(); }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// RC2 解密(用变长密钥对大量数据进行加密)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey">解密密钥</param>

         /// <returns>returns</returns>

         public static string RC2Decrypt(string DecryptString, string DecryptKey)

         {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

            if (DecryptKey.Length < 5 || DecryptKey.Length > 16) { throw (new Exception("密钥必须为5-16位")); }

     

             byte[] m_btIV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

     

             string m_strDecrypt = "";

     

             RC2CryptoServiceProvider m_RC2Provider = new RC2CryptoServiceProvider();

     

            try

            {

                byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_cstream = new CryptoStream(m_stream, m_RC2Provider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_cstream.Write(m_btDecryptString, 0, m_btDecryptString.Length);

     

                 m_cstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_cstream.Close(); m_cstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

            catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

            finally { m_RC2Provider.Clear(); }

             return m_strDecrypt;

         }

         /// <summary>

         /// 3DES 加密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey1">密钥一</param>

         /// <param name="EncryptKey2">密钥二</param>

        /// <param name="EncryptKey3">密钥三</param>

         /// <returns>returns</returns>

         public static string DES3Encrypt(string EncryptString, string EncryptKey1, string EncryptKey2, string EncryptKey3)

         {

             string m_strEncrypt = "";

     

             try

             {

                 m_strEncrypt = DESEncrypt(EncryptString, EncryptKey3);

     

                 m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey2);

     

                m_strEncrypt = DESEncrypt(m_strEncrypt, EncryptKey1);

             }

             catch (Exception ex) { throw ex; }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// 3DES 解密(基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey1">密钥一</param>

         /// <param name="DecryptKey2">密钥二</param>

         /// <param name="DecryptKey3">密钥三</param>

         /// <returns>returns</returns>

         public static string DES3Decrypt(string DecryptString, string DecryptKey1, string DecryptKey2, string DecryptKey3)

         {

             string m_strDecrypt = "";

     

             try

             {

                m_strDecrypt = DESDecrypt(DecryptString, DecryptKey1);

     

                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey2);

     

                 m_strDecrypt = DESDecrypt(m_strDecrypt, DecryptKey3);

             }

             catch (Exception ex) { throw ex; }

     

             return m_strDecrypt;

         }

         /// <summary>

         /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

         /// </summary>

         /// <param name="EncryptString">待加密密文</param>

         /// <param name="EncryptKey">加密密钥</param>

        /// <returns></returns>

        public static string AESEncrypt(string EncryptString, string EncryptKey)

         {

            if (string.IsNullOrEmpty(EncryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }

     

             string m_strEncrypt = "";

     

             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

     

             Rijndael m_AESProvider = Rijndael.Create();

     

             try

             {

                 byte[] m_btEncryptString = Encoding.Default.GetBytes(EncryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateEncryptor(Encoding.Default.GetBytes(EncryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_csstream.Write(m_btEncryptString, 0, m_btEncryptString.Length); m_csstream.FlushFinalBlock();

     

                 m_strEncrypt = Convert.ToBase64String(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_csstream.Close(); m_csstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_AESProvider.Clear(); }

     

             return m_strEncrypt;

         }

         /// <summary>

         /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)

         /// </summary>

         /// <param name="DecryptString">待解密密文</param>

         /// <param name="DecryptKey">解密密钥</param>

         /// <returns></returns>

         public static string AESDecrypt(string DecryptString, string DecryptKey)

         {

             if (string.IsNullOrEmpty(DecryptString)) { throw (new Exception("密文不得为空")); }

     

             if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }

     

             string m_strDecrypt = "";

     

             byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");

     

             Rijndael m_AESProvider = Rijndael.Create();

     

             try

             {

                 byte[] m_btDecryptString = Convert.FromBase64String(DecryptString);

     

                 MemoryStream m_stream = new MemoryStream();

     

                 CryptoStream m_csstream = new CryptoStream(m_stream, m_AESProvider.CreateDecryptor(Encoding.Default.GetBytes(DecryptKey), m_btIV), CryptoStreamMode.Write);

     

                 m_csstream.Write(m_btDecryptString, 0, m_btDecryptString.Length); m_csstream.FlushFinalBlock();

     

                 m_strDecrypt = Encoding.Default.GetString(m_stream.ToArray());

     

                 m_stream.Close(); m_stream.Dispose();

     

                 m_csstream.Close(); m_csstream.Dispose();

             }

             catch (IOException ex) { throw ex; }

             catch (CryptographicException ex) { throw ex; }

             catch (ArgumentException ex) { throw ex; }

             catch (Exception ex) { throw ex; }

             finally { m_AESProvider.Clear(); }

     

             return m_strDecrypt;

         }

    2、数据加密和解密简单代码调用如下: 

    Response.Write("<br>-----------MD5加密---------------<br>");        

    Response.Write(SDKSecurity.MD5Encrypt("仰天一笑"));
    Response.Write("<br>-----------DES加密---------------<br>");        

    Response.Write(SDKSecurity.DESEncrypt("仰天一笑", "anson-xu"));        

    Response.Write("<br>-----------DES解密---------------<br>");        

    Response.Write(SDKSecurity.DESDecrypt("l06JvJ45r/lb9iKzSXl47Q==", "anson-xu"));
    Response.Write("<br>-----------AES加密---------------<br>");    

    Response.Write(SDKSecurity.AESEncrypt("仰天一笑", "ansonxuyu"));        

    Response.Write("<br>-----------AES解密---------------<br>");        

    Response.Write(SDKSecurity.AESDecrypt("avwKL+MO8+zoLHvzk0+TBA==", "ansonxuyu"));

    3、数据加密和解密调用后运行效果图如下: 

     

     


    展开全文
  • 常见的加密算法以及加密协议

    千次阅读 2018-09-20 10:14:11
    PKI:Public Key Infraastructure CA:Certificate Authority 公钥加密算法: DES:Data Encrption Standard;...加解密协议,是应用层,协议,通过在应用层协议和传输层之间建立SSL层,数据在SSL层完成加密,...
  • PostgreSQL 数据加密之 pgcrypto

    千次阅读 热门讨论 2020-10-16 16:22:50
    PostgreSQL 扩展模块 pgcrypto 提供了单向加密算法 MD5、SHA、HMAC ,PGP 双向加密算法 Blowfish、AES、DES 等,可以用于实现数据加密和解密。本文介绍了这个模块的安装、函数的使用以及实际案例,包括用户密码...
  • 数据加密技术和数据加密算法

    千次阅读 2019-04-15 10:16:26
    数据加密技术 现代社会对信息安全的需求大部分可以通过密码技术来实现。密码技术是信息安全技术中的核心技术,它主要由密码编码技术和密码分析技术两个分支组成。密码编码技术的主要任务是寻求产生安全性高的有效...
  • Android App数据加密

    千次阅读 2015-09-07 12:01:22
    Android App数据加密一、App数据加密概述:App数据加密哪些方面去考虑呢?以及为什么要加密呢?1.1、网络传输加密网络传输是不安全的,基于http 协议传输的内容是很容易被抓包提取数据。 1.2、跨进程intent 携带的...
  • 应用层协议传送的数据在通过TLS协议时都会被加密,从而保证通信的私密性。 TLS协议是可选的,必须配置客户端和服务器才能使用。主要两种方式实现这一目标:一个是使用统一的TLS协议通信端口(例如:用于HTTPS的...
  • TLS加密协议完整流程

    千次阅读 2019-01-26 19:29:11
    TLS加密协议完整流程
  • 大致什么样的app先暂时不说,后面会详细介绍这个app的开发流程和架构,不过先要解决一些技术前提问题,技术问题就是需要分析解密当前短视频四小龙:抖音,火山,秒拍,快手这四家短视频的数据请求加密协议,只有破解...
  • 我们常说的数据安全:主要分为两种,数据本身的安全和数据防护安全。... App数据存储安全,主要指在磁盘做数据持久化的时候所做的加密。 App网络传输安全,指对数据从客户端传输到服务器中间过程的加密,防止...
  • HTTPS加密协议详解

    千次阅读 2018-06-19 20:26:05
    HTTPS加密协议详解(一):HTTPS基础知识HTTPS基础知识:HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息。它使用安全套接...
  • 如何识别加密协议

    千次阅读 2015-11-21 21:07:08
    加密P2P视频流的识别 背景 观看在线视频时,可以发现游览器经常偷偷地上传流量,实际上目前很多在线视频网站采用了一种RTMFP的技术来传输视频流量。采用这种P2P技术可以大大节约服务器的带宽和资源。但是一般...
  • WiFi加密方式有哪些

    万次阅读 2018-12-19 10:56:13
    wifi加密方式: 1.安全模式: WPA 、WPA2、WPA/WPA2、WEP、802.1x(EAP)(企业版的WPA)、NONE 2.密码加密类型:AES(CMPP),TKIP,CMPP/TKIP 。WEP的是128bit和64bit加密。 目前最常用的是WPA2...
  • RDP层:RDP客户端任何的用户操作,都将形成RDP数据包,并以数据包类型形成RDP包头,然后将数据包传给Secure Connection层,由Secure Connection负责将数据往下传递。  Secure Connection层:该层再收
  • 数据加密原理详解

    千次阅读 2019-11-29 11:05:36
    数据加密,是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文。它的核心是密码学。 数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。...
  • 数据传输过程加密方案

    千次阅读 2019-08-19 19:29:58
    文章目录前言数据加密方案数据加密细节AES加解密RSA公钥加密总结 前言 从前一篇网络安全基础要点知识介绍中可以知道,在网络通信中,...首先,客户端与服务端商量好数据加密协议,对传输数据做到安全保护。 安全保护...
  • 客户端与服务端数据加密传输方案

    万次阅读 2019-03-03 17:39:42
    前言 从前一篇网络安全基础要点知识介绍中可以知道...首先客户端与服务端商量好数据加密协议,对传输数据做到安全保护,需要下面两点: 采用HTTPS协议 采用公钥密码体制RSA算法对数据加密 现在安全是保证了,但...
  • CoAP协议学习笔记可点此查看。...正如使用TCP上的传输层加密协议(TLS)保护HTTP一样,CoAP使用UDP上的数据报TLS协议(DTLS)[RFC6347]来进行加密。 本节定义了对DTLS的CoAP绑定,以及适用于受限环境的最小必...
  • TI BLE协议栈自带数据的加解密功能,主要两个函数,分别是加密与解密,每个函数均为三参数,均为16字节,若实际数据不足16字节,自己后面补足,加密后通过蓝牙发出,对方设备收到此数据后,进行逆运算,得到16字节...
  • 前面的文章说了OSI 七层模型,https 可以保证数据在传输层...那么如果使用了 https,传输的数据还需要做二次加密吗?是否过度设计的感觉,让我们来分析是否这个必要性。 目录: 何为 https 证书 https 证...
  • 数据加密技术

    千次阅读 2006-12-12 14:38:00
    数据加密是实现网络安全的关键技术之一,本文首先介绍加密的基本概念,然后着重讨论两类最常见的加密技术:私用密钥加密和公开密钥加密,并详细探讨了它们的特点、发展及今后的研究方向。 加密算法; 由于Internet的...
  • Java Socket实战之五 使用加密协议传输对象

    万次阅读 多人点赞 2012-02-15 08:34:22
    Java Socket实战之一 单线程通信 Java Socket实战之二 多线程通信 Java Socket实战之三 传输对象 ...前面几篇博文提到了Socket中一些常用的用法,但是对于一些安全要求的应用就需要加密传输的数据,此
  • //相当关键,这句话是让curl_exec($ch)返回的结果可以进行赋值给其他的变量进行,json的数据操作,如果没有这句话,则curl返回的数据不可以进行人为的去操作(如json_decode等格式操作) curl_setopt($ch, ...
  • java 数据加密基本知识

    千次阅读 2019-01-21 15:20:44
    BASE64的加密解密是双向的,可以求反解. BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。 JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, ...
  • Crypto++ 库是开源的 C++ 数据加密算法库,支持如下算法:RSA、MD5、DES、AES、SHA-256 等等,其中对于加密对称加密和非对称加密。本实验通过 Cryto++ 库对字符串进行 MD5 校验,并用 AES 加密和解密。 1.1 知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 259,695
精华内容 103,878
关键字:

常用的数据加密协议有哪些