文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MD5算法加密的过程

2024-12-03 18:56

关注

什么是 MD5

MD5 是一种算法, MD5 中的 MD 代表 Message Digest, 也即信息摘要.

至于数字 5, 则因它是从更早的 MD4 算法改进而来, 因此得名 MD5.

所以 MD5 即是信息摘要算法第五版.

什么是信息摘要算法

那什么又是信息摘要算法呢? 它本质上就是一个哈希函数(hash function).

又叫散列函数.

那什么又是哈希函数呢? 它是指这样一种函数: 它能把任意大小的数据映射(map)为一个固定大小的值.

A hash function is any function that can be used to map data of arbitrary size to fixed-size values.

哈希函数所返回的这个值称为哈希值(hash value), 又称为哈希码(hash codes), 或直接简称为哈希(hash).

具体例子

单纯地这样去讲会比较抽象, 因此这里引入具体例子来说明, 以 Java 为例, 可以这样去计算 MD5:

  1. public void rawMd5() throws NoSuchAlgorithmException { 
  2.     byte[] bytes = "hello".getBytes(StandardCharsets.UTF_8); 
  3.     MessageDigest md = MessageDigest.getInstance("MD5"); 
  4.     byte[] md5 = md.digest(bytes); 

注: 因为摘要计算的输入是一个字节数组, 如果要计算字符串的摘要值, 则要转成某种编码的字节数组, 为保持一致, 应始终显式使用同一种编码, 比如 utf-8.

从以上代码中也不难看出, 一个 MD5 函数的输入和输出都是字节数组 byte[].

而代码中不能直接体现的一点则是: 输入可以是任意大小的字节数组, 输出则是固定大小的字节数组.

对于 MD5 算法而言, 这个输出值是一个固定大小为 16 字节的数组, 然后因为每个字节(byte)有 8 个位(bit), 所以最终的输出值是一个 16 × 8 = 128 位的二进制数. MD5 的值就是一个 128 位的二进制大整数.

比如下面就是一个具体的 MD5 的值, 以原始的 128 位二进制形式表示: 10001000100100011001000111110000100011111000000111010010110010101100010111101010000110011011110000111011111101111101100110111110

这个 MD5 值实际是对我的网站域名 xiaogd.net 作摘要的结果.

这个值的二进制形式实在是长得不要不要的, 所以一般会转换为十六进制形式, 共 16 组具体为: 88 91 91 f0 8f 81 d2 ca c5 ea 19 bc 3b f7 d9 be. 依然还是很长, 但比二进制好多了.

随便说一句, IPv6 的地址也是 128 bit 的, 所以也是像这般变态的长, 写成 16 进制也还是很长, 压根记不住...

最后通常还会去掉空格写成一个紧凑的 32 个字符的字符串的形式: 889191f08f81d2cac5ea19bc3bf7d9be, 也即是我们最常见到的 MD5 值的形式.

但请不要误解, MD5 的值并不是一个字符串, 更不是什么字母都能出现在里边的.

本文中一个“字”是32位,一个“字节”是8位。

我们定义x_i代表“x减去I".如果减数是一个表达式,则用括号括住,如:x_{i+1}。同样我们用^代表求幂,这样x^i则代表x的i次幂。“+”代表“字”之间的相加,X<<< s代表X左移s位,not(X)表示对X进行按位补运算,X v Y表示按位或。X xor Y表示按位异或,XY表示按位与。

我们假设有一个b位长的信息作为输入,然后我们算出他的摘要信息。b是一个非负整数,b有可能是0,不需要一定是8的倍数,可能会非常得大。我们将输入信息描绘如下:

m_0 m_1 .. m_{b-1}

接下来的五步我们来算出它的摘要。

1、 填充

我们将输入信息填充到长度对512取余对于448。无论输入信息的长度多少,填充总是会发生的,即使本身的长度就已经满足模512对于448的情况下。

过程如下:

在输入信息后添加一个“1”位,其余添加“0”位使得输入信息长度满足对512取余对于448。总的来说,至少添加一位,至多添加512位。

举个例子:66

2、 补充数据长度

将输入信息b用64位表示并添加到填充的数据之后,如果b大于2^64的话,则只取低64位。

至此,我们的处理结果刚好是512的倍数,等效的,也是16字的倍数,我们用M[0...N-1]来表示这个结果,其中N是16的倍数。

3、 初始化MD缓冲区

用一个四字的缓冲区(A,B,C,D)来计算消息摘要,这里的A,B,C,D每一个都是一个32位的寄存器。这些寄存器的初始值如下,用16进制表示的,低位字节优先。

  1. word A: 01 23 45 67 
  2. word B: 89 ab dc ed 
  3. word C: fe dc ba 98 
  4. word D: 76 54 32 10 

4、 处理消息

我们首先需要定义四个辅助函数。

  1. F(X,Y,Z) = XY v not(X) Z 
  2. G(X,Y,Z) = XZ v Y not(Z) 
  3. H(X,Y,Z) = X xor Y xor Z 
  4. I(X,Y,Z) = Y xor (X v not(Z)) 

对于函数F来说,在每一位上F函数就像是一个选择器:if X then Y else Z。

这一步需要一个64长度的表格T[1...64],由sin函数构造而成。T[i]是4294967296次运行abs(sin(i))的结果,以此类推即可。

我们需要进行一下处理

  1.  
  2. For i = 0 to N/16-1 do 
  3.  
  4. For j = 0 to 15 do 
  5. Set X[j] to M[i*16+j]. 
  6. end  
  7.  
  8. AA = A 
  9. BB = B 
  10. CC = C 
  11. DD = D 
  12.  
  13.  
  14. [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4] 
  15. [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8] 
  16. [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12] 
  17. [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16] 
  18.  
  19.  
  20. [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20] 
  21. [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24] 
  22. [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28] 
  23. [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32] 
  24.  
  25.  
  26. [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36] 
  27. [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40] 
  28. [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44] 
  29. [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48] 
  30.  
  31.  
  32. [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52] 
  33. [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56] 
  34. [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60] 
  35. [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64] 
  36. A = A + AA 
  37. B = B + BB 
  38. C = C + CC 
  39. D = D + DD 
  40. end  

5、 输出

上一步输出最终的结果A,B,C,D。我们从A的低位字节开,到D的高位字节结束,每一个都是32位,最终拼接的结果就是4*32 = 128位,这就是MD5结算的结果。

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