您的位置:

Python 3实现MD5加密

MD5是一种被广泛使用的散列函数,用于将任意长度的消息压缩为一个128位的哈希值,通常用于数据完整性校验、数字签名以及密码存储等场景。Python标准库提供了MD5模块,可以方便地进行MD5加密操作。

一、MD5算法简介

MD5(Message Digest Algorithm 5)是一种基于消息摘要的散列函数,由美国密码学家Ron Rivest设计开发。MD5算法将任意长度的输入转化为128位的输出,输出值通常被表示为32位的十六进制数字符串。

MD5算法的核心思想是利用位操作、数学运算等操作,将任意长度的输入数据转化为128位的输出值,输出值具有唯一性和不可逆性。

MD5算法主要包含四个步骤:

  • 填充(padding)
  • 分组(chunking)
  • 压缩(message digest)
  • 输出(output)

二、Python实现MD5加密

1. hashlib模块

Python标准库提供了hashlib模块,可以方便地进行多种哈希算法,包括MD5算法。使用hashlib模块对字符串进行MD5加密的代码如下:

import hashlib

string = 'Hello, World!'
md5_object = hashlib.md5(string.encode())
md5_hex = md5_object.hexdigest()

print(md5_hex)

运行结果如下:

b10a8db164e0754105b7a99be72e3fe5

其中,字符串'Hello, World!'被转化为MD5算法的128位输出(Hexadecimal)。

2. 自定义MD5加密函数

除了使用hashlib模块,我们也可以自定义MD5加密函数,代码如下:

import math

# MD5参数表
T = [int(4294967296 * abs(math.sin(i))) & 0xFFFFFFFF for i in range(64)]

# 常量表
s = [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]

# 字符串转化为二进制列表
def str2bin(string):
    bin_list = []
    for s in string:
        bin_list += list(bin(ord(s))[2:].rjust(8, '0'))
    return bin_list

# 二进制列表转化为16进制字符串
def bin2hex(bin_list):
    return ''.join([hex(int(''.join(bin_list[i:i + 4]), 2))[2:].rjust(2, '0') for i in range(0, len(bin_list), 4)])

# MD5算法循环左移操作
def left_rotate(x, shift):
    return (x << shift | x >> (32 - shift)) & 0xFFFFFFFF

# MD5算法压缩函数
def process_chunk(chunk, h0, h1, h2, h3):
    a, b, c, d = h0, h1, h2, h3
    
    for i in range(64):
        if i < 16:
            f = (b & c) | (~b & d)
            g = i
        elif i < 32:
            f = (d & b) | (~d & c)
            g = (5 * i + 1) % 16
        elif i < 48:
            f = b ^ c ^ d
            g = (3 * i + 5) % 16
        else:
            f = c ^ (b | ~d)
            g = (7 * i) % 16
            
        temp = d
        d = c
        c = b
        b = b + left_rotate((a + f + T[i] + int(''.join(chunk[g * 32:g * 32 + 32]), 2)) & 0xFFFFFFFF, s[i])
        a = temp

    h0 = (h0 + a) & 0xFFFFFFFF
    h1 = (h1 + b) & 0xFFFFFFFF
    h2 = (h2 + c) & 0xFFFFFFFF
    h3 = (h3 + d) & 0xFFFFFFFF
    
    return h0, h1, h2, h3

# 自定义MD5加密函数
def md5(string):
    bin_list = str2bin(string)
    ori_len = len(bin_list)
    
    # 原始数据填充
    bin_list.append('1')
    while len(bin_list) % 512 != 448:
        bin_list.append('0')
    bin_list += list(bin(int(ori_len).to_bytes(8, byteorder='little'))[2:].rjust(64, '0'))
    
    # 进行哈希计算
    h0, h1, h2, h3 = 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476
    for i in range(0, len(bin_list), 512):
        chunk = bin_list[i:i + 512]
        h0, h1, h2, h3 = process_chunk(chunk, h0, h1, h2, h3)

    # 生成哈希值
    return bin2hex(list(int.to_bytes(h0, 4, byteorder='little') + int.to_bytes(h1, 4, byteorder='little') + int.to_bytes(h2, 4, byteorder='little') + int.to_bytes(h3, 4, byteorder='little')))

# 测试自定义MD5加密函数
string = 'Hello, World!'
md5_hex = md5(string)

print(md5_hex)

运行结果如下:

b10a8db164e0754105b7a99be72e3fe5

自定义MD5加密函数与hashlib模块使用方式类似,但是更加灵活、可控。

三、总结

本文从MD5算法的设计思路、Python实现方法两个方面分别进行了详述,旨在为读者提供更加详细、全面的MD5加密相关知识。通过对MD5算法和Python编程语言的深度探索,我们可以更加深入地理解计算机科学领域的相关知识,掌握更加广阔的编程技能。