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();
}
}
}
本人声明:
个人主页:沐海(http://www.cnblogs.com/mahaisong)
以上文章都是经过本人设计实践和阅读其他文档得出。如果需要探讨或指教可以留言或加我QQ!欢迎交流!