c++实现MD5算法实现代码

实现MD5算法的代码可以分成以下几个步骤:

  1. 将数据填充到512位的块中(padding it),满足mod 512 = 448

  2. 将数据块分成16个32位的字,每个字称为W。

  3. 初始化4个32位寄存器A、B、C、D,用于存储最终的结果。

  4. 对每一个数据块进行四轮的处理,每轮处理16次,通过位运算来更新结果寄存器。

  5. 所有数据块处理完后,将A、B、C、D四个寄存器按照顺序拼接起来,输出MD5结果。

下面是c++实现MD5的示例代码:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <cstring>

using namespace std;

unsigned long int shift_amounts[64] =
{
    7, 12, 17, 22,
    7, 12, 17, 22,
    7, 12, 17, 22,
    7, 12, 17, 22,
    5, 9, 14, 20,
    5, 9, 14, 20,
    5, 9, 14, 20,
    5, 9, 14, 20,
    4, 11, 16, 23,
    4, 11, 16, 23,
    4, 11, 16, 23,
    4, 11, 16, 23,
    6, 10, 15, 21,
    6, 10, 15, 21,
    6, 10, 15, 21,
    6, 10, 15, 21
};

unsigned long int constants[64] =
{
    0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
    0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
    0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
    0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
    0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
    0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
    0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
    0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
    0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
    0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
    0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
    0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
    0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
    0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
    0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};

string md5(const string input) {

    unsigned long int h0 = 0x67452301;
    unsigned long int h1 = 0xEFCDAB89;
    unsigned long int h2 = 0x98BADCFE;
    unsigned long int h3 = 0x10325476;

    unsigned long int a, b, c, d, f, g, temp;
    unsigned long int *chunk;
    unsigned long int w[16];
    unsigned int i, j;

    // Pre-processing
    int original_length = input.size();
    int padded_length = (((original_length + 8) / 64) + 1) * 64;
    chunk = new unsigned long int[padded_length];
    memcpy(chunk, input.c_str(), original_length);

    chunk[original_length] = 0x80;

    for (i = original_length + 1; i < padded_length - 8; ++i) {
        chunk[i] = 0;
    }

    long int bit_length = 8 * original_length;
    memcpy(chunk + padded_length - 8, &bit_length, 4);

    // Main loop
    for (i = 0; i < padded_length; i += 64) {

        a = h0;
        b = h1;
        c = h2;
        d = h3;

        // Load chunk into w
        for (j = 0; j < 16; ++j) {
            w[j] = chunk[i + j];
        }

        // Main loop
        for (j = 0; j < 64; ++j) {

            if (j < 16) {
                f = (b & c) | ((~b) & d);
                g = j;
            }
            else if (j < 32) {
                f = (d & b) | ((~d) & c);
                g = (5 * j + 1) % 16;
            }
            else if (j < 48) {
                f = b ^ c ^ d;
                g = (3 * j + 5) % 16;
            }
            else {
                f = c ^ (b | (~d));
                g = (7 * j) % 16;
            }

            temp = d;
            d = c;
            c = b;

            b = b + ((a + f + constants[j] + w[g]) << shift_amounts[j]);
            a = temp;
        }

        h0 += a;
        h1 += b;
        h2 += c;
        h3 += d;
    }

    // Cleanup
    ostringstream result;
    result << hex << setw(8) << setfill('0') << h0
        << hex << setw(8) << setfill('0') << h1
        << hex << setw(8) << setfill('0') << h2
        << hex << setw(8) << setfill('0') << h3;
    string md5_hash = result.str();
    delete[] chunk;

    return md5_hash;
}

int main()
{
    string input1 = "hello world";
    string md5_hash1 = md5(input1);
    cout << "MD5 hash of \"" << input1 << "\" is: " << md5_hash1 << endl;

    string input2 = "MD5 implementation in C++";
    string md5_hash2 = md5(input2);
    cout << "MD5 hash of \"" << input2 << "\" is: " << md5_hash2 << endl;
    return 0;
}

上述代码中定义了常量数组shift_amountsconstants,分别用于MD5的左移位数和常数。

