加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# 加密术

发布时间:2020-12-16 01:13:45 所属栏目:百科 来源:网络整理
导读:本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用。 概述 随着信息技术的发展,计算机网络为信息的获

本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用。

概述

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

公式算法表示如下:

加密公式:c=Eke(m)? (11.1) 解密公式:m=Dkd(c)? (11.2)其中m代表明文,c代表密文,E是加密算法,D是解密算法,参数ke称为加密密钥,参数kd称为解密密钥

涉及知识点

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

?散列算法

散列算法主要有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 }
View Code

?

对称加密算法


关于对称加密算法,主要有DES【Data Encryption Standard / 数据加密标准】,3DES【三重数据加密算法】,RC2【Rivest Cipher】,Rijndael【又称AES:Advanced Encryption Standard】。如下图所示:

关于对称加密算法,效果图如下:

对称加密算法的核心代码如下:

 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 }
View Code

?

非对称加密算法和数字签名

非对称加密算法,主要要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 }
View Code


本文旨在抛砖引玉,希望大家可以共同探讨,如有不足之处,还请指正。

?下载

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读