C#中的MD5摘要算法与哈希算法

文章目录

  • 一、哈希算法基础
  • 二、MD5 算法原理
  • 三、MD5摘要算法
  • 四、哈希算法
  • 五、C#实现示例
    • MD5算法示例
    • 哈希算法示例
    • 字符串MD5值对比
  • 六、总结

在这里插入图片描述


一、哈希算法基础

哈希算法是一种单向密码体制,它将任意长度的数据转换成固定长度的字符串。这种转换是不可逆的,即无法从哈希值恢复原始数据。哈希算法的主要特点包括:

  • 确定性:相同的输入总是产生相同的输出。
  • 快速计算:哈希函数的计算速度非常快。
  • 抗篡改性:输入数据的微小变化会导致哈希值的显著变化。
  • 雪崩效应:输出的每一位都与输入的每一位相关。

二、MD5 算法原理

MD5 算法将输入的数据分为多个512位的块,然后通过四个主要的步骤处理每个块:

  1. 初始化:设置四个32位的变量 A, B, C, D。
  2. 主循环:对每个512位的数据块进行16次迭代,每次迭代使用不同的函数和常数。
  3. 最终结果:将初始变量与迭代结果合并,得到最终的128位哈希值。
  4. 输出:将128位的哈希值转换成32位的十六进制字符串。

三、MD5摘要算法

MD5(Message Digest Algorithm 5)是一种广泛使用的密码散列函数,可以产生一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5算法于1991年由Ronald Rivest设计,是被广泛使用的摘要算法之一。

MD5算法将输入的消息(任意长)转换成一个固定长度的散列值。在转换过程中,算法会使用一系列的加密操作,如循环移位和异或运算,以生成最终的散列值。

然而,MD5算法已经不再被认为是安全的,因为它容易受到碰撞攻击,即可以找到两个不同的输入消息产生相同的散列值。因此,在安全性要求较高的场合,应避免使用MD5算法。

四、哈希算法

哈希算法是一种将输入(或者’键’)转换为固定长度字符串的函数,这个过程称为哈希。哈希算法在计算机科学中有着广泛的应用,如数据结构中的哈希表,以及数字签名等领域。

与MD5算法相比,哈希算法更加强大和安全。哈希算法的设计目标是确保输入信息的任何微小变化都会导致输出结果(散列值)的巨大变化,从而提高安全性。

在C#中,我们可以使用System.Security.Cryptography命名空间下的MD5Cng类来实现MD5算法的功能。而对于哈希算法,我们可以使用HashAlgorithm抽象类及其派生类来实现。

五、C#实现示例

下面我们给出C#中MD5算法和哈希算法的实现示例。

MD5算法示例

using System;
using System.Security.Cryptography;
using System.Text;

namespace Md5AndHashExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "Hello, World!";
            string md5Result = GetMd5Hash(input);
            Console.WriteLine($"MD5 Hash: {md5Result}");
        }

        static string GetMd5Hash(string input)
        {
            using (MD5Cng md5 = MD5Cng.Create())
            {
                byte[] inputBytes = Encoding.ASCII.GetBytes(input);
                byte[] hashBytes = md5.ComputeHash(inputBytes);

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < hashBytes.Length; i++)
                {
                    sb.Append(hashBytes[i].ToString("X2"));
                }
                return sb.ToString();
            }
        }
    }
}

哈希算法示例

using System;
using System.Security.Cryptography;
using System.Text;

namespace Md5AndHashExample
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "Hello, World!";
            string hashResult = GetHash(input, "SHA256");
            Console.WriteLine($"Hash: {hashResult}");
        }

        static string GetHash(string input, string algorithm)
        {
            HashAlgorithm hashAlgorithm = GetHashAlgorithm(algorithm);
            byte[] inputBytes = Encoding.ASCII.GetBytes(input);
            byte[] hashBytes = hashAlgorithm.ComputeHash(inputBytes);

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }

        static HashAlgorithm GetHashAlgorithm(string algorithm)
        {
            switch (algorithm.ToUpper())
            {
                case "SHA256":
                    return SHA256.Create();
                case "SHA384":
                    return SHA384.Create();
                case "SHA512":
                    return SHA512.Create();
                    default:
                    throw new ArgumentException($"Unsupported hash algorithm: {algorithm}");
            }
        }
    }
}

字符串MD5值对比

步骤

  1. 计算第一个字符串的MD5值:使用MD5算法生成第一个字符串的哈希值。
  2. 计算第二个字符串的MD5值:同样使用MD5算法生成第二个字符串的哈希值。
  3. 比较两个MD5值:将两个哈希值进行比较,如果相同,则认为两个字符串相等。

