C# 加密术
本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用。 概述随着信息技术的发展,计算机网络为信息的获取、传输、处理、利用与共享提供了一个高效、快捷、安全的通信环境和传输通道,网络信息安全也变得越来越重要。信息安全主要包括两个方面的内容:信息存储安全和信息传输安全。保证网络中信息安全的主要技术是数据的加密与解密。如下图示,说明了加密与解密的过程。 公式算法表示如下: 加密公式:c=Eke(m)? (11.1) 解密公式:m=Dkd(c)? (11.2)其中m代表明文,c代表密文,E是加密算法,D是解密算法,参数ke称为加密密钥,参数kd称为解密密钥 涉及知识点
?散列算法散列算法主要有MD5【Message Digest Algorithm】,RIPEMD160【RACE Integrity Primitives Evaluation Message Digest】和SHA【Secure Hash Algorithm】,SHA又分为SHA1,SHA256,SHA384,SHA512,【散列算法不可逆,是单向操作】如下如所示: 关于散列算法,效果图如下: HASH算法核心代码如下: 1 using System; 2 System.Collections.Generic; 3 System.Linq; 4 System.Security.Cryptography; 5 System.Text; 6 System.Threading.Tasks; 7 8 namespace DemoCrtpto 9 { 10 /// <summary> 11 /// 信息摘要帮助类 12 </summary> 13 public class HashHelper 14 { 15 #region 信息摘要 16 17 18 MD5信息摘要 19 20 <param name="source"></param> 21 <returns></returns> 22 static string GetInfoByMd5(string source) 23 { 24 HashAlgorithm hash = getHashAlgorithm(HashType.MD5); 25 return Encrypto(hash,source); 26 } 27 28 string GetInfoBySHA1( 29 30 HashAlgorithm hash = getHashAlgorithm(HashType.SHA1); 31 32 33 34 string GetInfoBySHA256( 35 36 HashAlgorithm hash = getHashAlgorithm(HashType.SHA256); 37 38 39 40 string GetInfoBySHA384( 41 42 HashAlgorithm hash = getHashAlgorithm(HashType.SHA384); 43 44 45 46 string GetInfoBySHA512( 47 48 HashAlgorithm hash = getHashAlgorithm(HashType.SHA512); 49 50 51 52 string GetInfoByRipeMD( 53 54 HashAlgorithm hash = getHashAlgorithm(HashType.RIPEMD); 55 56 57 58 #endregion 59 60 61 根据类型获取摘要算法名称 62 63 <param name="t"></param> 64 65 private static HashAlgorithm getHashAlgorithm(HashType t) { 66 HashAlgorithm hash; 67 switch (t) { 68 case HashType.MD5: 69 hash = new MD5CryptoServiceProvider(); 70 break; 71 HashType.SHA1: 72 hash = SHA1Managed(); 73 74 HashType.SHA256: 75 hash = SHA256Managed(); 76 77 HashType.SHA384: 78 hash = SHA384Managed(); 79 80 HashType.SHA512: 81 hash = SHA512Managed(); 82 83 HashType.RIPEMD: 84 hash = RIPEMD160Managed(); 85 86 default: 87 hash = 88 89 } 90 hash; 91 92 93 94 加密 95 96 <param name="hash"></param> 97 98 99 string Encrypto(HashAlgorithm hash, source) { 100 string dest = .Empty; 101 try 102 { 103 byte[] btSource = Encoding.Default.GetBytes(source); 104 byte[] btDest = hash.ComputeHash(btSource); 105 dest = Convert.ToBase64String(btDest,0,btDest.Length); 106 107 catch (Exception ex) 108 109 throw ex; 110 111 dest; 112 113 } 114 115 116 信息摘要类型 117 118 enum HashType { 119 MD5=120 SHA1=1121 SHA256=2122 SHA384=3123 SHA512=4124 RIPEMD=5 125 126 } ? 对称加密算法
关于对称加密算法,效果图如下: 对称加密算法的核心代码如下: System.IO; 7 8 10 对称加密算法帮助类 13 14 SymHelper 15 16 #region DES加密 17 DES加密 22 <param name="key"></param> 23 <param name="iv"></param> 24 25 string GetEnCryptoInfoByDES(string source,1)">string key,1)"> iv) 27 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.DES); 28 Encrypto(sym,source,key,iv); 29 30 31 32 33 DES解密 34 35 <param name="dest"></param> 36 37 38 39 string GetDeCryptoInfoByDES(string dest,1)"> 40 41 SymmetricAlgorithm sym = 42 Decrypto(sym,dest,1)"> 43 47 48 #region RC2加密与解密 49 50 51 RC2加密 52 53 54 55 56 57 string GetEnCryptoInfoByRC2( 58 59 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.RC2); 60 61 62 63 65 RC2解密 66 67 68 69 70 71 string GetDeCryptoInfoByRC2( 72 73 SymmetricAlgorithm sym = 74 75 76 77 78 79 80 #region 3DES加密与解密 81 82 83 3DES加密 84 85 86 87 88 89 string GetEnCryptoInfoBy3DES( 90 91 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.TripleDES); 92 93 94 95 3DES解密 99 100 101 102 103 string GetDeCryptoInfoBy3DES(104 105 SymmetricAlgorithm sym =106 107 109 110 111 112 #region Rijndael加密与解密 113 114 115 Rijndael加密 116 117 118 119 120 121 string GetEnCryptoInfoByRijndael(122 123 SymmetricAlgorithm sym = getSymmetricAlgorithm(SymType.Rijndael); 124 125 126 127 128 129 130 Rijndael解密 131 132 133 134 135 136 string GetDeCryptoInfoByRijndael(137 138 SymmetricAlgorithm sym =139 140 141 142 143 144 SymmetricAlgorithm getSymmetricAlgorithm(SymType t) 145 146 SymmetricAlgorithm sym; 147 (t) 148 149 SymType.DES: 150 sym = DESCryptoServiceProvider(); 151 152 SymType.RC2: 153 sym = RC2CryptoServiceProvider(); 154 155 SymType.TripleDES: 156 sym = TripleDESCryptoServiceProvider(); 157 158 SymType.Rijndael: 159 sym = RijndaelManaged(); 160 161 162 sym = 163 164 165 sym; 166 167 168 169 170 171 <param name="sym"></param> 172 173 174 175 176 string Encrypto(SymmetricAlgorithm sym,1)">177 178 179 180 181 byte[] btnSource =182 //1.创建对称加密算法实例创建对称加密算法实例 183 sym.Mode = CipherMode.CBC; 184 int keyLen = sym.LegalKeySizes[0].MaxSize / 8185 int ivLen = sym.BlockSize / 186 if (key.Length < keyLen) 187 { 188 key = key.PadRight(keyLen,1)">'0'); 189 } 190 if (iv.Length < ivLen) 191 192 iv = iv.PadRight(ivLen,1)">193 194 使用 PBKDF1 算法的扩展从密码派生密钥 195 PasswordDeriveBytes pkey = PasswordDeriveBytes(key,1)">196 ASCIIEncoding.ASCII.GetBytes("123456")); 197 198 2.设置初始化参数,包括密钥和初始化向量等 199 sym.Key = pkey.GetBytes(key.Length); Encoding.Default.GetBytes(key); 200 sym.IV = Encoding.Default.GetBytes(iv); 201 3.使用CreateEncryptor方法创建加密实例 202 ICryptoTransform trans = sym.CreateEncryptor(); 203 4.创建加密流 204 MemoryStream ms = MemoryStream(); 205 CryptoStream cs = CryptoStream(ms,trans,CryptoStreamMode.Write); 206 5.利用加密流进行数据加密 207 cs.Write(btnSource,btnSource.Length); 208 cs.FlushFinalBlock(); 209 6.返回密文 210 byte[] cryptoByte = ms.ToArray(); 211 dest = Convert.ToBase64String(cryptoByte,1)">0,cryptoByte.GetLength(212 213 214 215 216 217 218 219 220 221 解密 222 223 224 225 226 227 228 string Decrypto(SymmetricAlgorithm sym,1)">229 230 string source = 231 232 233 byte[] btnDest = Convert.FromBase64String(dest); 234 235 sym.Mode =236 237 238 239 240 key = key.PadRight(keyLen,1)">241 242 243 244 iv = iv.PadRight(ivLen,1)">245 246 247 PasswordDeriveBytes pkey = 248 ASCIIEncoding.ASCII.GetBytes(249 250 sym.Key = pkey.GetBytes(key.Length); 251 sym.IV =252 3.使用CreateDecryptor方法创建解密实例 253 ICryptoTransform trans = sym.CreateDecryptor(); 254 4.创建解密流 255 MemoryStream ms = new MemoryStream(btnDest,btnDest.Length); 256 CryptoStream cs = 257 258 5.返回明文 259 StreamReader sr = StreamReader(cs); 260 source = sr.ReadToEnd(); 261 262 263 264 265 266 source; 267 268 269 270 271 加密类型 272 273 SymType { 274 DES=275 RC2=276 TripleDES=277 Rijndael=3 278 279 } ? 非对称加密算法和数字签名非对称加密算法,主要要RSA【RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。】【非对称加密算法对长度有一定的限制,适用于少量数据】 关于非对称加密算法,效果图如下: 关于数字签名,效果图如下: 关于非对称加密术和数字签名,核心代码如下: 非对称加密算法帮助类 AsymHelper 15 16 18 DSAHelper { 19 20 string keyContainerName = star 21 string m_PriKey = 23 24 string m_PubKey = 25 26 27 PriKey 28 29 get 31 m_PriKey; 34 set 36 m_PriKey = value; 37 PubKey 43 44 m_PubKey; 45 46 47 48 49 m_PubKey = 51 52 53 void generateKey() 54 55 CspParameters m_CspParameters; 56 m_CspParameters = CspParameters(); 57 m_CspParameters.KeyContainerName = keyContainerName; 58 DSACryptoServiceProvider asym = DSACryptoServiceProvider(); 59 m_PriKey = asym.ToXmlString(true 60 m_PubKey = asym.ToXmlString(false 61 asym.PersistKeyInCsp = asym.Clear(); 63 64 string Encrypto( 66 if (string.IsNullOrEmpty(m_PubKey) && .IsNullOrEmpty(m_PriKey)) 67 68 generateKey(); 69 70 getEncryptoInfoByDSA(source); 71 72 73 74 创建数字签名 75 76 77 string getEncryptoInfoByDSA( 79 80 81 string ss = HashHelper.GetInfoBySHA1(source); 82 Convert.FromBase64String(ss); 83 DSACryptoServiceProvider asym = 84 asym.FromXmlString(m_PriKey); 85 DSASignatureFormatter dsaFormatter = DSASignatureFormatter(asym); 86 dsaFormatter.SetHashAlgorithm(SHA1 87 dsaFormatter.CreateSignature(btSource); 88 dest = Convert.ToBase64String(btDest); 89 91 92 验证数字签名 98 bool verifyInfo( dest) 99 102 103 DSACryptoServiceProvider asym = asym.FromXmlString(m_PubKey); 105 DSASignatureDeformatter dsaFormatter = DSASignatureDeformatter(asym); 106 dsaFormatter.SetHashAlgorithm( dsaFormatter.VerifySignature(btnSource,btnDest); 109 110 111 RSAHelper { 112 113 115 116 117 118 119 120 121 122 123 124 126 127 128 129 m_PriKey =130 131 132 133 134 135 136 137 138 139 140 141 142 m_PubKey =143 144 145 146 .IsNullOrEmpty(m_PriKey)) { 149 150 getEncryptoInfoByRSA(source); 151 152 153 string Decrypto( dest) { 154 155 156 157 158 getDecryptoInfoByRSA(dest); 159 160 161 162 163 164 m_CspParameters = 165 m_CspParameters.KeyContainerName =166 RSACryptoServiceProvider asym = RSACryptoServiceProvider(m_CspParameters); 168 m_PriKey = asym.ToXmlString(169 m_PubKey = asym.ToXmlString(170 asym.PersistKeyInCsp = 171 172 173 174 string getEncryptoInfoByRSA(175 176 byte[] plainByte = Encoding.ASCII.GetBytes(source); 177 初始化参数 178 RSACryptoServiceProvider asym = RSACryptoServiceProvider(); 179 180 int keySize = asym.KeySize / 8;非对称加密,每次的长度不能太长,否则会报异常 181 int bufferSize = keySize - 11182 if (plainByte.Length > bufferSize) { 183 throw new Exception(非对称加密最多支持【"+bufferSize+】字节,实际长度【"+plainByte.Length+】字节。184 185 byte[] cryptoByte = asym.Encrypt(plainByte,1)">186 Convert.ToBase64String(cryptoByte); 188 189 string getDecryptoInfoByRSA(190 191 192 193 RSACryptoServiceProvider asym = 194 195 非对称加密,每次的长度不能太长,否则会报异常 196 int bufferSize = keySize - 11; 197 if (btDest.Length > keySize) 198 199 非对称解密最多支持【" + keySize + " + btDest.Length + 200 201 byte[] cryptoByte = asym.Decrypt(btDest,1)">202 Encoding.ASCII.GetString(cryptoByte); 203 204 205 206 207 208 AsymType{ 209 DSA=210 RSA=1 211 212 }
?下载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |