代码改变世界

DES的加密类(创建文件夹,隐藏文件夹)

2011-10-12 11:51  沐海  阅读(1118)  评论(0编辑  收藏  举报

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Security.Cryptography; // Marshal.Free ..

namespace enote902.Common
{
    class DESEncrypt
    {
        private const string key = "888888";
        private const  string IV = "888888*";

        /// <summary>
        /// 加密文件名(包含左右)
        /// </summary>
        /// <param name="caseId">案件号码</param>
        /// <param name="obj">问话对象</param>
        /// <param name="times">第几次</param>
        /// <returns>文件名加密(包含左右)</returns>
        public string[] Encryptor(string caseId, string obj, int times)
        {
            try
            {
                string temp = caseId + "//" + obj + "//" + times.ToString();
                string DESName = Encrypt(temp);
                //找到当前路径。
                string fileD = System.AppDomain.CurrentDomain.BaseDirectory + "Video\\";//debug文件下面
                if (!Directory.Exists(fileD))
                {//如果不存在就创建file文件夹 
                    Directory.CreateDirectory(fileD);//创建该文件夹 

                }
                DirectoryInfo TheFolder = new DirectoryInfo(fileD);//公开用于创建、移动和枚举目录和子目录的实例方法。无法继承此类。

                //判读是否是隐藏文件夹
                if (TheFolder.Attributes.ToString().IndexOf("Hidden") == -1)
                {
                    File.SetAttributes(fileD, FileAttributes.Hidden);
                }

                string onefile = DESName + "1.avi";
                string twofile = DESName + "2.avi";


                string onepath = fileD + DESName + "1.avi";//完整文件路径
                string twopath = fileD + DESName + "2.avi";//完整文件路径
                ////若存在文件。则修改对应的文件名称
                //while (File.Exists(aa) || File.Exists(bb))
                //{
                //}
                if (!File.Exists(onepath) && !File.Exists(twopath))//检测的是文件全路径
                {
                    string[] result = { onefile, twofile };//存储的是文件名称
                    return result;
                }
                else { return null; }
            }
            catch
            {
                return null;
                throw new NotSupportedException("注意,当前文件无法保存!");

            }

        }

        /// <summary>
        /// 得到文件名(包含左右)
        /// </summary>
        /// <param name="caseId">案件号码</param>
        /// <param name="obj">问话对象</param>
        /// <param name="times">第几次</param>
        /// <returns>文件名加密(包含左右)</returns>
        public string[] DEncryptor(string caseId, string obj, int times)
        {
            try
            {
                string temp = caseId + "//" + obj + "//" + times.ToString();
                string DESName = Encrypt(temp);
                //找到当前路径。
                string fileD = System.AppDomain.CurrentDomain.BaseDirectory ;//debug文件下面
                string filePathA = fileD + DESName + "1.avi";//完整文件路径
                string filePathB = fileD + DESName + "2.avi";//完整文件路径

                if (File.Exists(filePathA) && File.Exists(filePathB))
                {
                    string[] result = { filePathA, filePathB };
                    return result;
                }
                else { return null; }
            }
            catch
            {
                return null;
                throw new NotSupportedException("未找到视频文件!");

            }

        }



        /// <summary>
        /// 加密数据
        /// </summary>
        /// <param name="encryptString">字符串数据</param>
        /// <returns>加密后数据</returns>
        private string Encrypt(string encryptString)
        {
            
                // 类将一些数据加密到内存,然后解密数据
                //访问数据加密标准(DES)算法的加密服务提供程序 (CSP) 版本的包装对象
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                des.Key = ASCIIEncoding.ASCII.GetBytes(key);//获取或设置对称算法的密钥。
                //密钥既用于加密,也用于解密。为了保证对称算法成功,必须只有发送方和接收方知道密钥。有效密钥大小由对称算法的具体实现指定,并且在 LegalKeySizes 属性中列出。
                //如果此属性在使用时为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则调用 GenerateKey 方法以创建新的随机值。

                des.IV = ASCIIEncoding.ASCII.GetBytes(IV);
                //从 SymmetricAlgorithm 类派生的类使用一种称为密码块链接 (CBC) 的链接模式,该链接模式需要密钥和初始化向量才能执行数据的加密转换。 若要解密使用其中一个 SymmetricAlgorithm 类加密的数据,必须将 Key 属性和 IV 属性设置为用于加密的相同值。 

                byte[] inputByteArray = Encoding.Default.GetBytes(encryptString);//把字符串放到byte数组中
                MemoryStream ms = new MemoryStream();//创建其支持存储区为内存的流。
                //MemoryStream 封装以无符号字节数组形式存储的数据,该数组在创建 MemoryStream 对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。
                //定义将数据流链接到加密转换的流。
                //公共语言运行库使用面向流的设计进行加密。该设计的核心是 CryptoStream。实现 CryptoStream 的任何加密对象可以和实现 Stream 的任何对象链接起来,因此一个对象的流式处理输出可以馈送到另一个对象的输入。不需要分别存储中间结果(第一个对象的输出)。
                try
                {
                CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                //对其执行加密转换的流。要对流执行的加密转换。指定加密流的模式。
                cs.Write(inputByteArray, 0, inputByteArray.Length);
                //将一个字节序列写入当前 CryptoStream,并将流中的当前位置提升写入的字节数。 (重写 Stream..::.Write(array<Byte>[]()[], Int32, Int32)。)

                cs.FlushFinalBlock();//用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。
               }
                catch { }
                StringBuilder ret = new StringBuilder();
                foreach (byte b in ms.ToArray())
                {

                    ret.AppendFormat("{0:X2}", b);
                }
                ret.ToString();
                return ret.ToString();
        
        }


        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="DencryptString">解密字符串</param>
        /// <returns>明文</returns>
        public string Decrypt(string DencryptString) {


            if (String.IsNullOrEmpty(DencryptString))
            {
                throw new ArgumentNullException("解密元数据不能为空!");
            }

            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Key = ASCIIEncoding.ASCII.GetBytes(key);//获取或设置对称算法的密钥。
            //密钥既用于加密,也用于解密。为了保证对称算法成功,必须只有发送方和接收方知道密钥。有效密钥大小由对称算法的具体实现指定,并且在 LegalKeySizes 属性中列出。
            //如果此属性在使用时为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则调用 GenerateKey 方法以创建新的随机值。

            des.IV = ASCIIEncoding.ASCII.GetBytes(IV);

            MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(DencryptString));
            CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateEncryptor(), CryptoStreamMode.Read);
            StreamReader reader = new StreamReader(cryptoStream);

            return reader.ReadToEnd();
        
        }


    }
}

记录生活、工作、学习点滴!
E-Mail:mahaisong@hotmail.com 欢迎大家讨论。
沐海博客园,我有一颗,卓越的心!