zoukankan      html  css  js  c++  java
  • ASP.NET(C#)常用数据加密和解密方法1

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

     

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

      一、加密的基本概念

      "加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,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);
  • 相关阅读:
    nginx配置url伪静态
    PHP爬虫之queryList
    PHP 判断给定两个时间是否在同一周,月,年
    服务器nginx配置显示文件而不是下载
    PHP yield占用内存测试
    PHP 函数运行的内存
    io系列之字节流
    io系列之字符流
    对于Arrays的deep相关的方法。
    常用工具类(System,Runtime,Date,Calendar,Math)
  • 原文地址:https://www.cnblogs.com/wifi/p/2250735.html
Copyright © 2011-2022 走看看