示例代码

using System;
using System.Security.Cryptography;
using System.Text;

public class MD5ComparisonExample
{
    // 计算字符串的MD5哈希值
    public static string ComputeMD5Hash(string input)
    {
        using (MD5 md5 = MD5.Create())
        {
            byte[] inputBytes = Encoding.UTF8.GetBytes(input);
            byte[] hashBytes = md5.ComputeHash(inputBytes);

            // 将哈希字节数组转换为十六进制字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hashBytes.Length; i++)
            {
                sb.Append(hashBytes[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }

    // 比较两个字符串的MD5哈希值
    public static bool CompareMD5Hashes(string hash1, string hash2)
    {
        return hash1.Equals(hash2, StringComparison.OrdinalIgnoreCase);
    }

    public static void Main()
    {
        string originalString1 = "Hello, World!";
        string originalString2 = "Different text.";

        string md5Hash1 = ComputeMD5Hash(originalString1);
        string md5Hash2 = ComputeMD5Hash(originalString2);

        Console.WriteLine($"MD5 Hash of '{originalString1}': {md5Hash1}");
        Console.WriteLine($"MD5 Hash of '{originalString2}': {md5Hash2}");

        // 比较两个字符串的MD5值
        bool areHashesEqual = CompareMD5Hashes(md5Hash1, md5Hash2);
        Console.WriteLine($"The MD5 hashes are equal: {areHashesEqual}");
    }
}

六、总结

本文介绍了MD5摘要算法和哈希算法的基本概念,并给出了C#语言的实现示例。通过这些示例,我们可以看到如何使用C#来计算字符串的MD5散列值和不同哈希算法的散列值。需要注意的是,MD5算法已经不再安全,不推荐用于安全性要求较高的场合。在实际应用中,应选择更为安全的哈希算法,如SHA256、SHA384或SHA512。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java二十三种设计模式-工厂方法模式(2/23)

工厂方法模式&#xff1a;设计模式中的瑞士军刀 引言 在软件开发中&#xff0c;工厂方法模式是一种常用的创建型设计模式&#xff0c;它用于处理对象的创建&#xff0c;将对象的实例化推迟到子类中进行。这种模式不仅简化了对象的创建过程&#xff0c;还提高了代码的可维护性…

WordPress:无法创建新文章?创建新帖子时候页面空白

wordPress中我们新建文章的时候&#xff0c;会遇到页面空白&#xff0c;这个问题是怎么导致呢&#xff1f;我们可以打开F12开发者模式看下报错信息&#xff0c;这是一个警告信息 Warning: Creating default object from empty value in /pub 到数据库 wp_posts中查看生成了很…

SpringBoot新手快速入门系列教程十一:自动生成API文档,Springboot3.x集成SpringDoc

本次项目我们用Maven来做&#xff0c;最近发现gradle其实很多项目的支持比较差&#xff0c;所以项目还是用Maven来新建项目。对比了市面上的几种API生成第三方库&#xff0c;只有springdoc 是能够按照文档就能部署出来的。 官网&#xff1a; OpenAPI 3 Library for spring-bo…

Mac电脑下运行java命令行出现:错误: 找不到或无法加载主类

mac 电脑 问题复现 随手写了一个main方法&#xff0c;想用命令行操作 进入 BlockDemo.java 所在目录&#xff1a; wnwangnandeMBP wn % cd /Users/wn/IdeaProjects/test/JianZhiOffer/src/main/java/com/io/wn wnwangnandeMBP wn % ls -l total 16 -rw-r--r-- 1 wangnan …

Qt文件下载工具

在Qt中实现文件下载功能&#xff0c;通常可以通过多种方式来完成&#xff0c;包括使用 QNetworkAccessManager 和 QNetworkReply 类&#xff0c;或者使用更高级别的 QHttpMultiPart 类。以下是两种常见的实现方法&#xff1a; 方法1&#xff1a;使用 QNetworkAccessManager 和…

芋道框架万字详解(前后端分离)、若依框架、yudao-cloud保姆级攻略

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

tessy 集成测试:小白入门指导手册

目录 1,创建集成测试模块且分析源文件 2,设置测试环境 3,TIE界面设置相关函数 4,SCE界面增加用例 5,编辑数据 6,用例所对应的测试函数序列 7,添加 work task 函数 8,为测试场景添加函数 9,为函数赋值 10,编辑时间序列的数值 11,执行用例 12,其他注意事项…

Linux 下使用Docker安装redis

redis&#xff1a; 是一个高性能的&#xff0c;键值对的&#xff0c;将数据存储到内存中的非关系型数据库&#xff08;nosql数据库 not only sql&#xff09; 高性能&#xff1a;数据存在内存中&#xff0c;直接访问内存 键值对&#xff1a;新闻id&#xff08;键&#xff09…

C语言 | Leetcode C语言题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; struct TreeNode* lowestCommonAncestor(struct TreeNode* root, struct TreeNode* p, struct TreeNode* q) {struct TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor-&g…

51单片机6(P0P1P2P3结构框架图)

一、GPIO结构框架图与工作原理 1、接下来我们介绍一下这个GPIO结构框图和工作原理&#xff0c;我们使用51单片机的GPIO分为了P0&#xff0c;P1&#xff0c;P2&#xff0c;P3这四组端口&#xff0c;下面我们就分别来介绍这四组端口它的一个内部结构&#xff0c;只有了解了内部的…

windows环境下基于3DSlicer 源代码编译搭建工程开发环境详细操作过程和中间关键错误解决方法说明

说明: 该文档适用于  首次/重新 搭建3D-Slicer工程环境  Clean up(非增量) 编译生成 1. 3D-slicer 软件介绍 (1)3D Slicer为处理MRI\CT等图像数据软件,可以实行基于MRI图像数据的目标分割、标记测量、坐标变换及三维重建等功能,其源于3D slicer 4.13.0-2022-01-19开…

好用的文献翻译软件

自从我开始使用七星文献翻译阅读器&#xff08;https://lestore.lenovo.com/detail/L116395&#xff09;&#xff0c;我的学术世界仿佛被打开了一扇全新的大门。这款软件不仅承载了让知识无国界的宏伟使命&#xff0c;更以其实惠的价格和强大的功能&#xff0c;成为了我学习和研…

【操作系统】进程管理——死锁(个人笔记)

学习日期&#xff1a;2024.7.13 内容摘要&#xff1a;死锁的概念和三大处理策略 目录 死锁 死锁的概念 死锁、饥饿和死循环的区别 死锁产生的必要条件 死锁的处理策略&#xff1a;预防、避免和解除 预防死锁 破坏互斥条件 破坏不剥夺条件 破坏请求和保持条件 破坏循…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

STM32MP135裸机编程:唯一ID(UID)、设备标识号、设备版本

0 资料准备 1.STM32MP13xx参考手册1 唯一ID&#xff08;UID&#xff09;、设备标识号、设备版本 1.1 寄存器说明 &#xff08;1&#xff09;唯一ID 唯一ID可以用于生成USB序列号或者为其它应用所使用&#xff08;例如程序加密&#xff09;。 &#xff08;2&#xff09;设备…

笔记 1 : 课本前 2 章

现在开始跟着彭老师学习 arm 。把重要的知识点归拢一下&#xff0c;便于复习。早日学有所成&#xff0c;为国为家为己&#xff0c;更幸福些。 &#xff08;1&#xff09;冯诺依曼架构与哈弗架构&#xff0c;与混合架构&#xff1a; 以及&#xff1a; &#xff08;2&#xff0…

php反序列化--2--PHP反序列化漏洞基础知识

一、什么是反序列化&#xff1f; 反序列化是将序列化的字符串还原为PHP的值的过程。 二、如何反序列化 使用unserialize()函数来执行反序列化操作 代码1&#xff1a; $serializedStr O:8:"stdClass":1:{s:4:"data";s:6:"sample";}; $origina…

03-Charles实战

一、抓包分析问题示例 1&#xff09;问题描述 2&#xff09;抓包分析 这是后台响应回来的错误信息&#xff0c;说明问题一是后台的原因&#xff1b;但是后台只响应了一条信息&#xff0c;而前端页面却显示两条错误信息&#xff0c;说明前端页面处理异常的时候逻辑有问题&#…

Android-- 集成谷歌地图

引言 项目需求需要在谷歌地图&#xff1a; 地图展示&#xff0c;设备点聚合&#xff0c;设备站点&#xff0c;绘制点和区域等功能。 我只针对我涉及到的技术做一下总结&#xff0c;希望能帮到开始接触谷歌地图的伙伴们。 集成步骤 1、在项目的modle的build.gradle中添加依赖如…

深层神经网络示例

维度说明&#xff1a; A[L]、Z[L]&#xff1a;&#xff08;本层神经元个数、样本数&#xff09; W[L]&#xff1a;&#xff08;本层神经元个数、上层神经元个数&#xff09; b[L]&#xff1a;&#xff08;本层神经元个数、1&#xff09; dZ[L]&#xff1a;dA[L] * g’A&#xf…