迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

在 C++ 中获取文件的 MD5 哈希值

作者:迹忆客 最近更新:2023/08/18 浏览次数:

MD5 是一种密码协议,以前用于加密,但现在通常用于身份验证。 它基于哈希函数中的哈希过程,针对某些纯文本生成加密的哈希值。


什么是哈希函数

在探索 MD5(消息摘要算法)之前,了解哈希函数非常重要。 哈希是哈希函数过程,用于将纯文本转换为具有哈希值的密文。

它基于数学函数,有助于将纯文本转换为密文,通常是压缩的哈希值。

哈希函数

该图演示了哈希函数的工作原理; 我们提供一些基本消息,该消息是哈希函数的输入。 它执行一些过程并为我们提供称为密文的加密随机值的输出。

哈希函数的特点

  1. 输出始终具有相同的长度,即 128 位,而不依赖于纯文本的大小。
  2. 即使原始消息超过 128 位,它也会对其进行压缩。
  3. 它消化数据(消息),将数据表示为更小的哈希值表示形式。
  4. 对于每条不同的消息,哈希值应该是唯一的。
  5. 对于同一消息,哈希值应该始终相同。

什么是 MD5

MD5(消息摘要算法)是一种密码协议,用于验证消息、内容验证和数字签名; Ronald Rivest 在 [1991](https://en.wikipedia.org/wiki/MD5#:~:text=Ronald Rivest in-,1991 to,-replace an previous)设计它作为 MD4 的高级版本。 它基于哈希函数来验证发送和接收的文件。

MD5现在用于数据认证,但最初它用于数据加密。 身份验证是加密的核心属性之一,它可以帮助我们进行身份验证并实现数据完整性。

MD5 是一种用于密码真实性或验证文件原创性的有效算法,因为它逐位检查文件或密码的哈希值。

MD5算法有4个突出的步骤:

  1. 填充位
  2. 附加长度
  3. 初始化MB缓冲区
  4. 处理每个块

填充位

我们的初始消息可以是任何大小,4000 位、1231 位或任何其他位数; 然后,我们添加一些填充位。 最后,您需要确保 64 位的大小是 512 的倍数。

我们在开头添加 1,其余的 0 在填充中。

附加长度

在此步骤中,为了使最终消息成为 512 的倍数,您需要向其中添加更多字符。 为此,请获取原始消息的长度并以 64 位的形式表示。

这种组合为我们提供了要散列读数的最终消息。

初始化MB缓冲区

是时候初始化缓冲区 A、B、C 和 D 了; 每个缓冲区用于计算消息摘要的值。 每个缓冲区都是 32 位,初始化如下:

A = 01 23 45 67
B = 89 ab cd ef
C = fe dc ba 98
D = 76 54 32 10

处理每个块

每个 512 位块被分成 16 个块的进一步小块; 每个子块的大小为32位。 总的来说,四轮处理每个块并执行一些特定操作。

每轮都利用全部 16 个块,并且缓冲区是常量数组值。

常量数组表示为 T[1] -> T[64],所有子块表示为 M[0] -> m[15]

MD5的工作原理

根据此图,您可以看到正在为每个缓冲区运行这些值。

void print_MD5(unsigned char* md, long size = MD5_DIGEST_LENGTH) {
  for (int i=0; i<size; i++) {
    cout<< hex << setw(2) << setfill('0') << (int) md[i];
  }
}

该函数用于正确打印MD。

#include <iostream>
#include "md5.h" // This is an external library that you need to import for MD5 algorithm

using namespace std; // for cout

int main(){
cout << "md5 of 'grape' : " << md5("grape") << endl;
return 0;
}

输出:

md5 of 'grape' : b781cbb29054db12f88f08c6e161c199

此代码包含一个外部库 md5.h,允许您使用 MD5 算法并生成纯文本的哈希值。 我们将字符串葡萄作为参数传递给返回文件哈希值的 md5 函数。

fileSize = file.tellg();
cout << "File size \t"<< fileSize << endl;
memBlock = new char[fileSize];
file.seekg(0,ios::beg);
file.read(memBlock, fileSize);
file.close();

获取文件大小并将其复制到内存中。


总结

MD5 哈希算法基于从纯文本中获取密码哈希值的复杂数学公式。 正如我们在 MD5 算法的工作中所看到的,它将纯文本转换为特定大小的块,并对其执行不同的操作。

最后,我们根据文本压缩 128 位值。 字母a的MD5算法哈希值看起来像0cc175b9c0f1b6a831c399e269772661。

上一篇:将 C# 代码转换为 C++

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

将 C# 代码转换为 C++

发布时间:2023/08/18 浏览次数:183 分类:C++

本指南将讨论如何将 C# 代码转换为 C++。将整个语言转换为另一种语言被认为几乎是不可能的。 在这种情况下,C# 到 C++ 代码适用于 Unix,但 .NET Framework 无法从 Unix 上的 C++ 获得。

在 C++ 中使用 extern C

发布时间:2023/08/18 浏览次数:140 分类:C++

本文讨论 C++ 中的名称重整,这是理解 C++ 中 extern "C" 影响的先决条件。 此外,它还介绍了 C++ 编程中的 extern“C”。C++ 中 extern "C" 的使用 我们使用extern关键字来定义全局变量,也称为外部变量

C++中的串口连接

发布时间:2023/08/18 浏览次数:151 分类:C++

本文介绍了使用 Windows API 打开、读取、写入和管理串行端口连接的基础知识。本文的主要目的是让您基本了解编程中的串行通信如何工作,并让您朝着正确的方向开始。

C++ 中的反射

发布时间:2023/08/18 浏览次数:171 分类:C++

本文将讨论 C++ 中的反射、目的和实现。 我们将进一步研究使用反射的优点和缺点。C++ 中的反射 反射是一种编程机制,允许您编写适用于任何对象类型的通用代码。

C++ 中 DWORD 和 Unsigned Int 的区别

发布时间:2023/08/18 浏览次数:187 分类:C++

本文将介绍 DWORD 在 C++ 中的一般用法,它与 unsigned int 有着根本的不同,尽管它们目前具有相同的值。C++ 中 DWORD 和 unsigned int 的区别 根据定义,unsigned int 至少有 16 位长。 unsigned int 通常是特定

修复 C++ 中的分段错误

发布时间:2023/08/18 浏览次数:192 分类:C++

本文将讨论 C++ 中的分段错误并提供解决此问题的解决方案。C++ 中的分段错误当您的程序或系统尝试访问超出其范围的内存时,C++ 中就会出现分段错误。 这是导致程序在运行时崩溃的常见情况

在 C++ 中通过掷骰子生成随机值

发布时间:2023/04/09 浏览次数:172 分类:C++

本文解释了如何使用时间因子方法和模拟 C++ 中的掷骰子的任意数方法生成随机数。了解它是如何工作的以及它包含哪些缺点。提供了一个 C++ 程序来演示伪数生成器。

在 C++ 中使用模板的链表

发布时间:2023/04/09 浏览次数:162 分类:C++

本文解释了使用模板在 C++ 中创建链表所涉及的各个步骤。工作程序演示了一个链表,该链表使用模板来避免在创建新变量时声明数据类型的需要。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便