C# | 上位机开发新手指南(六)摘要算法

简介: 你知道摘要算法么?它在保障数据安全方面非常有用!它能够将任意长度的数据转换成固定长度的消息摘要,从而确保数据的完整性和可靠性。比如说,我们下载软件的时候,就可以用摘要算法来检验软件是否被篡改,保障我们的电脑安全。那这个算法的工作原理是怎样的呢?大致就是通过一系列复杂的计算,将原始数据转换为一个固定长度的摘要信息。而且无论输入的数据大小,输出的摘要信息长度都是一样的。那么摘要算法有什么用处呢?比如数字签名,确保数据的来源和内容没有被篡改。还有密码学等领域的应用,可以说是非常厉害了!

在这里插入图片描述

上位机开发新手指南(六)摘要算法

@[toc]

前言

你知道摘要算法么?它在保障数据安全方面非常有用!

它能够将任意长度的数据转换成固定长度的消息摘要,从而确保数据的完整性和可靠性。比如说,我们下载软件的时候,就可以用摘要算法来检验软件是否被篡改,保障我们的电脑安全。

那这个算法的工作原理是怎样的呢?大致就是通过一系列复杂的计算,将原始数据转换为一个固定长度的摘要信息。而且无论输入的数据大小,输出的摘要信息长度都是一样的。

那么摘要算法有什么用处呢?比如数字签名,确保数据的来源和内容没有被篡改。还有密码学等领域的应用,可以说是非常厉害了!

那常见的摘要算法有哪些呢?比较常见的有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 方法生成哈希值,最后将哈希值转换为字符串返回。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
48 1
|
12天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
29天前
|
存储 算法 Java
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)(一)
金石推荐 | 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
33 1
|
1月前
|
机器学习/深度学习 分布式计算 算法
大模型开发:你如何确定使用哪种机器学习算法?
在大型机器学习模型开发中,选择算法是关键。首先,明确问题类型(如回归、分类、聚类等)。其次,考虑数据规模、特征数量和类型、分布和结构,以判断适合的算法。再者,评估性能要求(准确性、速度、可解释性)和资源限制(计算资源、内存)。同时,利用领域知识和正则化来选择模型。最后,通过实验验证和模型比较进行优化。此过程涉及迭代和业务需求的技术权衡。
|
1月前
|
机器学习/深度学习 算法 开发工具
视觉智能平台常见问题之其他算法定制化开发如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
29 1
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
27 1
|
1月前
|
搜索推荐 C#
C#实现选择排序算法
C#实现选择排序算法
17 2
|
1月前
|
搜索推荐 C#
C#实现冒泡排序算法
C#实现冒泡排序算法
19 0
|
1月前
|
存储 算法 PHP
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
17 1
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?