一、报文摘要算法基本概念

使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个报文的加密和解密,会使计算机增加很多不必要的负担(加密和解密要花费相当多的CPU时间)。

更有效的方法是使用报文摘要(MessageDigest,MD)来进行报文鉴别

发送方将可变 长度的报文m经过报文摘要算法运算后,得出固定长度的报文摘要H(m)。然后对H(m)进行加密,得出EK(H(m)),并将其附加在报文m后面发送出去。接收方把EK(H(m))解密还原为H(m),再把收到的报文进行报文摘要运算,看结果是否与收到的H(m)一样。如不一样,则可断定收到的报文不是发送方产生的。具体流程如下:

目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。MD5输出128位的摘要,SHA-1输出160位的摘要。SHA-1比MD5更安全些,但计算起来比MD5要慢

二、.NET 使用 MD5、SHA1、SHA128、SHA512 报文摘要算法

 1 using System;
2 using System.Security.Cryptography;
3 using System.Text;
4
5 namespace encryption.md5
6 {
7 public class Md5Util
8 {
9 public enum MD
10 {
11 MD5,
12 SHA1,
13 SHA256,
14 SHA512,
15 }
16 private static HashAlgorithm CreateHashAlgorithm(MD sha)
17 {
18 switch (sha)
19 {
20 case MD.MD5:
21 return new MD5CryptoServiceProvider();
22 case MD.SHA1:
23 return SHA1.Create();
24 case MD.SHA256:
25 return SHA256.Create();
26 case MD.SHA512:
27 return SHA512.Create();
28 }
29
30 throw new Exception($"The type does not exits,type:{sha}");
31 }
32
33 /// <summary>
34 /// 获取指定byte数组的MD5
35 /// </summary>
36 /// <param name="source"></param>
37 /// <param name="encoding"><see cref="Encoding"/>默认值:UTF8</param>
38 /// <returns></returns>
39 public static byte[] GetMD5(byte[] source, MD sha=MD.MD5, Encoding encoding = null)
40 {
41 byte[] output = CreateHashAlgorithm(sha).ComputeHash(source);
42 return output;
43 }
44
45 /// <summary>
46 /// 获取指定字符串的MD5
47 /// </summary>
48 /// <param name="source"></param>
49 /// <param name="encoding"><see cref="Encoding"/>默认值:UTF8</param>
50 /// <returns></returns>
51 public static byte[] GetMD5(string source, MD sha = MD.MD5, Encoding encoding = null)
52 {
53 if (encoding == null) encoding = Encoding.UTF8;
54 return GetMD5(encoding.GetBytes(source), sha, encoding);
55 }
56
57
58 /// <summary>
59 /// MD5 校验
60 /// </summary>
61 /// <param name="input">校验二进制</param>
62 /// <param name="hash">待比较的MD5 值</param>
63 /// <param name="encoding"></param>
64 /// <returns>true:相同;false:被纂改</returns>
65 public static bool VerifyMD5(byte[] input, byte[] hash, MD sha = MD.MD5, Encoding encoding = null)
66 {
67 if (encoding == null) encoding = Encoding.UTF8;
68 var buffer = GetMD5(input, sha,encoding);
69 if (Convert.ToBase64String(buffer) == Convert.ToBase64String(hash))
70 {
71 return true;
72 }
73 return false;
74 }
75
76 /// <summary>
77 /// MD5 校验
78 /// </summary>
79 /// <param name="input">校验字符串</param>
80 /// <param name="hash">待比较的MD5 值</param>
81 /// <param name="encoding"></param>
82 /// <returns>true:相同;false:被纂改</returns>
83 public static bool VerifyMD5(string input, byte[] hash, MD sha = MD.MD5, Encoding encoding = null)
84 {
85 if (encoding == null) encoding = Encoding.UTF8;
86 return VerifyMD5(encoding.GetBytes(input), hash, sha,encoding);
87 }
88 }
89 }

三、测试代码与结果

 1     static void Main()
2 {
3 {
4 Console.WriteLine("-----------------------------------------------------生成MD5--------------------------------------------------");
5 var input = "目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。";
6 Console.WriteLine($"内容:{input}");
7 byte[] md5 = Md5Util.GetMD5(input);
8 Console.WriteLine($"MD5:{Convert.ToBase64String(md5)}");
9 }
10
11 {
12 Console.WriteLine("-----------------------------------------------------MD5防篡改校验--------------------------------------------------");
13 var input = "https://docs.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.md5?view=net-5.0";
14 Console.WriteLine($"内容:{input}");
15 byte[] md5 = Md5Util.GetMD5(input+"不一致");
16 Console.WriteLine($"MD5校验:{Md5Util.VerifyMD5(input, md5)}");
17 }
18
19 {
20 Console.WriteLine("-----------------------------------------------------生成SHA512--------------------------------------------------");
21 var input = "目前广泛应用的报文摘要算法有MD5[RFC1321]和安全散列算法1(SecureHashAlgorithm,SHA-1)。";
22 Console.WriteLine($"内容:{input}");
23 byte[] md5 = Md5Util.GetMD5(input,Md5Util.MD.SHA512);
24 Console.WriteLine($"SHA512:{Convert.ToBase64String(md5)}");
25 }
26
27 {
28 Console.WriteLine("-----------------------------------------------------SHA512防篡改校验--------------------------------------------------");
29 var input = "https://docs.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.md5?view=net-5.0";
30 Console.WriteLine($"内容:{input}");
31 byte[] md5 = Md5Util.GetMD5(input, Md5Util.MD.SHA512);
32 Console.WriteLine($"SHA512校验:{Md5Util.VerifyMD5(input, md5, Md5Util.MD.SHA512)}");
33 }
34
35 Console.ReadKey();
36 }

代码示例:https://github.com/Dwayne112401/encryption

最新文章

  1. 全球酷站秀:15个顶尖的 CSS3 网站作品
  2. 史上最全的Win8快捷键大全
  3. 高效通信模型之 - 网络通信I/O模式( Windows)
  4. 我们如何学好java
  5. switch..case函数的基础使用一
  6. Tableau学习笔记之一
  7. css3 calc():css简单的数学运算-加减乘除
  8. bzoj1471
  9. OpenCV(7)-图像直方图
  10. C# WinFrom 导入Excel文件,显示进度条
  11. License友好的前端组件合集
  12. 11、js 数组详细操作方法及解析合集
  13. Codeforces Round #486 (Div. 3)-B. Substrings Sort
  14. C语言中全局结构体指针隐含的错误
  15. ☆C++学习心得
  16. cf1108e 线段树区间更新+扫描线
  17. 容器(container)
  18. Ado.Net,关于DataSet和DataTable
  19. Jenkins构建报错(Jenkins is reserved for jobs with matching label expression)解决办法
  20. c++野(wild)指针与悬空(dangling)指针

热门文章

  1. python爬虫之解析链接
  2. 前端可视化开发--liveload
  3. ConcurrentHashMap线程安全吗?
  4. 将.Net Core发布至Docker,并连接 Redis、上传文件到本机、连接sqlserver数据库
  5. Redis基础篇(四)持久化:内存快照(RDB)
  6. Oracle创建表空间创建用户授权
  7. Docker 的 2020,实 &quot;鼠&quot; 不易!
  8. 记一次MAVEN依赖事故
  9. 第三章 IP地址规划设计技术(很重要)
  10. Elastisearch在kibana下批量处理(mget和bulk)