1 using System; 2 using System.IO; 3 using System.Security.Cryptography; 4 using System.Text; 5 6 namespace Wen.Helpers 7 { 8 /// <summary> 9 /// 安全助手 10 /// </summary> 11 public sealed class SecurityHelper 12 { 13 private static readonly byte [] IvBytes = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; 14 15 #region 通用加密算法 16 17 /// <summary> 18 /// 哈希加密算法 19 /// </summary> 20 /// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param> 21 /// <param name="input"> 待加密的字符串 </param> 22 /// <param name="encoding"> 字符编码 </param> 23 /// <returns></returns> 24 private static string HashEncrypt( HashAlgorithm hashAlgorithm, string input, Encoding encoding) 25 { 26 var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input)); 27 28 return BitConverter .ToString(data).Replace( "-", "" ); 29 } 30 31 /// <summary> 32 /// 验证哈希值 33 /// </summary> 34 /// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param> 35 /// <param name="unhashedText"> 未加密的字符串 </param> 36 /// <param name="hashedText"> 经过加密的哈希值 </param> 37 /// <param name="encoding"> 字符编码 </param> 38 /// <returns></returns> 39 private static bool VerifyHashValue( HashAlgorithm hashAlgorithm, string unhashedText, string hashedText, 40 Encoding encoding) 41 { 42 return string .Equals(HashEncrypt(hashAlgorithm, unhashedText, encoding), hashedText, 43 StringComparison .OrdinalIgnoreCase); 44 } 45 46 #endregion 通用加密算法 47 48 #region 哈希加密算法 49 50 #region MD5 算法 51 52 /// <summary> 53 /// MD5 加密 54 /// </summary> 55 /// <param name="input"> 待加密的字符串 </param> 56 /// <param name="encoding"> 字符编码 </param> 57 /// <returns></returns> 58 public static string MD5Encrypt( string input, Encoding encoding) 59 { 60 return HashEncrypt(MD5 .Create(), input, encoding); 61 } 62 63 /// <summary> 64 /// 验证 MD5 值 65 /// </summary> 66 /// <param name="input"> 未加密的字符串 </param> 67 /// <param name="encoding"> 字符编码 </param> 68 /// <returns></returns> 69 public static bool VerifyMD5Value( string input, Encoding encoding) 70 { 71 return VerifyHashValue(MD5 .Create(), input, MD5Encrypt(input, encoding), encoding); 72 } 73 74 #endregion MD5 算法 75 76 #region SHA1 算法 77 78 /// <summary> 79 /// SHA1 加密 80 /// </summary> 81 /// <param name="input"> 要加密的字符串 </param> 82 /// <param name="encoding"> 字符编码 </param> 83 /// <returns></returns> 84 public static string SHA1Encrypt( string input, Encoding encoding) 85 { 86 return HashEncrypt(SHA1 .Create(), input, encoding); 87 } 88 89 /// <summary> 90 /// 验证 SHA1 值 91 /// </summary> 92 /// <param name="input"> 未加密的字符串 </param> 93 /// <param name="encoding"> 字符编码 </param> 94 /// <returns></returns> 95 public static bool VerifySHA1Value( string input, Encoding encoding) 96 { 97 return VerifyHashValue(SHA1 .Create(), input, SHA1Encrypt(input, encoding), encoding); 98 } 99 100 #endregion SHA1 算法 101 102 #region SHA256 算法 103 104 /// <summary> 105 /// SHA256 加密 106 /// </summary> 107 /// <param name="input"> 要加密的字符串 </param> 108 /// <param name="encoding"> 字符编码 </param> 109 /// <returns></returns> 110 public static string SHA256Encrypt( string input, Encoding encoding) 111 { 112 return HashEncrypt(SHA256 .Create(), input, encoding); 113 } 114 115 /// <summary> 116 /// 验证 SHA256 值 117 /// </summary> 118 /// <param name="input"> 未加密的字符串 </param> 119 /// <param name="encoding"> 字符编码 </param> 120 /// <returns></returns> 121 public static bool VerifySHA256Value( string input, Encoding encoding) 122 { 123 return VerifyHashValue(SHA256 .Create(), input, SHA256Encrypt(input, encoding), encoding); 124 } 125 126 #endregion SHA256 算法 127 128 #region SHA384 算法 129 130 /// <summary> 131 /// SHA384 加密 132 /// </summary> 133 /// <param name="input"> 要加密的字符串 </param> 134 /// <param name="encoding"> 字符编码 </param> 135 /// <returns></returns> 136 public static string SHA384Encrypt( string input, Encoding encoding) 137 { 138 return HashEncrypt(SHA384 .Create(), input, encoding); 139 } 140 141 /// <summary> 142 /// 验证 SHA384 值 143 /// </summary> 144 /// <param name="input"> 未加密的字符串 </param> 145 /// <param name="encoding"> 字符编码 </param> 146 /// <returns></returns> 147 public static bool VerifySHA384Value( string input, Encoding encoding) 148 { 149 return VerifyHashValue(SHA256 .Create(), input, SHA384Encrypt(input, encoding), encoding); 150 } 151 152 #endregion SHA384 算法 153 154 #region SHA512 算法 155 156 /// <summary> 157 /// SHA512 加密 158 /// </summary> 159 /// <param name="input"> 要加密的字符串 </param> 160 /// <param name="encoding"> 字符编码 </param> 161 /// <returns></returns> 162 public static string SHA512Encrypt( string input, Encoding encoding) 163 { 164 return HashEncrypt(SHA512 .Create(), input, encoding); 165 } 166 167 /// <summary> 168 /// 验证 SHA512 值 169 /// </summary> 170 /// <param name="input"> 未加密的字符串 </param> 171 /// <param name="encoding"> 字符编码 </param> 172 /// <returns></returns> 173 public static bool VerifySHA512Value( string input, Encoding encoding) 174 { 175 return VerifyHashValue(SHA512 .Create(), input, SHA512Encrypt(input, encoding), encoding); 176 } 177 178 #endregion SHA512 算法 179 180 #region HMAC-MD5 加密 181 182 /// <summary> 183 /// HMAC-MD5 加密 184 /// </summary> 185 /// <param name="input"> 要加密的字符串 </param> 186 /// <param name="key"> 密钥 </param> 187 /// <param name="encoding"> 字符编码 </param> 188 /// <returns></returns> 189 public static string HMACSMD5Encrypt( string input, string key, Encoding encoding) 190 { 191 return HashEncrypt(new HMACMD5 (encoding.GetBytes(key)), input, encoding); 192 } 193 194 #endregion HMAC-MD5 加密 195 196 #region HMAC-SHA1 加密 197 198 /// <summary> 199 /// HMAC-SHA1 加密 200 /// </summary> 201 /// <param name="input"> 要加密的字符串 </param> 202 /// <param name="key"> 密钥 </param> 203 /// <param name="encoding"> 字符编码 </param> 204 /// <returns></returns> 205 public static string HMACSHA1Encrypt( string input, string key, Encoding encoding) 206 { 207 return HashEncrypt(new HMACSHA1 (encoding.GetBytes(key)), input, encoding); 208 } 209 210 #endregion HMAC-SHA1 加密 211 212 #region HMAC-SHA256 加密 213 214 /// <summary> 215 /// HMAC-SHA256 加密 216 /// </summary> 217 /// <param name="input"> 要加密的字符串 </param> 218 /// <param name="key"> 密钥 </param> 219 /// <param name="encoding"> 字符编码 </param> 220 /// <returns></returns> 221 public static string HMACSHA256Encrypt( string input, string key, Encoding encoding) 222 { 223 return HashEncrypt(new HMACSHA256 (encoding.GetBytes(key)), input, encoding); 224 } 225 226 #endregion HMAC-SHA256 加密 227 228 #region HMAC-SHA384 加密 229 230 /// <summary> 231 /// HMAC-SHA384 加密 232 /// </summary> 233 /// <param name="input"> 要加密的字符串 </param> 234 /// <param name="key"> 密钥 </param> 235 /// <param name="encoding"> 字符编码 </param> 236 /// <returns></returns> 237 public static string HMACSHA384Encrypt( string input, string key, Encoding encoding) 238 { 239 return HashEncrypt(new HMACSHA384 (encoding.GetBytes(key)), input, encoding); 240 } 241 242 #endregion HMAC-SHA384 加密 243 244 #region HMAC-SHA512 加密 245 246 /// <summary> 247 /// HMAC-SHA512 加密 248 /// </summary> 249 /// <param name="input"> 要加密的字符串 </param> 250 /// <param name="key"> 密钥 </param> 251 /// <param name="encoding"> 字符编码 </param> 252 /// <returns></returns> 253 public static string HMACSHA512Encrypt( string input, string key, Encoding encoding) 254 { 255 return HashEncrypt(new HMACSHA512 (encoding.GetBytes(key)), input, encoding); 256 } 257 258 #endregion HMAC-SHA512 加密 259 260 #endregion 哈希加密算法 261 262 #region 对称加密算法 263 264 #region Des 加解密 265 266 /// <summary> 267 /// DES 加密 268 /// </summary> 269 /// <param name="input"> 待加密的字符串 </param> 270 /// <param name="key"> 密钥(8位) </param> 271 /// <returns></returns> 272 public static string DESEncrypt( string input, string key) 273 { 274 try 275 { 276 var keyBytes = Encoding .UTF8.GetBytes(key); 277 //var ivBytes = Encoding.UTF8.GetBytes(iv); 278 279 var des = DES .Create(); 280 des.Mode = CipherMode .ECB; //兼容其他语言的 Des 加密算法 281 des.Padding = PaddingMode .Zeros; //自动补 0 282 283 using (var ms = new MemoryStream ()) 284 { 285 var data = Encoding .UTF8.GetBytes(input); 286 287 using (var cs = new CryptoStream (ms, des.CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode .Write) 288 ) 289 { 290 cs.Write(data, 0, data.Length); 291 cs.FlushFinalBlock(); 292 } 293 294 return Convert .ToBase64String(ms.ToArray()); 295 } 296 } 297 catch 298 { 299 return input; 300 } 301 } 302 303 /// <summary> 304 /// DES 解密 305 /// </summary> 306 /// <param name="input"> 待解密的字符串 </param> 307 /// <param name="key"> 密钥(8位) </param> 308 /// <returns></returns> 309 public static string DESDecrypt( string input, string key) 310 { 311 try 312 { 313 var keyBytes = Encoding .UTF8.GetBytes(key); 314 //var ivBytes = Encoding.UTF8.GetBytes(iv); 315 316 var des = DES .Create(); 317 des.Mode = CipherMode .ECB; //兼容其他语言的Des加密算法 318 des.Padding = PaddingMode .Zeros; //自动补0 319 320 using (var ms = new MemoryStream ()) 321 { 322 var data = Convert .FromBase64String(input); 323 324 using (var cs = new CryptoStream (ms, des.CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode .Write) 325 ) 326 { 327 cs.Write(data, 0, data.Length); 328 329 cs.FlushFinalBlock(); 330 } 331 332 return Encoding .UTF8.GetString(ms.ToArray()); 333 } 334 } 335 catch 336 { 337 return input; 338 } 339 } 340 341 #endregion Des 加解密 342 343 #endregion 对称加密算法 344 345 #region 非对称加密算法 346 347 /// <summary> 348 /// 生成 RSA 公钥和私钥 349 /// </summary> 350 /// <param name="publicKey"> 公钥 </param> 351 /// <param name="privateKey"> 私钥 </param> 352 public static void GenerateRSAKeys( out string publicKey, out string privateKey) 353 { 354 using (var rsa = new RSACryptoServiceProvider ()) 355 { 356 publicKey = rsa.ToXmlString( false ); 357 privateKey = rsa.ToXmlString( true ); 358 } 359 } 360 361 /// <summary> 362 /// RSA 加密 363 /// </summary> 364 /// <param name="publickey"> 公钥 </param> 365 /// <param name="content"> 待加密的内容 </param> 366 /// <returns> 经过加密的字符串 </returns> 367 public static string RSAEncrypt( string publickey, string content) 368 { 369 var rsa = new RSACryptoServiceProvider(); 370 rsa.FromXmlString(publickey); 371 var cipherbytes = rsa.Encrypt(Encoding .UTF8.GetBytes(content), false); 372 373 return Convert .ToBase64String(cipherbytes); 374 } 375 376 /// <summary> 377 /// RSA 解密 378 /// </summary> 379 /// <param name="privatekey"> 私钥 </param> 380 /// <param name="content"> 待解密的内容 </param> 381 /// <returns> 解密后的字符串 </returns> 382 public static string RSADecrypt( string privatekey, string content) 383 { 384 var rsa = new RSACryptoServiceProvider(); 385 rsa.FromXmlString(privatekey); 386 var cipherbytes = rsa.Decrypt(Convert .FromBase64String(content), false); 387 388 return Encoding .UTF8.GetString(cipherbytes); 389 } 390 391 #endregion 非对称加密算法 392 } 393 }