使用TripleDES进行加密和解密的方法
1
using System;2
using System.Collections.Generic;3
using System.Text;4
using System.IO;5
using System.Security.Cryptography;6

7
namespace Sun.Yi.Csharp.Security8
{9
/// <summary>10
/// 使用TripleDES处理加密和解密的方法11
/// </summary>12
class TripleDESProcess13
{14
#region 内部私有变量15

16
/// <summary>17
/// 指定的密钥(Key)18
/// </summary>19
private byte[] bytDesKey;20

21
/// <summary>22
/// 初始化向量(IV)23
/// </summary>24
private byte[] bytDesIV;25

26
/// <summary>27
/// 空白字节的填充字符28
/// </summary>29
private char chrFillChar;30

31
/// <summary>32
/// 发生错误后的错误信息33
/// </summary>34
private string strErrorMessage;35

36
/// <summary>37
/// 已经被加密的文字长度(需要解密的文字内容,长度必须小于该值)38
/// </summary>39
private const int EncryptLength = 56;40
/// <summary>41
/// 没有被加密的文字长度(需要加密的文字内容,长度必须小于该值)42
/// </summary>43
private const int DecryptLength = 50;44
/// <summary>45
/// 密钥和初始化向量的长度(密钥和初始化向量的长度必须等于该值)46
/// </summary>47
private const int KeyLength = 16;48

49
#endregion50

51
#region 公共属性52

53
/// <summary>54
/// 指定的密钥(Key)55
/// </summary>56
public string DesKey57
{58
get59
{60
return Encoding.ASCII.GetString(this.bytDesKey);61
}62
set63
{64
this.bytDesKey = Encoding.ASCII.GetBytes(value);65
}66
}67

68
/// <summary>69
/// 初始化向量(IV)70
/// </summary>71
public string DesIV72
{73
get74
{75
return Encoding.ASCII.GetString(this.bytDesIV);76
}77
set78
{79
this.bytDesIV = Encoding.ASCII.GetBytes(value);80
}81
}82

83
/// <summary>84
/// 空白字节的填充字符85
/// </summary>86
public char FillChar87
{88
get89
{90
return this.chrFillChar;91
}92
set93
{94
this.chrFillChar = value;95
}96
}97

98
/// <summary>99
/// 发生错误后的错误信息100
/// </summary>101
public string ErrorMessage102
{103
get104
{105
return this.strErrorMessage;106
}107
}108

109
#endregion110

111
构造函数138

139
#region 公共方法140

141
/// <summary>142
/// 使用TripleDES加密143
/// </summary>144
/// <param name="content">需要加密的文字内容</param>145
/// <returns>加密后的文字内容,当出现错误时返回null</returns>146
public string Encrypt(string content)147
{148
try149
{150
if (IsEmpty(content) || IsKeyError(bytDesKey) || IsKeyError(bytDesIV))151
{152
return null;153
}154
byte[] bInContent = Encoding.ASCII.GetBytes(content.PadRight(50, this.chrFillChar));155
if (IsOverflow(bInContent, DecryptLength))156
{157
return null;158
}159
byte[] bOutContent = new byte[EncryptLength];160
MemoryStream memoryStream = new MemoryStream(bOutContent);161
TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();162
using (CryptoStream cryptoStream =163
new CryptoStream(memoryStream, provider.CreateEncryptor(bytDesKey, bytDesIV), CryptoStreamMode.Write))164
{165
cryptoStream.Write(bInContent, 0, bInContent.Length);166
cryptoStream.Close();167
}168
return Convert.ToBase64String(bOutContent);169
}170
catch (Exception ex)171
{172
strErrorMessage = ex.Message;173
return null;174
}175
}176

177
/// <summary>178
/// 使用TripleDES解密179
/// </summary>180
/// <param name="content">需要解密的文字内容</param>181
/// <returns>解密后的文字内容,当出现错误时返回null</returns>182
public string Decrypt(string content)183
{184
try185
{186
if (IsEmpty(content) || IsKeyError(bytDesKey) || IsKeyError(bytDesIV))187
{188
return null;189
}190
byte[] bInContent = Convert.FromBase64String(content);191
if (IsOverflow(bInContent, EncryptLength))192
{193
return null;194
}195
byte[] bOutContent = new byte[DecryptLength];196
MemoryStream memoryStream = new MemoryStream(bInContent);197
TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider();198
using (CryptoStream cryptoStream199
= new CryptoStream(memoryStream, provider.CreateDecryptor(bytDesKey, bytDesIV), CryptoStreamMode.Read))200
{201
cryptoStream.Read(bOutContent, 0, bOutContent.Length);202
cryptoStream.Close();203
}204
return Encoding.ASCII.GetString(bOutContent).TrimEnd(this.chrFillChar);205
}206
catch (Exception ex)207
{208
strErrorMessage = ex.Message;209
return null;210
}211
}212

213
#endregion214

215
私有方法273
}274
}275



浙公网安备 33010602011771号