概述
随着信息技术的发展,计算机网络为信息的获取、传输、处理、利用与共享提供了一个高效、快捷、安全的通信环境和传输通道,网络信息安全也变得越来越重要。信息安全主要包括两个方面的内容:信息存储安全和信息传输安全。保证网络中信息安全的主要技术是数据的加密与解密。如下图示,说明了加密与解密的过程。.

涉及知识点
-
HASH算法 :散列函数是现代密码系统的基础。这些函数将任意长度的二进制字符串映射为固定长度的二进制字符串(称为散列值) -
对称加密算法:指对信息的加密和解密都使用相同的密钥。 -
非对称加密算法:非对称加密算法对信息的加密与解密使用不同的密钥,用来加密的密钥是可以公开的,用来解密的密钥需要保密 -
数字签名术:数字签名技术结合散列算法和非对称加密技术来进行篡改检测和解决相关的身份验证问题。这就像在现实生活中用亲笔签名来保证文件或资料的真实性一样。
散列算法


using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace DemoCrtpto{/// <summary>/// 信息摘要帮助类/// </summary>public class HashHelper{#region 信息摘要/// <summary>/// MD5信息摘要/// </summary>/// <param name="source"></param>/// <returns></returns>public static string GetInfoByMd5(string source){HashAlgorithm hash = getHashAlgorithm(HashType.MD5);return Encrypto(hash, source);}public static string GetInfoBySHA1(string source){HashAlgorithm hash = getHashAlgorithm(HashType.SHA1);return Encrypto(hash, source);}public static string GetInfoBySHA256(string source){HashAlgorithm hash = getHashAlgorithm(HashType.SHA256);return Encrypto(hash, source);}public static string GetInfoBySHA384(string source){HashAlgorithm hash = getHashAlgorithm(HashType.SHA384);return Encrypto(hash, source);}public static string GetInfoBySHA512(string source){HashAlgorithm hash = getHashAlgorithm(HashType.SHA512);return Encrypto(hash, source);}public static string GetInfoByRipeMD(string source){HashAlgorithm hash = getHashAlgorithm(HashType.RIPEMD);return Encrypto(hash, source);}#endregion/// <summary>/// 根据类型获取摘要算法名称/// </summary>/// <param name="t"></param>/// <returns></returns>private static HashAlgorithm getHashAlgorithm(HashType t) {HashAlgorithm hash;switch (t) {case HashType.MD5:hash = new MD5CryptoServiceProvider();break;case HashType.SHA1:hash = new SHA1Managed();break;case HashType.SHA256:hash = new SHA256Managed();break;case HashType.SHA384:hash = new SHA384Managed();break;case HashType.SHA512:hash = new SHA512Managed();break;case HashType.RIPEMD:hash = new RIPEMD160Managed();break;default:hash = new MD5CryptoServiceProvider();break;}return hash;}/// <summary>/// 加密/// </summary>/// <param name="hash"></param>/// <param name="source"></param>/// <returns></returns>private static string Encrypto(HashAlgorithm hash, string source) {string dest = string.Empty;try{byte[] btSource = Encoding.Default.GetBytes(source);byte[] btDest = hash.ComputeHash(btSource);dest = Convert.ToBase64String(btDest, 0, btDest.Length);}catch (Exception ex){throw ex;}return dest;}}/// <summary>/// 信息摘要类型/// </summary>public enum HashType {MD5=0,SHA1=1,SHA256=2,SHA384=3,SHA512=4,RIPEMD=5}}
对称加密算法
关于对称加密算法,主要有DES【Data Encryption Standard / 数据加密标准】 , 3DES【三重数据加密算法】,RC2【Rivest Cipher】,Rijndael【又称AES:Advanced Encryption Standard】。如下图所示:


using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace DemoCrtpto{/// <summary>/// 对称加密算法帮助类/// </summary>public class SymHelper{#region DES加密/// <summary>/// DES加密/// </summary>/// <param name="source"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetEnCryptoInfoByDES(string source, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);return Encrypto(sym, source, key, iv);}/// <summary>/// DES解密/// </summary>/// <param name="dest"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetDeCryptoInfoByDES(string dest, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES);return Decrypto(sym, dest, key, iv);}#endregion#region RC2加密与解密/// <summary>/// RC2加密/// </summary>/// <param name="source"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetEnCryptoInfoByRC2(string source, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);return Encrypto(sym, source, key, iv);}/// <summary>/// RC2解密/// </summary>/// <param name="dest"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetDeCryptoInfoByRC2(string dest, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2);return Decrypto(sym, dest, key, iv);}#endregion#region 3DES加密与解密/// <summary>/// 3DES加密/// </summary>/// <param name="source"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetEnCryptoInfoBy3DES(string source, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);return Encrypto(sym, source, key, iv);}/// <summary>/// 3DES解密/// </summary>/// <param name="dest"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetDeCryptoInfoBy3DES(string dest, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES);return Decrypto(sym, dest, key, iv);}#endregion#region Rijndael加密与解密/// <summary>/// Rijndael加密/// </summary>/// <param name="source"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetEnCryptoInfoByRijndael(string source, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);return Encrypto(sym, source, key, iv);}/// <summary>/// Rijndael解密/// </summary>/// <param name="dest"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>public static string GetDeCryptoInfoByRijndael(string dest, string key, string iv){SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael);return Decrypto(sym, dest, key, iv);}#endregionpublic static SymmetricAlgorithm getSymmetricAlgorithm(SymType t){SymmetricAlgorithm sym;switch (t){case SymType.DES:sym = new DESCryptoServiceProvider();break;case SymType.RC2:sym = new RC2CryptoServiceProvider();break;case SymType.TripleDES:sym = new TripleDESCryptoServiceProvider();break;case SymType.Rijndael:sym = new RijndaelManaged();break;default:sym = new DESCryptoServiceProvider();break;}return sym;}/// <summary>/// 加密/// </summary>/// <param name="sym"></param>/// <param name="source"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>private static string Encrypto(SymmetricAlgorithm sym, string source, string key, string iv){string dest = string.Empty;try{byte[] btnSource = Encoding.Default.GetBytes(source);//1.创建对称加密算法实例创建对称加密算法实例sym.Mode = CipherMode.CBC;int keyLen = sym.LegalKeySizes[0].MaxSize / 8;int ivLen = sym.BlockSize / 8;if (key.Length < keyLen){key = key.PadRight(keyLen, '0');}if (iv.Length < ivLen){iv = iv.PadRight(ivLen, '0');}//使用 PBKDF1 算法的扩展从密码派生密钥PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,ASCIIEncoding.ASCII.GetBytes("123456"));//2.设置初始化参数,包括密钥和初始化向量等sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);sym.IV = Encoding.Default.GetBytes(iv);//3.使用CreateEncryptor方法创建加密实例ICryptoTransform trans = sym.CreateEncryptor();//4.创建加密流MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Write);//5.利用加密流进行数据加密cs.Write(btnSource, 0, btnSource.Length);cs.FlushFinalBlock();//6.返回密文byte[] cryptoByte = ms.ToArray();dest = Convert.ToBase64String(cryptoByte, 0, cryptoByte.GetLength(0));}catch (Exception ex){throw ex;}return dest;}/// <summary>/// 解密/// </summary>/// <param name="sym"></param>/// <param name="dest"></param>/// <param name="key"></param>/// <param name="iv"></param>/// <returns></returns>private static string Decrypto(SymmetricAlgorithm sym, string dest, string key, string iv){string source = string.Empty;try{byte[] btnDest = Convert.FromBase64String(dest);//1.创建对称加密算法实例创建对称加密算法实例sym.Mode = CipherMode.CBC;int keyLen = sym.LegalKeySizes[0].MaxSize / 8;int ivLen = sym.BlockSize / 8;if (key.Length < keyLen){key = key.PadRight(keyLen, '0');}if (iv.Length < ivLen){iv = iv.PadRight(ivLen, '0');}//使用 PBKDF1 算法的扩展从密码派生密钥PasswordDeriveBytes pkey = new PasswordDeriveBytes(key,ASCIIEncoding.ASCII.GetBytes("123456"));//2.设置初始化参数,包括密钥和初始化向量等sym.Key = pkey.GetBytes(key.Length); //Encoding.Default.GetBytes(key);sym.IV = Encoding.Default.GetBytes(iv);//3.使用CreateDecryptor方法创建解密实例ICryptoTransform trans = sym.CreateDecryptor();//4.创建解密流MemoryStream ms = new MemoryStream(btnDest, 0, btnDest.Length);CryptoStream cs = new CryptoStream(ms, trans, CryptoStreamMode.Read);//5.返回明文StreamReader sr = new StreamReader(cs);source = sr.ReadToEnd();}catch (Exception ex){throw ex;}return source;}}/// <summary>/// 加密类型/// </summary>public enum SymType {DES=0,RC2=1,TripleDES=2,Rijndael=3}}
非对称加密算法和数字签名



using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace DemoCrtpto{/// <summary>/// 非对称加密算法帮助类/// </summary>public class AsymHelper{}public class DSAHelper {private static string keyContainerName = "star";private static string m_PriKey = string.Empty;private static string m_PubKey = string.Empty;public static string PriKey{get{return m_PriKey;}set{m_PriKey = value;}}public static string PubKey{get{return m_PubKey;}set{m_PubKey = value;}}public static void generateKey(){CspParameters m_CspParameters;m_CspParameters = new CspParameters();m_CspParameters.KeyContainerName = keyContainerName;DSACryptoServiceProvider asym = new DSACryptoServiceProvider();m_PriKey = asym.ToXmlString(true);m_PubKey = asym.ToXmlString(false);asym.PersistKeyInCsp = false;asym.Clear();}public static string Encrypto(string source) {if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey)){generateKey();}return getEncryptoInfoByDSA(source);}/// <summary>/// 创建数字签名/// </summary>/// <param name="source"></param>/// <returns></returns>public static string getEncryptoInfoByDSA(string source){string dest = string.Empty;string ss = HashHelper.GetInfoBySHA1(source);byte[] btSource = Convert.FromBase64String(ss);DSACryptoServiceProvider asym = new DSACryptoServiceProvider();asym.FromXmlString(m_PriKey);DSASignatureFormatter dsaFormatter = new DSASignatureFormatter(asym);dsaFormatter.SetHashAlgorithm("SHA1");byte[] btDest = dsaFormatter.CreateSignature(btSource);dest = Convert.ToBase64String(btDest);return dest;}/// <summary>/// 验证数字签名/// </summary>/// <param name="source"></param>/// <param name="dest"></param>/// <returns></returns>public static bool verifyInfo(string source, string dest){string ss = HashHelper.GetInfoBySHA1(source);byte[] btnSource = Convert.FromBase64String(ss);byte[] btnDest = Convert.FromBase64String(dest);DSACryptoServiceProvider asym = new DSACryptoServiceProvider();asym.FromXmlString(m_PubKey);DSASignatureDeformatter dsaFormatter = new DSASignatureDeformatter(asym);dsaFormatter.SetHashAlgorithm("SHA1");return dsaFormatter.VerifySignature(btnSource, btnDest);}}public class RSAHelper {private static string keyContainerName = "star";private static string m_PriKey = string.Empty;private static string m_PubKey = string.Empty;public static string PriKey{get{return m_PriKey;}set{m_PriKey = value;}}public static string PubKey{get{return m_PubKey;}set{m_PubKey = value;}}public static string Encrypto(string source) {if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey)) {generateKey();}return getEncryptoInfoByRSA(source);}public static string Decrypto(string dest) {if (string.IsNullOrEmpty(m_PubKey) && string.IsNullOrEmpty(m_PriKey)){generateKey();}return getDecryptoInfoByRSA(dest);}public static void generateKey(){CspParameters m_CspParameters;m_CspParameters = new CspParameters();m_CspParameters.KeyContainerName = keyContainerName;RSACryptoServiceProvider asym = new RSACryptoServiceProvider(m_CspParameters);m_PriKey = asym.ToXmlString(true);m_PubKey = asym.ToXmlString(false);asym.PersistKeyInCsp = false;asym.Clear();}public static string getEncryptoInfoByRSA(string source){byte[] plainByte = Encoding.ASCII.GetBytes(source);//初始化参数RSACryptoServiceProvider asym = new RSACryptoServiceProvider();asym.FromXmlString(m_PubKey);int keySize = asym.KeySize / 8;//非对称加密,每次的长度不能太长,否则会报异常int bufferSize = keySize - 11;if (plainByte.Length > bufferSize) {throw new Exception("非对称加密最多支持【"+bufferSize+"】字节,实际长度【"+plainByte.Length+"】字节。");}byte[] cryptoByte = asym.Encrypt(plainByte, false);return Convert.ToBase64String(cryptoByte);}public static string getDecryptoInfoByRSA(string dest){byte[] btDest = Convert.FromBase64String(dest);//初始化参数RSACryptoServiceProvider asym = new RSACryptoServiceProvider();asym.FromXmlString(m_PriKey);int keySize = asym.KeySize / 8;//非对称加密,每次的长度不能太长,否则会报异常//int bufferSize = keySize - 11;if (btDest.Length > keySize){throw new Exception("非对称解密最多支持【" + keySize + "】字节,实际长度【" + btDest.Length + "】字节。");}byte[] cryptoByte = asym.Decrypt(btDest, false);return Encoding.ASCII.GetString(cryptoByte);}}public enum AsymType{DSA=0,RSA=1}}