banner
NEWS LETTER

网络安全(10)身份证MD5解码

Scroll down

身份证MD5解码

题目内容

需要猜测身份证号码,已经知道md5编码为"48ef223d1f70475f08e7206b9f36ed9d",根据其他题目信息得到身份证号码为51xxxx19xx0728xx10,共有8位不知道的数字。

具体解题步骤

1. MD5

作用:密码保护 数据校验 文件秒传 数字签名。
MD5编码最后得到的密码长度保持不变,均为16字节

编码规则:

  1. 首先进行补位使文件长度变为N*512+448,补位规则为补充1000000...,剩下的64位为数据的长度;
  2. 准备四个标准幻数(每一个都是4字节)为:
    1
    2
    3
    4
    A = 0x67452301
    B = 0xEFCDAB89
    C = 0x98BADCFE
    D = 0x10325476
  3. 处理数据
    将原始数据每512bits为一个分组 (这就是前面要求填充到512整数倍的原因),对每组分别进行处理,进行一系列的逻辑操作,得到最终四个标准幻数,四个标准幻数即为最终输出编码。

2. 解题

思路:md5不可以进行逆向解析,简单的遍历即可,共有八位模糊,每两位为一组进行循环尝试,做一个四层嵌套循环

基础:
进行md5编码的代码块:

1
2
hash_object = hashlib.md5(string4.encode())  # 将字符串编码并进行 MD5 加密
hash_hex = hash_object.hexdigest() # 获取加密后的十六进制字符串

注:考试环境下,如何在python中寻找帮助help('hashlib')

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import hashlib

str_ture = "48ef223d1f70475f08e7206b9f36ed9d" #正确字符串

def main():
for i in range(100):
string1 = "51"+'{:02}'.format(i) # 要进行加密的字符串
for j in range(100):
string2 = string1 + '{:02}'.format(j)
for k in range(100):
string3 = string2 + '19' +'{:02}'.format(k) + '0728'
for n in range(100):
string4 = string3 + '{:02}'.format(n) + '10'
hash_object = hashlib.md5(string4.encode()) # 将字符串编码并进行 MD5 加密
hash_hex = hash_object.hexdigest() # 获取加密后的十六进制字符串
if hash_hex == str_ture:
print(string4)
break

if __name__ == "__main__":
main()
其他文章