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
}
}
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
}
}
解决方案 »
- 在C#中需要实现两个基类中方法的问题
- C# 关于comboBox模糊查询的问题
- 列出南京劣质(员工口碑差)的IT企业
- 急!求救:能否实现鼠标悬浮事件:比如金山词霸中的‘屏幕取词’功能?
- 不包含适合于入口点的静态“Main”方法的问题
- VS2003自带的打包程序可以在安装过程中运行bat文件吗?
- 怎么让我的程序在windows启动好了的时候就自动启动呢?注意,不用登陆windows用户,比如sql server2000
- excel的问题,终于找到了,但是有出现问题
- 请教有繁体版软件开发经验的老兄
- 添加新的datarow错误,大家帮忙看一下
- 请对C Sharp感兴趣的朋友们加入本群。群号:11183673(C Sharp 联盟)。顶者有分哟。
- 我想获取正在运行中的程序A,有几个正在操作系统中运行?
{
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
望大家帮忙,谢谢
{
/// <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;//解密失败
}
}
}
}