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# 上位机开发,写完后收获了不错的阅读量和好评:

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算法实现数字签名与认证(私钥签名,公钥认证)

Halcon与C#联合编程:使用S7协议实现机器视觉上位机与西门子PLC联动

通用上位机框架HwLib.Automation(C#)

c#上位机开发

C#上位机开发—— 美化界面(给按钮添加背景)

C#上位机开发—— 修改窗口图标和exe文件图标