using System;
using System.Security.Cryptography;
using System.IO;namespace Security
{
/// <summary>
/// SecEncrypt
/// 用于加密文件和字符串
/// </summary>
public class SecEncrypt:IEncrypt
{
private SymmetricAlgorithm sa;
public SecEncrypt(EncryptMethodEnum em)
{
//
// TODO: 在此处添加构造函数逻辑
//
if (em == EncryptMethodEnum.DES)
{
sa = new DESCryptoServiceProvider();
}
else if (em == EncryptMethodEnum.RC2)
{
sa = new RC2CryptoServiceProvider();
}
else if (em == EncryptMethodEnum.Rijndael)
{
sa = new RijndaelManaged();
}
else if (em == EncryptMethodEnum.TripleDES)
{
sa = new TripleDESCryptoServiceProvider();
}
}
public SecEncrypt(EncryptMethodEnum em,string password,string strIV):this(em)
{
SetKey(password);
SetIV(strIV);
}
#region IEncrypt 成员 public void SetKey(string key)
{
sa.Key = System.Text.UTF8Encoding.ASCII.GetBytes(key);
} public void SetIV(string strIV)
{
// TODO:  添加 SecEncrypt.SetIV 实现
// sa.IV = System.Text.UTF8Encoding.UTF8.GetBytes(strIV);
sa.GenerateIV();
} public string Encrypt(string s)
{
// TODO:  添加 SecEncrypt.Encrypt 实现
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] arrByte; ct = sa.CreateEncryptor(sa.Key,sa.IV); arrByte = System.Text.Encoding.UTF8.GetBytes(s); ms = new MemoryStream();
cs = new CryptoStream(ms,ct,CryptoStreamMode.Write);
cs.Write(arrByte,0,arrByte.Length);
cs.FlushFinalBlock();
cs.Close(); return Convert.ToBase64String(ms.ToArray());
} void Security.IEncrypt.Encrypt(string originalFileName, string EncryptedFileName)
{
// TODO:  添加 SecEncrypt.Security.IEncrypt.Encrypt 实现
} public string Decrypt(string s)
{
// TODO:  添加 SecEncrypt.Decrypt 实现
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt; ct = sa.CreateDecryptor(sa.Key, sa.IV); byt = Convert.FromBase64String(s); ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock(); cs.Close(); return System.Text.Encoding.UTF8.GetString(ms.ToArray()); } void Security.IEncrypt.Decrypt(string originalFileName, string DecryptedFileName)
{
// TODO:  添加 SecEncrypt.Security.IEncrypt.Decrypt 实现
} void Security.IEncrypt.Free()
{
sa.Clear();
} #endregion
}
}

