https://www.cmd5.com/, 该网站针对md5、sha1等全球通用公开的加密算法进行反向查询,通过穷举字符组合的方式,创建了明文密文对应查询数据库,创建的记录约90万亿条,占用硬盘超过500TB,查询成功率95%以上,很多复杂密文只有本站才可查询。已稳定运行十余年,国内外享有盛誉。
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,操作如下:
# Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,操作如下
import hashlib
# md5加密需要传递的时bytes类型
passwd = b'123456'
md5_passwd = hashlib.md5(passwd).hexdigest()
print(md5_passwd)
加密之后的结果:
MD5目前人类是无法解密的,目前人类的MD5解密方法是建立一个大型数据库,将各个人的MD5数据存储在这个数据库里面,然后将所需要解密的密码放入该库对比找到同样原码,如果没有对比到数据,说明该密没有被记录过,也就是说没有办法解密了。
需求:完成一个对银行密码进行MD5加密解密的应用,流程如下:
首先对银行密码(6个数字组成)进行穷举并MD5加密,然后存储到数据库中。在客户端输入选项(加密/解密),如果是加密,则直接显示结果;如果是解密,则把输入的密码密文与数据库中的明文-密文进行一一比对,输出密文对应的明文结果。
Step 1:穷举6位数的银行密码,进行MD5加密之后存储到.json文件中。
import hashlib
import json
import tqdm #是一个进度条库,可以在python长循环中加一个进度提示信息
from string import digits
db = {}
for item1 in tqdm.tqdm(digits): #这个循环太长,导致等待时间很长,所以友好显示进度条
for item2 in digits:
for item3 in digits:
for item4 in digits:
for item5 in digits:
for item6 in digits:
#passwd 此时是str类型
passwd = item1 + item2 + item3 + item4 + item5 + item6
#md5加密需要的字符串时bytes类型, 将utf-8的编码格式编码成bytes类型
bytes_passwd = passwd.encode('utf-8')
md5_passwd = hashlib.md5(bytes_passwd).hexdigest()
db[md5_passwd] = passwd
# 将db字典的信息以json的格式存储到passwd.json文件中
json.dump(db,open('passwd.json','w'))
print('载入数据库成功。。。')
此时,在当前目录下会生成一个存储明文-密文的json文件。
Step 2:将json文件导入内存中用dict存储,以便查询对应关系。
import hashlib
import json
db = {}
filename = 'passwd.json'
db = json.load(open(filename,'r'))
while True:
choice = input('1).加密 2).解密 q).退出>>>')
if choice == '1':
passwd = input('请输入要加密的明文>>>')
bytes_passwd = passwd.encode('utf-8')
md5_passwd = hashlib.md5(bytes_passwd).hexdigest()
print('加密之后的密文为>>>'+md5_passwd)
elif choice == '2':
passwd = input('请输入要解密的密文>>>')
print('解密之后的密文为>>>')
print(db.get(passwd,'抱歉,当前密文无法解密'))
elif choice == 'q':
print('您正在退出MD5加密解密系统。。。')
exit(0)
else:
print('请输入正确的选项')