一. 编码解码

1.编码

  将信息从一种格式(人能识别)转换成另一种形式(计算机能识别)的过程。 常见的编码:Base64

2.解码

  计算机能识别的形式转换成人能识别的形式。

3.字符集和字符编码

(1).字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

(2).字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。 即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是 利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

常见的字符集:ASCII、GB2312、BIG5、GB18030 和 Unicode(UTF-32/ UTF-16/ UTF-8) 字符集

详见参考:https://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html

1                 string pwd = "123456";
2                 byte[] bytes1 = Encoding.Default.GetBytes(pwd);
3                 string baseString = Convert.ToBase64String(bytes1);
4                 Console.WriteLine($"编码:{baseString}");
5                 byte[] bytes2 = Convert.FromBase64String(baseString);
6                 var str = Encoding.Default.GetString(bytes2);
7                 Console.WriteLine($"解码:{str}");    

 

二. 各种算法及其实现(微软的实现)

下面的各种算法微软都有实现,都是基于 【System.Security.Cryptography.Algorithms】这个程序集实现的。

文档地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography?view=netcore-3.1

源码地址:https://github.com/dotnet/corefx/tree/master/src/System.Security.Cryptography.Algorithms

1.哈希(散列摘要)算法

  Hash,一般翻译做散列,音译为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。 简单的说就是一种将任意长度的消息压缩到某一

固定长度的消息摘要的算法或者函数,有时也叫摘要算法。

  主流的 Hash 算法有:MD4、MD5 和 SHA系列,其中SHA家族有5个算法:SHA-1,SHA-224,SHA-256,SHA-384 和 SHA-512,其中后 4 者总称 SHA2 算法。 使用的程序集:【System.Security.Cryptography.Algorithms】(微软),代码见下,和后面开源库的实现相比多了些 -,可以利用replace去掉

用途:文件校验、数字签名 和 鉴权协议,建议以后用SHA系列.

PS.

哈希函数的理解:https://www.jianshu.com/p/bba9b61b80e7

哈希一致性算法理解:https://www.jianshu.com/p/6f13156573f4 (了解)

 1             //MD5
 2             {
 3                 var srcString = "ypf001";
 4                 //(和后面开源库的实现相比多了些 -,可以利用replace去掉)
 5                 var md5 = MD5.Create();
 6                 byte[] result = md5.ComputeHash(Encoding.UTF8.GetBytes(srcString));
 7                 string md5String= BitConverter.ToString(result).Replace("-",""); 
 8             }
 9             //SHA系列
10             {
11                 var srcString = "ypf001";
12                 //SHA-256,SHA-384 和 SHA-512 用法类似(和后面开源库的实现相比多了些-,可以利用replace去掉)
13                 var sha1 = SHA1.Create();
14                 byte[] result = sha1.ComputeHash(Encoding.UTF8.GetBytes(srcString));
15                 string sha1HashString = BitConverter.ToString(result).Replace("-", "");
16             }

2. HMAC算法

  HMAC是具密钥的哈希算法,以一个密钥和一个消息为输入,生成摘要作为输出,消息 + 密钥 + 算法 ==》 输出摘要包括:HMAC-MD5、HMAC-SHA1、HMAC-SHA256、HMAC-SHA384、HMAC-SHA512,使用的程序集:【System.Security.Cryptography.Algorithms】(微软),代码见下,和后面开源库的实现相比多了些 -,可以利用replace去掉。

 1             //HMAC相关
 2             {
 3                 var secretKey = "sflkasfkksfs";
 4                 var srcString = "ypf001";
 5                 //HMAC-SHA384、HMAC-SHA512的用法类似 (和后面开源库的实现相比多了些-,可以利用replace去掉)
 6                 HMACSHA1 hmacsha1 = new HMACSHA1(Encoding.UTF8.GetBytes(secretKey));
 7                 HMACSHA256 hmacsha2 = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey));
 8                 byte[] bytes1 = hmacsha1.ComputeHash(Encoding.UTF8.GetBytes(srcString));
 9                 byte[] bytes2 = hmacsha2.ComputeHash(Encoding.UTF8.GetBytes(srcString));
10                 string hmacSha1String = BitConverter.ToString(bytes1).Replace("-", ""); 
11                 string hmacSha2String = BitConverter.ToString(bytes2).Replace("-", "");
12             }

3.对称加密算法

  采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密加密,也称为单密钥加密。 常见的对称加解密算法:AES、DES、RC2、TripleDES 和 Rijndael 算法。

 1   public class DesEncrypt
 2     {
 3         //8位长度
 4         private static byte[] rgbKey = ASCIIEncoding.ASCII.GetBytes("ioeruwoe");  //密钥(转为byte数组)
 5         private static byte[] rgbIV = ASCIIEncoding.ASCII.GetBytes("ypf00001");   //矢量(配合密钥更加安全)
 6 
 7         #region 01-DES加密
 8         /// <summary>
 9         /// DES 加密
10         /// </summary>
11         /// <param name="strValue">需要加密的字符串</param>
12         /// <returns></returns>
13         public static string Encrypt(string strValue)
14         {
15             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
16             using (MemoryStream memStream = new MemoryStream())
17             {
18                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
19                 byte[] buffer = Encoding.Default.GetBytes(strValue);
20                 crypStream.Write(buffer, 0, buffer.Length);
21                 crypStream.FlushFinalBlock();
22                 memStream.Flush();
23                 return Convert.ToBase64String(memStream.GetBuffer(), 0, (int)memStream.Length);
24             }
25         }
26         #endregion
27 
28         #region 02-DES解密
29         /// <summary>
30         /// DES解密
31         /// </summary>
32         /// <param name="EncValue">加密后的结果</param>
33         /// <returns></returns>
34         public static string Decrypt(string EncValue)
35         {
36             DESCryptoServiceProvider dsp = new DESCryptoServiceProvider();
37             byte[] buffer = Convert.FromBase64String(EncValue);
38 
39             using (MemoryStream memStream = new MemoryStream())
40             {
41                 CryptoStream crypStream = new CryptoStream(memStream, dsp.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
42                 crypStream.Write(buffer, 0, buffer.Length);
43                 crypStream.FlushFinalBlock();
44                 return ASCIIEncoding.UTF8.GetString(memStream.ToArray());
45             }
46         }
47         #endregion
48     }
View Code

相关文章:

  • 2021-08-02
  • 2021-08-08
  • 2021-05-24
  • 2021-11-17
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-14
  • 2022-12-23
  • 2022-01-27
  • 2022-12-23
  • 2021-07-16
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案