代码中还定义了函数md5,输入一个字符串,输出该字符串的MD5哈希值。实现代码中同时包含了两个示例,分别对字符串“hello world”和“MD5 implementation in C++”进行了MD5哈希。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++实现MD5算法实现代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 应用程序发生异常 unknown software exception的解决方法

    当我们在使用应用程序的时候,有时会突然遇到“应用程序发生异常:unknown software exception”的错误提示,这个提示非常晦涩难懂,让人手足无措。那么,这个错误是怎么产生的呢?如何才能有效地解决这个问题呢?下面,我将从以下几个方面为大家详细讲解。 1. 了解异常产生的原因 在解决问题之前,首先需要了解问题产生的原因。当应用程序发生异常时,提…

    C 2023年5月23日
    00
  • iOS之异常与信号使用场景分析

    iOS之异常与信号使用场景分析 异常 什么是异常 异常是指运行期间发生错误,导致应用程序不能正常执行的事件,例如:数组越界访问、空指针引用等。在OC中,异常时指通过在方法内部 raise 一个异常对象实例来表示异常事件的。 异常处理 在OC中,我们可以通过以下两个关键字来处理异常: @try: 被检测的代码中可能发生异常的部分需要放在这个语句块里; @cat…

    C 2023年5月23日
    00
  • C语言实现的猜数字小游戏

    C语言实现的猜数字小游戏攻略 游戏规则 系统会在1~100之间随机生成一个整数,玩家需要猜测这个数字是多少。 玩家每次输入一个数字,系统会告诉玩家猜的数字是否正确,如果不正确,还会告诉玩家猜测的数字是偏大还是偏小。 玩家可以根据系统的提示,逐步缩小猜测范围,直到猜中为止。 玩家最多可以猜测7次,如果7次内未能猜中,游戏结束。 游戏实现步骤 首先需要生成一个1…

    C 2023年5月23日
    00
  • C语言算法练习之折半查找的实现

    C语言算法练习之折半查找的实现 什么是折半查找 折半查找(也称二分查找)是一种在有序数组中查找指定元素的查找算法,时间复杂度为O(logn)。 实现步骤 在实现折半查找前,需要明确以下几个步骤: 确定查找区间范围; 计算查找区间的中间位置; 比较中间位置和目标值; 不断缩小查找范围,直到找到目标值或者查找区间为空。 下面我们来一步步实现。 定义函数 首先需要…

    C 2023年5月22日
    00
  • 深入理解c语言数组

    深入理解C语言数组 什么是数组 数组是一种数据结构,它是由相同类型的元素所组成的序列。 在C语言中,数组是由相同类型的元素在内存中连续存储所组成的。数组的下标是从0开始的非负整数,用于访问数组中的元素。数组的大小是在声明时指定的,一旦确定大小就不能改变。 数组的声明 C语言数组的声明格式如下: type arrayName[arraySize]; 其中,ty…

    C 2023年5月24日
    00
  • C语言代码实现通讯录管理系统

    C语言代码实现通讯录管理系统 1. 思路 通讯录管理系统主要分为三个模块:显示、添加、删除联系人。首先,我们需要定义一个联系人的结构体,包含姓名、电话、地址等基本信息。然后,通过数组来存储联系人信息,可以通过遍历数组来显示已有联系人,通过添加、删除数组中的元素来添加、删除联系人信息。 2. 代码实现 2.1 定义联系人结构体 在这个管理系统中,我们需要联系人…

    C 2023年5月23日
    00
  • 浅析c#中如何在form的webbrowser控件中获得鼠标坐标

    下面是详细讲解“浅析C#中如何在Form的WebBrowser控件中获得鼠标坐标”的完整攻略。 什么是WebBrowser控件 WebBrowser控件是Windows Forms中的一种控件,用于在Form窗体中嵌入一个Web浏览器。WebBrowser控件是一个包装了Internet Explorer浏览器的 ActiveX 控件,支持网页浏览、脚本执行…

    C 2023年5月23日
    00
  • 浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号

    浅析C/C++, Java, PHP, JavaScript, Json数组、对象赋值时最后一个元素后面是否可以带逗号 背景介绍 在编程中,我们经常会使用数组或者对象来存储一些数据,并且在定义这些数组或者对象时,我们需要对其中的元素进行赋值。在这个过程中,我们有时会产生一些疑问,比如在最后一个元素的后面是否可以带逗号。本文将针对不同编程语言中的数组和对象赋值…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部