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 <> (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编程语言的深度探索,我们可以更加深入地理解计算机科学领域的相关知识,掌握更加广阔的编程技能。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270218.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-16 13:36
下一篇 2024-12-16 13:36

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python编程二级证书考试相关现已可以上网购买

    计算机二级Python考试是一项重要的国家级认证考试,也是Python编程的入门考试。与其他考试一样,Python编程二级证书的考生需要进入正式考试,而为了备考,这篇文章将详细介绍…

    编程 2025-04-29

发表回复

登录后才能评论