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

来源:互联网 发布:淘宝联系卖家的电话 编辑:程序博客网 时间:2024/05/02 02:06
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();                               }    }}

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吃酸东西牙齿酸怎么办 拔完智齿神经疼怎么办 22岁腿关节疼痛怎么办 耳洞里面有硬块怎么办 耳洞发炎有硬块怎么办 小孩慢性扁桃体发炎怎么办大全 侧切伤口化脓了怎么办 狗狗伤口不愈合怎么办 狗后腿烂了化脓怎么办 乳腺增生腋下淋巴结肿大怎么办 手术刀口冒脓了怎么办 脚伤口感染肿了怎么办 皮外伤口不愈合怎么办 烫伤新皮红红的怎么办 脸上痘痘化脓了怎么办 痘痘引起的红肿怎么办 痘痘引起的硬块怎么办 痘痘化脓感染了怎么办 烫伤有脓了烂掉怎么办 烫伤起泡破皮了怎么办 一出汗就有狐臭怎么办 耳朵后面臭臭的怎么办 赤黑abo意外怀孕怎么办 qq忘记密保了怎么办 三星s8耗电太快怎么办 360云盘关闭照片怎么办 360云盘停止服务怎么办 房间湿度90%太高怎么办 天刀掠夺进错了怎么办 狗耳朵臭怎么办黄垢 狗耳朵里有味道怎么办 电视没了泰捷怎么办 配资公司跑路怎么办 口袋忍者倒闭了怎么办 小樱死了,佐助怎么办 别人诬陷我我该怎么办 亲戚诬陷我偷钱怎么办 被别人怀疑偷钱怎么办 有人诬陷我偷鱼怎么办, 寝室里有人偷钱怎么办 6s被偷一直关机怎么办