Rijndael对称算法加密和解密功能实现,密码及加密字符串可以包含中文。
1
using System;
2
using System.Security.Cryptography;
3
using System.Text;
4
5
namespace SKPublic
6

{
7
8
/**//// <summary>
9
/// 实现Rijndael对称算法加密和解密功能
10
/// </summary>
11
internal sealed class SKCrypto
12
{
13
私有常量#region 私有常量
14
15
/**//// <summary>
16
/// 随机字符串,当密钥字符串长度不够时,用以补足长度
17
/// </summary>
18
private const string c_RandomKey = "~4`-*(#65!@|/%=^70&2$_+9:;)8[31}";
19
20
#endregion 私有常量
21
22
私有变量#region 私有变量
23
24
/**//// <summary>
25
/// Rijndael对称加密算法托管对象
26
/// </summary>
27
private RijndaelManaged m_Rijndael = new RijndaelManaged();
28
29
/**//// <summary>
30
/// 密钥字符串
31
/// </summary>
32
private string m_Key = "SharkooPass";
33
34
#endregion 私有变量
35
36
构造函数#region 构造函数
37
38
/**//// <summary>
39
/// 构造函数
40
/// </summary>
41
/// <param name="Key">密钥字符串</param>
42
public SKCrypto( string Key )
43
{
44
this.m_Key = Key;
45
46
// 有效密钥大小由对称算法的具体实现指定,并且在 LegalKeySizes 属性中列出。这个可不能瞎设
47
this.m_Rijndael.KeySize = 256;
48
this.m_Rijndael.BlockSize = 256;
49
}
50
51
/**//// <summary>
52
/// 构造函数
53
/// </summary>
54
public SKCrypto()
55
{
56
this.m_Rijndael.KeySize = 256;
57
this.m_Rijndael.BlockSize = 256;
58
}
59
60
#endregion 构造函数
61
62
私有方法#region 私有方法
63
64
/**//// <summary>
65
/// 生成密钥
66
/// </summary>
67
/// <returns>密钥数组</returns>
68
private byte[] GetLegalKey()
69
{
70
string keyTmp = this.m_Key;
71
72
// 一个字符转成1个字节也就是8位,256/8=32,如果使用其他密钥长度,要修改成对应的值
73
if ( keyTmp.Length < 32 )
74
{
75
keyTmp += c_RandomKey.Substring( 0, 32 - keyTmp.Length );
76
}
77
else if ( keyTmp.Length > 32 )
78
{
79
keyTmp = keyTmp.Substring( 0, 32 );
80
}
81
82
// 转换字符串到Byte数组
83
// 此处建议使用ASCIIEncoding.ASCII而不要使用ASCIIEncoding.Default或者Encoding.GetEncoding( "GB2312" )
84
// 来获取编码。否则的话,当密钥字串包含中文,所获得的数组长度可能会不符合密钥长度要求。当然你也可以做
85
// 相应的处理来解决这个问题。
86
return ASCIIEncoding.ASCII.GetBytes( keyTmp );
87
88
}
89
90
#endregion 私有方法
91
92
公共方法#region 公共方法
93
94
/**//// <summary>
95
/// 加密
96
/// </summary>
97
/// <param name="Source">源字符串</param>
98
/// <returns>加密字符串</returns>
99
public string Encrypting( string Source )
100
{
101
// 当然你也可以使用以下语句来确保支持中文
102
// byte[] bytIn = Encoding.GetEncoding( "GB2312" ).GetBytes( Source );
103
byte[] bytIn = ASCIIEncoding.Default.GetBytes( Source );
104
105
System.IO.MemoryStream ms = new System.IO.MemoryStream();
106
107
byte[] bytKey = GetLegalKey();
108
109
m_Rijndael.Key = bytKey;
110
m_Rijndael.IV = bytKey;
111
112
ICryptoTransform encrypto = m_Rijndael.CreateEncryptor();
113
CryptoStream cs = new CryptoStream( ms, encrypto, CryptoStreamMode.Write );
114
115
cs.Write( bytIn, 0, bytIn.Length );
116
cs.FlushFinalBlock();
117
118
byte[] bytOut = ms.ToArray();
119
120
cs.Clear();
121
cs.Close();
122
123
return Convert.ToBase64String( bytOut, 0, bytOut.Length );
124
}
125
126
/**//// <summary>
127
/// 解密
128
/// </summary>
129
/// <param name="Source">源加密字符串</param>
130
/// <returns>解密字符串</returns>
131
public string Decrypting( string Source )
132
{
133
byte[] bytIn = System.Convert.FromBase64String( Source );
134
135
System.IO.MemoryStream ms = new System.IO.MemoryStream( bytIn );
136
137
byte[] bytKey = GetLegalKey();
138
139
m_Rijndael.Key = bytKey;
140
m_Rijndael.IV = bytKey;
141
142
ICryptoTransform encrypto = m_Rijndael.CreateDecryptor();
143
CryptoStream cs = new CryptoStream( ms, encrypto, CryptoStreamMode.Read );
144
145
byte[] bytOut = new byte[ bytIn.Length ];
146
cs.Read( bytOut, 0, bytOut.Length );
147
cs.Clear();
148
cs.Close();
149
150
// 当然你也可以使用以下语句来确保支持中文
151
// return Encoding.GetEncoding( "GB2312" ).GetString( bytOut ).TrimEnd( new char[] { '\0' } );
152
return ASCIIEncoding.Default.GetString( bytOut ).TrimEnd( new char[]
{ '\0' } );
153
}
154
155
#endregion 公共方法
156
}
157
}
158
using System;2
using System.Security.Cryptography;3
using System.Text;4

