C#字符串的加密与解密(DES跟TripleDES算法的加密解密过程)

C#字符串的加密与解密(DES和TripleDES算法的加密解密过程)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace 加密解密
{
    class Encryption_Decryption
    {
        //<3、 加密操作 >

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

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

        /// <summary>
        /// 将一个明文的二进制流转换成一个加密的二进制流
        /// </summary>
        /// <param name="strArray">一个明文的二进制数据流,其实也就是你要加密的字符串的二进制形式的数据流</param>
        /// <param name="Key"></param>
        /// <param name="IV"></param>
        /// <returns>返回一个加密后是二进制数据流</returns>
        public static byte[] EncryptString(byte[] strArray, 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(strArray, 0, strArray.Length);

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

            // 把解密后的数据流转成字节流
            byte[] ret = mStream.ToArray();

            //关闭两个streams

            cStream.Close();
            mStream.Close();
            return ret;
        }

        

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

        /// <summary>
        /// 将一个加密后的二进制数据流进行解密,产生一个明文的二进制数据流
        /// </summary>
        /// <param name="EncryptedDataArray">加密后的数据流</param>
        /// <param name="Key"></param>
        /// <param name="IV"></param>
        /// <returns>一个已经解密的二进制流</returns>
        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;

        }
    
    }
    class Program
    {
        static void Main(string[] args)
        {

            //<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;


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

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

            // 待加密的字符串
            string str = "你好中国";

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

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

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

            byte[] strArray = sEncoding.GetBytes(str);





            //<4,调用第四步方法// 调用解密方法,返回已解密数据的byte[]>

            //获取已经加密的数据流
            byte[] getStream = Encryption_Decryption.EncryptString(strArray, keyArray, IVArray);

            //获取已经解密的数据流
            byte[] finalPlainTextArray = Encryption_Decryption.DecryptTextFromMemory(getStream, keyArray, IVArray);

            // 使用前面定义的Encoding,utf-8的编码把byte[]转成字符串
            string s = sEncoding.GetString(finalPlainTextArray);

            Console.WriteLine(s);



            Console.ReadKey();
           
            

        }
    }
}