计算机网络安全 —— 报文摘要算法 ME5 (三)
2024-10-21 07:29:08
一、报文摘要算法基本概念
使用加密通常可达到报文鉴别的目的,因为伪造的报文解密后一般不能得到可理解的内容。但简单采用这种方法,计算机很难自动识别报文是否被篡改。另外,对于不需要保密而只需要报文鉴别的网络应用,对整个报文的加密和解密,会使计算机增加很多不必要的负担(加密和解密要花费相当多的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
最新文章
- 全球酷站秀:15个顶尖的 CSS3 网站作品
- 史上最全的Win8快捷键大全
- 高效通信模型之 - 网络通信I/O模式( Windows)
- 我们如何学好java
- switch..case函数的基础使用一
- Tableau学习笔记之一
- css3 calc():css简单的数学运算-加减乘除
- bzoj1471
- OpenCV(7)-图像直方图
- C# WinFrom 导入Excel文件,显示进度条
- License友好的前端组件合集
- 11、js 数组详细操作方法及解析合集
- Codeforces Round #486 (Div. 3)-B. Substrings Sort
- C语言中全局结构体指针隐含的错误
- ☆C++学习心得
- cf1108e 线段树区间更新+扫描线
- 容器(container)
- Ado.Net,关于DataSet和DataTable
- Jenkins构建报错(Jenkins is reserved for jobs with matching label expression)解决办法
- c++野(wild)指针与悬空(dangling)指针