5
namespace SKPublic6


{7

8

/**//// <summary>9
/// 实现Rijndael对称算法加密和解密功能10
/// </summary>11
internal sealed class SKCrypto12

{13

私有常量#region 私有常量14

15

/**//// <summary>16
/// 随机字符串,当密钥字符串长度不够时,用以补足长度17
/// </summary>18
private const string c_RandomKey = "~4`-*(#65!@|/%=^70&2$_+9:;)8[31}";19

20
#endregion 私有常量21

22

私有变量#region 私有变量23

24

/**//// <summary>25
/// Rijndael对称加密算法托管对象26
/// </summary>27
private RijndaelManaged m_Rijndael = new RijndaelManaged();28

29

/**//// <summary>30
/// 密钥字符串31
/// </summary>32
private string m_Key = "SharkooPass";33

34
#endregion 私有变量35

36

构造函数#region 构造函数37

38

/**//// <summary>39
/// 构造函数40
/// </summary>41
/// <param name="Key">密钥字符串</param>42
public SKCrypto( string Key )43

{44
this.m_Key = Key;45

46
// 有效密钥大小由对称算法的具体实现指定,并且在 LegalKeySizes 属性中列出。这个可不能瞎设47
this.m_Rijndael.KeySize = 256;48
this.m_Rijndael.BlockSize = 256;49
}50

51

/**//// <summary>52
/// 构造函数53
/// </summary>54
public SKCrypto()55

{56
this.m_Rijndael.KeySize = 256;57
this.m_Rijndael.BlockSize = 256;58
}59

60
#endregion 构造函数61

62

私有方法#region 私有方法63

64

/**//// <summary>65
/// 生成密钥66
/// </summary>67
/// <returns>密钥数组</returns>68
private byte[] GetLegalKey()69

{70
string keyTmp = this.m_Key;71

72
// 一个字符转成1个字节也就是8位,256/8=32,如果使用其他密钥长度,要修改成对应的值73
if ( keyTmp.Length < 32 )74

{75
keyTmp += c_RandomKey.Substring( 0, 32 - keyTmp.Length );76
}77
else if ( keyTmp.Length > 32 )78

{79
keyTmp = keyTmp.Substring( 0, 32 );80
}81

82
// 转换字符串到Byte数组83
// 此处建议使用ASCIIEncoding.ASCII而不要使用ASCIIEncoding.Default或者Encoding.GetEncoding( "GB2312" )84
// 来获取编码。否则的话,当密钥字串包含中文,所获得的数组长度可能会不符合密钥长度要求。当然你也可以做85
// 相应的处理来解决这个问题。86
return ASCIIEncoding.ASCII.GetBytes( keyTmp );87

88
}89

90
#endregion 私有方法91

92

公共方法#region 公共方法93

94

/**//// <summary>95
/// 加密96
/// </summary>97
/// <param name="Source">源字符串</param>98
/// <returns>加密字符串</returns>99
public string Encrypting( string Source )100

{101
// 当然你也可以使用以下语句来确保支持中文102
// byte[] bytIn = Encoding.GetEncoding( "GB2312" ).GetBytes( Source );103
byte[] bytIn = ASCIIEncoding.Default.GetBytes( Source );104

105
System.IO.MemoryStream ms = new System.IO.MemoryStream();106

107
byte[] bytKey = GetLegalKey();108

109
m_Rijndael.Key = bytKey;110
m_Rijndael.IV = bytKey;111

112
ICryptoTransform encrypto = m_Rijndael.CreateEncryptor();113
CryptoStream cs = new CryptoStream( ms, encrypto, CryptoStreamMode.Write );114

115
cs.Write( bytIn, 0, bytIn.Length );116
cs.FlushFinalBlock();117

118
byte[] bytOut = ms.ToArray();119

120
cs.Clear();121
cs.Close();122

123
return Convert.ToBase64String( bytOut, 0, bytOut.Length );124
}125

126

/**//// <summary>127
/// 解密128
/// </summary>129
/// <param name="Source">源加密字符串</param>130
/// <returns>解密字符串</returns>131
public string Decrypting( string Source )132

{133
byte[] bytIn = System.Convert.FromBase64String( Source );134

135
System.IO.MemoryStream ms = new System.IO.MemoryStream( bytIn );136

137
byte[] bytKey = GetLegalKey();138

139
m_Rijndael.Key = bytKey;140
m_Rijndael.IV = bytKey;141

142
ICryptoTransform encrypto = m_Rijndael.CreateDecryptor();143
CryptoStream cs = new CryptoStream( ms, encrypto, CryptoStreamMode.Read );144

145
byte[] bytOut = new byte[ bytIn.Length ];146
cs.Read( bytOut, 0, bytOut.Length );147
cs.Clear();148
cs.Close();149

150
// 当然你也可以使用以下语句来确保支持中文151
// return Encoding.GetEncoding( "GB2312" ).GetString( bytOut ).TrimEnd( new char[] { '\0' } );152

return ASCIIEncoding.Default.GetString( bytOut ).TrimEnd( new char[]
{ '\0' } );153
}154

155
#endregion 公共方法156
}157
}158
