`
pcajax
  • 浏览: 2157180 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

 
阅读更多

应同事所邀把ASP.NET(C#)常用数据加密和解密方法列出供大家参考,特此发布出来,希望对大家有点帮助。数据虽来源于网络,系仰天一笑悉心整理。

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、数据加密和解密调用后运行效果图如下: 

 

ASP.NET(C#)常用数据加密和解密方法源代码免费下载:源代码免费下载点击此处>> ,如果下载不了,可以发邮件至 943530498@qq.com

<script type="text/javascript"> if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 13388; var cb_entryId = 2103572; var cb_blogApp = "skylaugh"; var cb_blogUserGuid = "2aa3310b-63cf-dd11-9e4d-001cf0cd104b"; var cb_entryCreatedDate = '2011/7/12 1:10:00'; </script>
分享到:
评论

相关推荐

    Asp.Net/C# DES加密解密

    本资源提供DES加密解密的方法,大家可以复制该方法运用到各种项目中,简单便捷,快速使用。我这里用的是控制台给大家演示的,大家可以上传到API项目或者MVC等项目中,只需要把自己所需要的参数给提供出来就可

    解析Asp.net,C# 纯数字加密解密字符串的应用

    继上篇:Asp.net,C# 加密解密字符串的使用详解,有网友提问: 也就是说加密后的数据不再是:N8lAaHMFtSAQgaf3+RUFng==   希望encryptedString是”120387789370480938409832840923492384028934…”; 当然上面的...

    asp.net(C#)MD5数据加密和解密

    MD5加密,简单方便易用,我使用的是vs2010,所以,如果你使用的是vs2005 或vs2008,请新建一个空网站,将下载的文件解压后,(除confuger文件外)复制到你的空网站中就可使用!QQ:147249735,如有问题,可以Q我,...

    ASP.NET实现 DES加密解密类

    总之,ASP.NET中的DES加密解密涉及到对字符串数据的加密和解密,通过使用`DESCryptoServiceProvider`类,结合MD5哈希处理,实现了对数据的安全保护。尽管DES已不再是最安全的选择,但了解其原理和应用有助于理解加密...

    AES128加密解密、C#、 asp.net、winform、kokketiny、AES128、C.txt.7z

    在提供的文件列表中,“AES128加密解密、C#、asp.net、winform、kokketiny、AES128、C.txt”可能是包含详细代码示例或者教程的文本文件,涵盖了使用这些技术实现AES128加密解密的方法。如果你需要具体实现细节,你...

    c# asp.net 字符串加密解密的类

    本篇文章将深入探讨C# ASP.NET中字符串加密解密的类和方法,以及如何在实际项目中应用它们。 首先,我们要了解加密的基本概念。加密是将明文(可读数据)转化为密文(不可读数据)的过程,而解密则是相反的过程。在...

    C# ASP.NET - 加密与解密数据库中字段数据

    在ASP.NET中,你可以将这些加密和解密方法封装到自定义的Helper类中,然后在需要处理数据库数据的地方调用。例如,在保存用户密码时,先加密密码,再将其存储到数据库中。在验证用户登录时,取出数据库中的加密密码...

    一个基于C#+ASP.NET实现的数据安全加密与解密的类库及例子源码程序

    本文将深入探讨一个基于C#和ASP.NET实现的数据加密与解密的类库及其应用实例。这个类库为开发者提供了一种有效的方式来保护他们的应用程序中的数据,确保其在传输过程中不被非法获取或篡改。 首先,C#是一种面向...

    .net加密解密算法demo

    这个" .net加密解密算法demo "提供了易于理解和使用的加密解密示例,特别适合初学者和开发者快速上手。源代码中包含了详尽的注释,使得自定义关键字成为可能,以满足不同场景下的安全需求。 首先,加密是将明文数据...

    asp.net微软提供的加密方法.rar

    3. **数据保护API (Data Protection API)**:ASP.NET提供了一套简单易用的数据保护API,可以用来加密和解密数据。例如,`System.Web.Security.ProtectedData`类可用于加密敏感数据,而`System.Web.Security.Data...

    与上传的另一篇资源JS前端加密所对应的.NET版本的加密解密,可实现js加密,后台解密,后台加密,js端解密

    本资源是对另一篇资源js端加密,后台解密/JS端解密,后台加密的后台版本,已亲测可用,并且加密和解密都可正常执行,注意:本资源中包含AES加密解密,RSA加密解密,以及生成PEM格式的RSA公私秘钥,但是有点没做好的...

    .Net加密解密方法

    总结来说,ASP.NET中的自定义加密解密方法可以借助.NET框架提供的加密类库来实现,通过用户指定的密钥,我们可以创建安全的数据保护机制。理解并正确应用这些技术,对于构建安全的Web应用程序至关重要。

    C#,ASP.NET 加密解密打包软件带源码

    4. **源码**:展示如何在C#和ASP.NET中实现这些功能,对于学习加密解密技术或提升编程技能非常有价值。 5. **打包教程**:可能包含如何将软件打包成可执行文件的指南,这对于开发者了解软件发布流程很有帮助。 通过...

    C# ASP.NET - 加密解密Web.config文件

    总结来说,C# ASP.NET提供的加密解密机制为Web.config文件的安全提供了有力保障。通过合理使用`SectionInformation`类的方法,我们可以对敏感配置信息进行加密,从而防止未授权访问,同时在需要时解密以正常运行应用...

    XML的加密和解密及ASP.NET下的实现方法

    XML加密是W3C制定的一种...总之,XML加密是保护XML数据安全的重要手段,结合ASP.NET的加密API,可以实现灵活、安全的数据加密和解密策略。在实际应用中,应根据具体需求选择合适的加密方法,并确保遵循最佳安全实践。

    ASP.NET C#教程

    ASP.NET C#教程是针对微软开发的Web应用程序框架ASP.NET的学习资源,主要使用C#编程语言。本教程将深入探讨如何使用这两种技术结合,构建高效、动态和交互式的Web应用程序。 首先,ASP.NET是一个开放源代码的Web...

    md5加密和解密源码.net c#版本

    在.NET和C#环境中,MD5加密和解密源码涉及到的主要知识点包括MD5算法的基本原理、C#中的MD5类库使用以及加密和解密的实现过程。 1. **MD5算法基础** - **哈希函数**:MD5是一种非对称的单向哈希函数,它将任意长度...

    C#ASP.NET 加密帮助类

    在.NET框架中,C#和ASP.NET提供了丰富的加密和解密功能,这使得开发者能够创建安全的应用程序,保护用户数据和个人信息安全。`MyJiaMi.cs`文件很可能包含了一个自定义的加密帮助类,用于简化加密操作。在这个帮助类...

    c# rsa非对称加密与解密

    在"C# RSA非对称加密与解密"的demo中,MvcApplication3可能是一个ASP.NET MVC项目,包含了实现上述功能的代码示例。在这样的项目中,通常会有控制器(Controller)处理加密和解密请求,视图(View)显示结果,以及...

    C# 密码加密与解密 (DES)

    DES是一种对称加密算法,它使用相同的密钥进行数据加密和解密。 DES算法的基本原理是通过一系列复杂的数学运算,如置换、异或、位移等,将明文数据转化为密文,以保护信息不被未经授权的人获取。C#中的`System....

Global site tag (gtag.js) - Google Analytics