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日

相关文章

  • C语言实现简单职工信息管理系统

    C语言实现简单职工信息管理系统 1. 系统功能 本职工信息管理系统主要实现以下功能: 添加职工 显示职工信息 删除职工 修改职工信息 查找职工信息 排序职工信息 清空职工信息 退出系统 2. 系统设计 本系统主要由以下几个部分组成: 职工结构体定义 菜单函数实现 添加职工函数实现 显示职工信息函数实现 删除职工函数实现 修改职工信息函数实现 查找职工信息函数…

    C 2023年5月24日
    00
  • 逍遥自在学C语言 位运算符 “|” 的5种高级用法

    前言 在上一篇文章中,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法。 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、将两个字节合并成一个16位整数 #include <stdio.h> int main() { uns…

    C语言 2023年4月17日
    00
  • c++ 面向对象的类设计

    C++ 面向对象的类设计攻略 什么是面向对象的类设计 面向对象的类设计是指基于面向对象编程思想来设计类的过程。面向对象编程思想是一种编程范式,其中的对象是一个实例或者说是类的一个实例化对象,这些对象通过类之间的消息传递进行通信,从而共同完成一个复杂的任务。 在C++编程中,面向对象的类设计尤为重要,因为它是C++中的重要组成部分。经典的面向对象编程思想是将数…

    C 2023年5月22日
    00
  • 详解基于C++实现约瑟夫环问题的三种解法

    详解基于C++实现约瑟夫环问题的三种解法 约瑟夫问题 约瑟夫问题是一个经典的问题,是一个圆圈里面有$n$个数字,从中每次删除第$m$个数字,求出每次删除的数字。简单的说,约瑟夫问题就是$n$个人围成一圈,从第一个人开始报数,报到$m$的人出圈,直到计算到最后一个人。 解法一:使用递推(模拟游戏过程) 思路:利用递归的思想模拟即可。假如最后剩下一个数据,则保留…

    C 2023年5月22日
    00
  • python求解三角形第三边长实例

    接下来我将详细讲解“Python求解三角形第三边长实例”的完整攻略,包括以下内容: 题目描述 实现思路 代码实现 示例说明 1. 题目描述: 给出三角形两条边的长度,求第三条边的长度。 2. 实现思路: 假设已知三角形两边分别为a、b,其夹角为C。则可通过以下公式求解第三边长: c = math.sqrt(a ** 2 + b ** 2 – 2 * a * …

    C 2023年5月22日
    00
  • C语言实现最小生成树构造算法

    C语言实现最小生成树构造算法攻略 最小生成树(Minimum Spanning Tree,MST)是一种求加权无向连通图的生成树的算法,其可以将连通图的n个顶点连接起来,形成一个权值最小的树。本文将介绍使用C语言实现最小生成树构造算法的攻略。 算法简介 其中,Kruskal算法和Prim算法是最常用的两个求解最小生成树的算法。 Kruskal算法 Krusk…

    C 2023年5月22日
    00
  • C语言实现歌手大奖赛计分程序

    C语言实现歌手大奖赛计分程序 程序实现功能 本程序主要实现歌手大奖赛计分功能,包括对选手的评分以及最终的排名输出。 实现思路 程序主要分为以下几个步骤进行实现: 获取选手总数 获取评委人数 获取选手分数 对选手的得分进行排序 最终输出选手排名 具体实现步骤 获取选手总数以及评委人数 可以使用scanf函数来获取用户输入的选手总数以及评委人数。 int sin…

    C 2023年5月23日
    00
  • C语言如何在字符数组中插入一个字符

    以下是使用C语言在字符数组中插入一个字符的详细攻略: 1. 按照索引位置分割字符数组 首先,我们需要对原始的字符数组进行分割,将需要插入字符的位置之前和之后的部分分别提取出来。 具体而言,对于一个字符数组 str 和需要插入字符的索引位置 index,我们可以分别使用 strncpy() 函数和指针运算来完成分割: char str[MAX_SIZE] = …

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