zoukankan      html  css  js  c++  java
  • 数据加密和解密

    1   数据加密和解密

    1.1  典型场合

        在使用加密的典型场合中,双方(Alice 和 Bob)在不安全的信道上通信。Alice 和 Bob 想要确保任何可能正在侦听的人无法理解他们之间的通信。而且,由于 Alice 和 Bob 相距遥远,因此 Alice 必须确保她从 Bob 处接受到的信息没有在传输期间被任何人修改。此外,她必须确保信息确实是来自 Bob,而不是来自模仿 Bob 的人。

         加密通常用于达到以下目的:

        (1)保密性:帮助保护用户的标识或数据不被读取。

        (2)数据完整性:帮助保护数据不被更改。

        (3)身份验证:确保数据发自特定的一方。

    (4)不可否认性(不可抵赖性):防止特定的一方否认发送过消息。

    1.2  私钥加密(对称加密)

        私钥加密算法使用单个私钥来加密和解密数据。由于具有密钥的任意一方都可以使用该密钥解密您的数据,或加密他们自己的数据并声称该数据源自您,因此必须保护密钥不被未经授权的代理得到。

        私钥加密又称为对称加密,因为同一密钥既用于加密又用于解密。私钥加密算法的速度非常快(与公钥算法相比),它特别适用于对较大的数据流执行加密转换。从数学角度而言,公钥加密算法(例如 RSA)在可加密的数据量方面存在限制。私钥加密算法一般则没有这些问题。

        假定 Alice 和 Bob 是希望在非安全信道上通信的双方,他们可以按如下方式使用私钥加密:Alice 和 Bob 同意对特定的密钥和 IV 应用一种特定的算法(例如 AES)。Alice 撰写一条消息并创建要在其上发送该消息的网络流(可能是一个命名管道或网络电子邮件)。接下来,她使用该密钥和 IV 加密文本,并通过 Intranet 向 Bob 发送该加密消息和 IV。Bob 在收到该加密文本后,可使用 IV 和预先商定的密钥对它进行解密。即使传输的内容被人截获,截获者也无法恢复原始消息,因为他并不知道密钥。在此方案中,只有密钥必须保密。

        .NET Framework 提供了以下类来实现私钥加密算法:

        (1)AesManaged(在 .NET Framework 3.5 版中引入)

    (2)DESCryptoServiceProvider

    (3)HMACSHA1(从技术上讲,这是一种私钥算法,因为它表示结合使用加密哈希     函数和私钥计算的消息身份验证代码。)

    (4)RC2CryptoServiceProvider

    (5)RijndaelManaged

    (6)TripleDESCryptoServiceProvider

     

     SymmetricAlgorithm表示所有对称算法的实现都必须从中继承的抽象基类,从 SymmetricAlgorithm 类派生的类使用一种称为密码块链接 (CBC) 的链接模式,该模式需要密钥 (Key) 和初始化向量 (IV) 才能执行数据的加密转换。若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。为了保证对称算法有效,必须只有发送方和接收方知道密钥。

    每当您创建其中一个 SymmetricAlgorithm 类的新实例时,或者当您手动调用 GenerateIV 方法时,IV 属性均自动设置为新的随机值。IV 属性的大小必须与 BlockSize 属性的大小相同。

        对于给定的密钥 k,不使用初始化向量的简单块密码将同一个纯文本输入块加密为同一个密码文本输出块。如果您的纯文本流中有重复块,则您的密码文本流中也会有重复块。如果未经授权的用户知道了您的纯文本块结构的任何信息,他们就可以利用该信息来解密已知的密码文本块,并有可能重新获得您的密钥。为了防止这个问题,前一个块中的信息被混合到下一个块的加密过程中。这样一来,两个相同的纯文本块的输出就变得不一样了。由于此技术使用前一个块加密下一个块,因此需要初始化向量来加密数据的第一个块。

    1.2.1  DES加密算法

    示例 1:

        下面的示例使用 DESCryptoServiceProvider 类将一些数据加密到内存,然后解密数据

     public static byte[] Encrypt(string plainText,SymmetricAlgorithm key)

     {

                MemoryStream ms = new MemoryStream();

                CryptoStream cs = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write);

                StreamWriter sw = new StreamWriter(cs);

     

                sw.WriteLine(plainText);

     

                sw.Close();

                cs.Close();

                byte[] buffer = ms.ToArray();

                ms.Close();

                return buffer;

     }

     

       public static string Decrypt(byte[] buffer ,  SymmetricAlgorithm  key)

       {

                MemoryStream ms  =  new MemoryStream(buffer);

                CryptoStream cs = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);

                StreamReader reader = new StreamReader(cs);

                string plainText = reader.ReadLine();

                reader.Close();

                cs.Close();

                ms.Close();

                return plainText;

    }

     

    public static void Main()

    {

                SymmetricAlgorithm key = new DESCryptoServiceProvider();

                key.Key = Encoding.Default.GetBytes("12345678");

                key.IV = Encoding.Default.GetBytes("12345678");

                byte[] bytes = Encrypt("plain text", key);

                string plaintText = Decrypt(bytes, key);

     }

     

     

     

    项目实例  

        DES文件加密解密演示程序

     

     

    private void EncryptData(string finName,string foutName,byte[] key,byte[] iv)

     {

                FileStream fin = new FileStream(finName, FileMode.Open, FileAccess.Read);

                byte[] buffer = new byte[fin.Length];

     

                fin.Read(buffer, 0, buffer.Length);

                fin.Flush();

                fin.Close();

     

                MemoryStream ms = new MemoryStream();

                DESCryptoServiceProvider des = new DESCryptoServiceProvider ();

                CryptoStream cs = new CryptoStream(ms,des.CreateEncryptor(key,iv),CryptoStreamMode.Write);

     

                cs.Write(buffer, 0, buffer.Length);

                cs.FlushFinalBlock();

     

                byte[] array = ms.ToArray();

     

                FileStream fout = new FileStream(foutName,FileMode.OpenOrCreate,FileAccess.Write);

                fout.Write(array, 0, array.Length);

                fout.Flush();

                fout.Close();

    }

     

     private void DecryptData(string finName, string foutName, byte[] key, byte[] iv)

     {

                FileStream fin = new FileStream(finName, FileMode.Open, FileAccess.Read);

     

                byte[] buffer = new byte[fin.Length];

                fin.Read(buffer, 0, buffer.Length);

                fin.Flush();

                fin.Close();

     

                DESCryptoServiceProvider des = new DESCryptoServiceProvider();

                MemoryStream ms = new MemoryStream();

                CryptoStream cs = new CryptoStream(ms,des.CreateDecryptor(key,iv),CryptoStreamMode.Write);

                cs.Write(buffer,0,buffer.Length);

                cs.FlushFinalBlock();

     

                byte[] plaintArray = ms.ToArray();

     

                FileStream fout = new FileStream(foutName, FileMode.OpenOrCreate, FileAccess.Write);

                fout.Write(plaintArray, 0, plaintArray.Length);

                fout.Flush();

                fout.Close();

      }

     

    项目实例2

    DES字符串加密解密演示程序

     

    private string Encrypt(string plainText, byte[] key, byte[] iv)

     {

                byte[] plaintArray = Encoding.UTF8.GetBytes(plainText);

                try

                {

                    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())

                    {

                        MemoryStream ms = new MemoryStream();

                        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);

                        cs.Write(plaintArray, 0, plaintArray.Length);

                        cs.FlushFinalBlock();

     

                        byte[] buffer = ms.ToArray();

                        return Convert.ToBase64String(buffer);

                    }

                }

                    catch(Exception ex)

                {

     MessageBox.Show(ex.Message);

                    return String.Empty;

                }

     }

     

     

    private string Decrypt(string str, byte[] key, byte[] iv)

     {

                byte[] buffer = Convert.FromBase64String(str);

                try

                {

                    using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())

                    {

                        MemoryStream ms = new MemoryStream();

                        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Write);

                        cs.Write(buffer, 0, buffer.Length);

                        cs.FlushFinalBlock();

     

                        byte[] plainArray = ms.ToArray();

     

                        return Encoding.UTF8.GetString(plainArray,0,plainArray.Length);

                    }

                }

                catch(Exception ex)

                {

                    MessageBox.Show(ex.Message);

                    return String.Empty;

                }

            }

     

    演示如下:

     

  • 相关阅读:
    Amzon MWS API开发之订单接口
    Amazon 解决下载文件乱码
    分享一个近期写的简单版的网页采集器
    Log4Net使用指南
    C# Log4Net 日志
    C# 获取往控件中拖进的文件或文件夹的信息
    LOG4NET用法(个人比较喜欢的用法)
    WCF传输过大的数据导致失败的解决办法
    .Net Core 微服务学习(四) gRpc
    .Net Core 微服务学习(三): 网关(Gateway)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/1651571.html
Copyright © 2011-2022 走看看