C# | 上位机开发新手指南摘要算法
Posted 猿长大人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# | 上位机开发新手指南摘要算法相关的知识,希望对你有一定的参考价值。
C# | 上位机开发新手指南(六)摘要算法
文章目录
前言
你知道摘要算法么?它在保障数据安全方面非常有用!
它能够将任意长度的数据转换成固定长度的消息摘要,从而确保数据的完整性和可靠性。比如说,我们下载软件的时候,就可以用摘要算法来检验软件是否被篡改,保障我们的电脑安全。
那这个算法的工作原理是怎样的呢?大致就是通过一系列复杂的计算,将原始数据转换为一个固定长度的摘要信息。而且无论输入的数据大小,输出的摘要信息长度都是一样的。
那么摘要算法有什么用处呢?比如数字签名,确保数据的来源和内容没有被篡改。还有密码学等领域的应用,可以说是非常厉害了!
那常见的摘要算法有哪些呢?比较常见的有MD5、SHA-1、SHA-2、SHA-3、BLAKE2、RIPEMD、Whirlpool和Keccak等。它们各有不同的优缺点和适用场景,我们需要根据实际情况来选择使用哦。
常见摘要算法源码
MD5算法
MD5是一种广泛使用的哈希算法,将任意长度的数据计算为128位的哈希值。尽管它被广泛使用,但是因为它已经被证明存在安全漏洞,现在已经不再被推荐使用。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 MD5 算法生成摘要
string md5Hash = GetMd5Hash(input);
Console.WriteLine($"MD5 hash of input: md5Hash");
// 使用 MD5 算法生成摘要
static string GetMd5Hash(string input)
using (MD5 md5 = MD5.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = md5.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 MD5 类。在方法中,先将字符串转换为字节数组,然后调用 MD5 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
SHA-1算法
SHA-1是一种用于计算数据哈希值的加密算法,将任意长度的数据计算为160位的哈希值。目前,SHA-1算法也已经被证明存在安全漏洞,现在不再被推荐使用。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 SHA-1 算法生成摘要
string sha1Hash = GetSha1Hash(input);
Console.WriteLine($"SHA-1 hash of input: sha1Hash");
// 使用 SHA-1 算法生成摘要
static string GetSha1Hash(string input)
using (SHA1 sha1 = SHA1.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = sha1.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 SHA1 类。在方法中,先将字符串转换为字节数组,然后调用 SHA1 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
SHA-256算法
SHA-256是一种用于计算数据哈希值的加密算法,将任意长度的数据计算为256位的哈希值。它是SHA-2算法族中的一员,比SHA-1更安全。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 SHA-256 算法生成摘要
string sha256Hash = GetSha256Hash(input);
Console.WriteLine($"SHA-256 hash of input: sha256Hash");
// 使用 SHA-256 算法生成摘要
static string GetSha256Hash(string input)
using (SHA256 sha256 = SHA256.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = sha256.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 SHA256 类。在方法中,先将字符串转换为字节数组,然后调用 SHA256 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
SHA-512算法
SHA-512是一种用于计算数据哈希值的加密算法,将任意长度的数据计算为512位的哈希值。它是SHA-2算法族中的一员,比SHA-256更安全。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 SHA-512 算法生成摘要
string sha512Hash = GetSha512Hash(input);
Console.WriteLine($"SHA-512 hash of input: sha512Hash");
// 使用 SHA-512 算法生成摘要
static string GetSha512Hash(string input)
using (SHA512 sha512 = SHA512.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = sha512.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 SHA512 类。在方法中,先将字符串转换为字节数组,然后调用 SHA512 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
BLAKE2算法
BLAKE2是BLAKE算法的改进版,是一种快速、安全的哈希函数,支持多种哈希长度,其中BLAKE2b和BLAKE2s分别支持512位和256位哈希值。它在安全性和性能方面都表现优异,被广泛应用于密码学和安全领域。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 BLAKE2 算法生成摘要
string blake2bHash = GetBlake2bHash(input);
Console.WriteLine($"BLAKE2b hash of input: blake2bHash");
string blake2sHash = GetBlake2sHash(input);
Console.WriteLine($"BLAKE2s hash of input: blake2sHash");
// 使用 BLAKE2b 算法生成摘要
static string GetBlake2bHash(string input)
using (BLAKE2b blake2b = BLAKE2b.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = blake2b.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
// 使用 BLAKE2s 算法生成摘要
static string GetBlake2sHash(string input)
using (BLAKE2s blake2s = BLAKE2s.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = blake2s.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 BLAKE2b 和 BLAKE2s 类。在方法中,先将字符串转换为字节数组,然后调用 BLAKE2 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
RIPEMD算法
RIPEMD是一种比较老的哈希算法,支持多种哈希长度,其中RIPEMD-160和RIPEMD-256分别支持160位和256位哈希值。它在安全性方面比MD5强,但性能较慢。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 RIPEMD-160 算法生成摘要
string ripemd160Hash = GetRipemd160Hash(input);
Console.WriteLine($"RIPEMD-160 hash of input: ripemd160Hash");
// 使用 RIPEMD-256 算法生成摘要
string ripemd256Hash = GetRipemd256Hash(input);
Console.WriteLine($"RIPEMD-256 hash of input: ripemd256Hash");
// 使用 RIPEMD-160 算法生成摘要
static string GetRipemd160Hash(string input)
using (RIPEMD160 ripemd160 = RIPEMD160.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = ripemd160.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
// 使用 RIPEMD-256 算法生成摘要
static string GetRipemd256Hash(string input)
using (RIPEMD256 ripemd256 = RIPEMD256.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = ripemd256.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 RIPEMD160 和 RIPEMD256 类。在方法中,先将字符串转换为字节数组,然后调用 RIPEMD 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
Whirlpool算法
Whirlpool是一种强度很高的哈希算法,支持512位哈希值。它具有高度的安全性和抗碰撞性,并且被广泛应用于数字签名、身份验证和数据完整性验证等领域。
示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
class Program
static void Main(string[] args)
string input = "Hello, world!";
// 使用 Whirlpool 算法生成摘要
string whirlpoolHash = GetWhirlpoolHash(input);
Console.WriteLine($"Whirlpool hash of input: whirlpoolHash");
// 使用 Whirlpool 算法生成摘要
static string GetWhirlpoolHash(string input)
using (Whirlpool whirlpool = Whirlpool.Create())
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = whirlpool.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
builder.Append(hashBytes[i].ToString("x2"));
return builder.ToString();
代码中使用了 System.Security.Cryptography 命名空间中的 Whirlpool 类。在方法中,先将字符串转换为字节数组,然后调用 Whirlpool 类的 ComputeHash 方法生成哈希值,最后将哈希值转换为字符串返回。
C#上位机开发—— 美化界面(给按钮添加背景)
前言
早在18年,博主第一次开始写博客,内容为 C# 上位机开发,写完后收获了不错的阅读量和好评:
- C#上位机开发(一)—— 了解上位机
- C#上位机开发(二)—— Hello,World
- C#上位机开发(三)—— 构建SerialAssistant雏形
- C#上位机开发(四)—— SerialAssistant功能完善
- C#上位机开发(五)——SerialAssistant界面升级(WinForm界面布局进阶)
- C#上位机开发(六)——SerialAssistant功能优化(串口自动扫描功能、接收数据保存功能、加载发送文件、发送历史记录、打开浏览器功能、定时发送功能)
- C#上位机开发(七)—— 修改窗口图标和exe文件图标
Github开源仓库:https://github.com/Mculover666/SerialAssistant。
一、发送按钮添加背景图片
目前所使用的都是winform默认样式,太丑了,接下来给按钮添加图片,美化按钮。
1. 寻找图标
首先在iconfont上寻找一个好看的图标:
2. 添加图片资源到工程中
首先将图片复制到项目中的 Resources 文件夹中,否则会路径找不到的错误:
接着在【解决方案管理器】中打开资源文件Resources.resx,点击添加资源后的下拉框,选择添加现有文件:
选中图片资源:
添加之后如图:
3. 修改发送按钮背景
点击发送按钮的背景图片设置属性:
选择刚刚添加到项目的图标资源:
添加之后如图:
4. 设置透明背景
Transparent为透明:
5. 去除边框显示
这个明显有边框,太丑了,通过设置属性去掉边框:
这样就做到无边框显示啦~
二、在代码中调用图片资源
在点击打开串口后,希望背景图片变为断开连接的图片,这就需要在代码中访问,格式为:
global::<命名空间>.Properties.Resources.<图片名>
比如:
button1.BackgroundImage = global::SerialAssistant.Properties.Resources.connect;
实现的效果如下:
三、最终实现界面效果
以上是关于C# | 上位机开发新手指南摘要算法的主要内容,如果未能解决你的问题,请参考以下文章
C#上位机开发(十八)—— 基于RSA算法实现数字签名与认证(私钥签名,公钥认证)