解决方案 »

  1.   

    private void button1_Click(object sender, System.EventArgs e)
    {
    IEncrypt encrypt = new SecEncrypt(EncryptMethodEnum.DES,"usal8735","y808T3lXtok=");
    this.textBox2.Text = encrypt.Encrypt(this.textBox1.Text);
    encrypt.Free();
    } private void button2_Click(object sender, System.EventArgs e)
    {
    IEncrypt encrypt = new SecEncrypt(EncryptMethodEnum.DES,"usal8735","y808T3lXtok");
    MessageBox.Show(encrypt.Decrypt(this.textBox2.Text));
                               encrypt.Free();
    }加密后可得到密文,但是解密的时候,前面的字符和明文不同。
    怀疑是IV的问题,但是试过好像不能指定IV
    望大家帮忙,谢谢
      

  2.   

    namespace Common
    {
    /// <summary>
    /// 加密和解密
    /// </summary>
    public sealed class EncryptDecrypt
    {
    private EncryptDecrypt(){} //默认密钥向量
    private static byte[] Keys = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; /// <summary>
    /// 利用MD5对字符串进行加密
    /// </summary>
    /// <param name="encryptString">待加密的字符串</param>
    /// <returns>返回加密后的字符串</returns>
    public static string EncryptMD5(string encryptString)
    {
    MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
    UTF8Encoding Encode = new UTF8Encoding();
    byte[] HashedBytes = md5Hasher.ComputeHash(Encode.GetBytes(encryptString));
    return Encode.GetString(HashedBytes);
    } /// <summary>
    /// DES加密字符串
    /// </summary>
    /// <param name="encryptString">待加密的字符串</param>
    /// <param name="encryptKey">加密密钥,要求为8位</param>
    /// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
    public static string EncryptDES(string encryptString,string encryptKey)
    {
    try
    {
    byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0,8));
    byte[] rgbIV = Keys;
    byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
    DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
    MemoryStream mStream = new MemoryStream();
    CryptoStream cStream = new CryptoStream(mStream,dCSP.CreateEncryptor(rgbKey,rgbIV),CryptoStreamMode.Write);
    cStream.Write(inputByteArray,0,inputByteArray.Length);
    cStream.FlushFinalBlock();
    return Convert.ToBase64String(mStream.ToArray());
    }
    catch
    {
    return encryptString;
    }
    } /// <summary>
    /// DES解密字符串
    /// </summary>
    /// <param name="decryptString">待解密的字符串</param>
    /// <param name="decryptKey">解密密钥,要求为8位,和加密密钥相同</param>
    /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
    public static string DecryptDES(string decryptString,string decryptKey)
    {
    try
    {
    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey);
    byte[] rgbIV = Keys;
    byte[] inputByteArray = Convert.FromBase64String(decryptString);
    DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider();
    MemoryStream mStream = new MemoryStream();
    CryptoStream cStream = new CryptoStream(mStream,DCSP.CreateDecryptor(rgbKey,rgbIV),CryptoStreamMode.Write);
    cStream.Write(inputByteArray,0,inputByteArray.Length);
    cStream.FlushFinalBlock();
    return Encoding.UTF8.GetString(mStream.ToArray());
    }
    catch
    {
    return decryptString;
    }
    } /// <summary>
    /// DES加密文件
    /// </summary>
    /// <param name="inFilePath">待加密文件</param>
    /// <param name="outFilePath">加密后的文件</param>
    /// <param name="encryptKey">加密密钥</param>
    /// <returns></returns>
    public static bool EncryptDES(string inFilePath,string outFilePath,string encryptKey)
    {  
    byte[] rgbIV= Keys;
    try
    {
    byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0,8));
    //读入的流
    FileStream inFs = new FileStream(inFilePath, FileMode.Open, FileAccess.Read);
    //待写的流
    FileStream outFs = new FileStream(outFilePath, FileMode.OpenOrCreate, FileAccess.Write);
    outFs.SetLength(0);
    //创建一个变量来帮助读写
    byte[] byteIn  = new byte[100]; //临时存放读入的流
    long readLen  = 0;              //读入流的长度
    long totalLen = inFs.Length;    //总共读入流的长度
    int  everyLen;                  //每次读入流动长度
    //读入InFs,加密后写入OutFs
    DES des = new DESCryptoServiceProvider();          
    CryptoStream encStream = new CryptoStream(outFs, des.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 
    while(readLen < totalLen)
    {
    everyLen = inFs.Read(byteIn, 0, 100);
    encStream.Write(byteIn, 0, everyLen);
    readLen = readLen + everyLen; 
    }
    encStream.Close();  
    outFs.Close();
    inFs.Close();
    return true;//加密成功
    }
    catch
    {
    return false;//加密失败 
    }
    }
    /// <summary>
    /// DES解密文件
    /// </summary>
    /// <param name="inFilePath">待解密文件</param>
    /// <param name="outFilePath">待加密文件</param>
    /// <param name="decryptKey">解密密钥</param>
    /// <returns></returns>
    public static bool DecryptDES(string inFilePath,string outFilePath,string decryptKey)
    {
    byte[] rgbIV= Keys;
    try
    {
    byte[] rgbKey = Encoding.UTF8.GetBytes(decryptKey.Substring(0,8));
    //读入的流
    FileStream inFs = new FileStream(inFilePath, FileMode.Open, FileAccess.Read);
    //待写的流
    FileStream outFs = new FileStream(outFilePath, FileMode.OpenOrCreate, FileAccess.Write);
    outFs.SetLength(0);
    //创建一个变量来帮助读写
    byte[] byteIn  = new byte[100]; //临时存放读入的流
    long readLen  = 0;              //读入流的长度
    long totalLen = inFs.Length;    //总共读入流的长度
    int  everyLen;                  //每次读入流动长度
    //读入InFs,解密后写入OutFs
    DES des = new DESCryptoServiceProvider();          
    CryptoStream encStream = new CryptoStream(outFs, des.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write); 
    while(readLen < totalLen)
    {
    everyLen = inFs.Read(byteIn, 0, 100);
    encStream.Write(byteIn, 0, everyLen);
    readLen = readLen + everyLen; 
    }
    encStream.Close();  
    outFs.Close();
    inFs.Close();
    return true;//解密成功
    }
    catch
    {
    return false;//解密失败 
    }
    }
    }
    }
      

  3.   

    楼上 jiezhi() 方法可行!