好久没有动手写博客了,来了深圳工作压力确实大,有时候想写点自己的东西,但是每天回来的好晚时不时的通宵,项目赶的非常急,真是从一个坑跳到另外一个坑。。。。。今天自己整理了一下关于数据解密的东西,根据网上一些人的博客,自己实践了一下这个加密算法,但是中间还是遇到了坑。。。。。有些人写的复杂,现在将其整理如下:
public class StringEncryption{
// 加密秘钥
private static string EncryptDES = {0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};
// entryptString 为要加密的字符串
// entryptKey 秘钥
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();
// 创建加密流对象
CryptoStrem cStream = new CryptStream(mSteam, dcsp.CreateEncrotor(rgbKey, rgbIV), CryptoStremModel.Write);
// 将字节流写入加密流对象
cStream.Write(inputByteArray, 0, inputByteArray.Length);
// 将数据压入基础流,用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区。
cStream.FlushFinalBlock();
// 关闭加密流对象
cStream.Close();
// 关闭内存流对象
mStream.Close();
return Convert.ToBase64String(mStream.ToArray());
}
catch{
return encryptString;
}
}
public static string DecryptDES(String descrypString, String descryptKey)
{
try{
// 将秘钥转化为字节
byte[] rgbKeys = Encoding.UTF8.GetBytes(descryptKey);
byte[] keyIV = keys;
// 将密文转换为字节
byte[] inputByteArray = Encoding.UTF8.GetBytes(descrypString);
// 创建加密转换器
DESCryptoServiceProvider dcsp = new DESCryptoServiceProvider();
// 方法一 通过对解密流对象进行读操作将解密后的数据读取出来
// 创建内存流对象 并将密文传给它
MemoryStream mStream = new MemoryStream(inputByteArray);
// 创建解密流对象
CryptStream cStream = new CryptStream( mStream, dcsp.CreateDecrotor(rgbKeys,rgbIV), CryptoStremModel.Read);
//重新声明一个字节数组用来存放解密后的数据
byte[] finalBytes = new byte[cStream.ToArray().Length];
// 重解密流对象中 从位置为0开始读取长度为 cStream.ToArray().Length 的密文 ,并放入finalBytes数组
cStream.Read(finalBytes, 0, cStream.ToArray().Length);
// 方法二 通过写的方式,向解密流对象中写入要解密的数据,再直接从内存流中将解密后的值取出来
/*
// 创建内存流对象 并将密文传给它
MemoryStream mStream = new MemoryStream();
// 创建解密流对象
CryptStream cStream = new CryptStream( mStream, dcsp.CreateDecrotor(rgbKeys,rgbIV), CryptoStremModel.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
用了网上一些人的方法直接返回 cStream.ToArray(), 返回的对象是乱码。这是错误的!!!!
因为数据是放在内存流中的,要从内存流中将其取出来或者调用 cStream.Read()d的方法将数据从解密流对象中读取出来放入声明的数组(如上所示)
*/
return Encoding.UTF8.GetString(finalBytes);
}
catch
{
return descrypString
}
}
}
若有补充的,欢迎交流!!!!