MD5加密及Python源码魔改

MD5全称:message-digest algorithm 5 

翻译过来就是:信息 摘要 算法 5

一、特点

1.长度固定:

不管多长的字符串,加密后长度都是一样长 

作用:方便平时信息的统计和管理

详解:经过MD5加密生成一个固定长度为128bit的串。因为128位0和1的二进制串表达不友好,因此转化为了16进制,128/4 = 32位的16进制。将32位去掉前8位和后8位得到的是16位。因此会有MD5的32位 和16位加密说法

2.易计算:

字符串和文件加密的过程是容易的. 

作用: 开发者很容易理解和做出加密工具

3.细微性

一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变. 

作用:很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动.

4.不可逆性

你明明知道密文和加密方式,你却无法反向计算出原密码. 

作用:基于这个特点,很多安全的加密方式都是用到.大大提高了数据的安全性

不可逆的原因:摘要是部分内容,因此由MD5的密文和加密方式会得到很多明文,而无法确定明文。

一个原始数据,只对应一个md5值;但是一个md5值,可能对应多个原始数据。

补充:MD5常用于字符串和文件的加密

二、撞库

关于撞库破解:

这是概率极低的破解方法,原理就是:

1.建立一个大型的数据库,把日常的各个语句,通过MD5加密成为密文,不断的积累大量的句子,放在一个庞大的数据库里.

2.比如一个人拿到了别人的密文,想去查询真实的密码,就需要那这个密文去到提供这个数据库的公司网站去查询.

这就是撞库的概念.

三、关于MD5加盐:

比如我的银行密码是"12345"

1.得到的MD5是:827ccb0eea8a706c4c34a16891f84e7b

2.一个人截取到这个密文,那么通过撞库肯定容易撞出12345.

3.我们要做的就是加盐,银行密码还是"12345",然后我把银行密码加上我特定的字符串才计算MD5 

import binascii
import sys
import os.pathSV = [0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf,0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af,0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6,0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8,0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, 0xd9d4d039,0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97,0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391]# 根据ascil编码把字符转成对应的二进制
def binvalue(val, bitsize):binval = bin(val)[2:] if isinstance(val, int) else bin(ord(val))[2:]if len(binval) > bitsize:raise ("binary value larger than the expected size")while len(binval) < bitsize:binval = "0" + binvalreturn binvaldef string_to_bit_array(text):array = list()for char in text:binval = binvalue(char, 8)array.extend([int(x) for x in list(binval)])return array# 循环左移
def leftCircularShift(k, bits):bits = bits % 32k = k % (2 ** 32)upper = (k << bits) % (2 ** 32)result = upper | (k >> (32 - (bits)))return (result)# 分块
def blockDivide(block, chunks):result = []size = len(block) // chunksfor i in range(0, chunks):result.append(int.from_bytes(block[i * size:(i + 1) * size], byteorder="little"))return result# F函数作用于“比特位”上
# if x then y else z
def F(X, Y, Z):return ((X & Y) | ((~X) & Z))# if z then x else y
def G(X, Y, Z):return ((X & Z) | (Y & (~Z)))# if X = Y then Z else ~Z
def H(X, Y, Z):return (X ^ Y ^ Z)def I(X, Y, Z):return (Y ^ (X | (~Z)))# 四个F函数
def FF(a, b, c, d, M, s, t):result = b + leftCircularShift((a + F(b, c, d) + M + t), s)return (result)def GG(a, b, c, d, M, s, t):result = b + leftCircularShift((a + G(b, c, d) + M + t), s)return (result)def HH(a, b, c, d, M, s, t):result = b + leftCircularShift((a + H(b, c, d) + M + t), s)return (result)def II(a, b, c, d, M, s, t):result = b + leftCircularShift((a + I(b, c, d) + M + t), s)return (result)# 数据转换
def fmt8(num):bighex = "{0:08x}".format(num)binver = binascii.unhexlify(bighex)result = "{0:08x}".format(int.from_bytes(binver, byteorder='little'))return (result)# 计算比特长度
def bitlen(bitstring):return len(bitstring) * 8def md5sum(msg):# 计算比特长度,如果内容过长,64个比特放不下。就取低64bit。msgLen = bitlen(msg) % (2 ** 64)# 先填充一个0x80,其实是先填充一个1,后面跟对应个数的0,因为一个明文的编码至少需要8比特,所以直接填充 0b10000000即0x80msg = msg + b'\x80'  # 0x80 = 1000 0000# 似乎各种编码,即使是一个字母,都至少得1个字节,即8bit才能表示,所以不会出现原文55bit,pad1就满足的情况?可是不对呀,要是二进制文件呢?# 填充0到满足要求为止。zeroPad = (448 - (msgLen + 8) % 512) % 512zeroPad //= 8msg = msg + b'\x00' * zeroPad + msgLen.to_bytes(8, byteorder='little')# 计算循环轮数,512个为一轮msgLen = bitlen(msg)iterations = msgLen // 512# 初始化变量# 算法魔改的第一个点,也是最明显的点A = 0x67452301B = 0xefcdab89C = 0x98badcfeD = 0x10325476# MD5的主体就是对abcd进行n次的迭代,所以得有个初始值,可以随便选,也可以用默认的魔数,这个改起来毫无风险,所以大家爱魔改它,甚至改这个都不算魔改。# main loopfor i in range(0, iterations):a = Ab = Bc = Cd = Dblock = msg[i * 64:(i + 1) * 64]# 明文的处理,顺便调整了一下端序M = blockDivide(block, 16)# Roundsa = FF(a, b, c, d, M[0], 7, SV[0])d = FF(d, a, b, c, M[1], 12, SV[1])c = FF(c, d, a, b, M[2], 17, SV[2])b = FF(b, c, d, a, M[3], 22, SV[3])a = FF(a, b, c, d, M[4], 7, SV[4])d = FF(d, a, b, c, M[5], 12, SV[5])c = FF(c, d, a, b, M[6], 17, SV[6])b = FF(b, c, d, a, M[7], 22, SV[7])a = FF(a, b, c, d, M[8], 7, SV[8])d = FF(d, a, b, c, M[9], 12, SV[9])c = FF(c, d, a, b, M[10], 17, SV[10])b = FF(b, c, d, a, M[11], 22, SV[11])a = FF(a, b, c, d, M[12], 7, SV[12])d = FF(d, a, b, c, M[13], 12, SV[13])c = FF(c, d, a, b, M[14], 17, SV[14])b = FF(b, c, d, a, M[15], 22, SV[15])a = GG(a, b, c, d, M[1], 5, SV[16])d = GG(d, a, b, c, M[6], 9, SV[17])c = GG(c, d, a, b, M[11], 14, SV[18])b = GG(b, c, d, a, M[0], 20, SV[19])a = GG(a, b, c, d, M[5], 5, SV[20])d = GG(d, a, b, c, M[10], 9, SV[21])c = GG(c, d, a, b, M[15], 14, SV[22])b = GG(b, c, d, a, M[4], 20, SV[23])a = GG(a, b, c, d, M[9], 5, SV[24])d = GG(d, a, b, c, M[14], 9, SV[25])c = GG(c, d, a, b, M[3], 14, SV[26])b = GG(b, c, d, a, M[8], 20, SV[27])a = GG(a, b, c, d, M[13], 5, SV[28])d = GG(d, a, b, c, M[2], 9, SV[29])c = GG(c, d, a, b, M[7], 14, SV[30])b = GG(b, c, d, a, M[12], 20, SV[31])a = HH(a, b, c, d, M[5], 4, SV[32])d = HH(d, a, b, c, M[8], 11, SV[33])c = HH(c, d, a, b, M[11], 16, SV[34])b = HH(b, c, d, a, M[14], 23, SV[35])a = HH(a, b, c, d, M[1], 4, SV[36])d = HH(d, a, b, c, M[4], 11, SV[37])c = HH(c, d, a, b, M[7], 16, SV[38])b = HH(b, c, d, a, M[10], 23, SV[39])a = HH(a, b, c, d, M[13], 4, SV[40])d = HH(d, a, b, c, M[0], 11, SV[41])c = HH(c, d, a, b, M[3], 16, SV[42])b = HH(b, c, d, a, M[6], 23, SV[43])a = HH(a, b, c, d, M[9], 4, SV[44])d = HH(d, a, b, c, M[12], 11, SV[45])c = HH(c, d, a, b, M[15], 16, SV[46])b = HH(b, c, d, a, M[2], 23, SV[47])a = II(a, b, c, d, M[0], 6, SV[48])d = II(d, a, b, c, M[7], 10, SV[49])c = II(c, d, a, b, M[14], 15, SV[50])b = II(b, c, d, a, M[5], 21, SV[51])a = II(a, b, c, d, M[12], 6, SV[52])d = II(d, a, b, c, M[3], 10, SV[53])c = II(c, d, a, b, M[10], 15, SV[54])b = II(b, c, d, a, M[1], 21, SV[55])a = II(a, b, c, d, M[8], 6, SV[56])d = II(d, a, b, c, M[15], 10, SV[57])c = II(c, d, a, b, M[6], 15, SV[58])b = II(b, c, d, a, M[13], 21, SV[59])a = II(a, b, c, d, M[4], 6, SV[60])d = II(d, a, b, c, M[11], 10, SV[61])c = II(c, d, a, b, M[2], 15, SV[62])b = II(b, c, d, a, M[9], 21, SV[63])A = (A + a) % (2 ** 32)B = (B + b) % (2 ** 32)C = (C + c) % (2 ** 32)D = (D + d) % (2 ** 32)result = fmt8(A) + fmt8(B) + fmt8(C) + fmt8(D)return resultif __name__ == "__main__":data = str("123456").encode("UTF-8")print("plainText: ", data)print("result: ", md5sum(data))

四、MD5加密调用:

        

import hashlibstr = "codeooo"#字符串转化bytes
encryptValue = bytes(str, encoding="utf8")
# encryptValue = str.encode(str)#bytes转化字符串
# byteValue = b'codeooo'
# str(byteValue, encoding="utf-8")
# bytes.decode(byteValue)#常规写法
m = hashlib.md5()
m.update(encryptValue)
md5_encrypt = m.hexdigest()# 或者可以这样
md5_encrypt = hashlib.md5(encryptValue).hexdigest()# 也可以使用hash.new()这个一般方法
md5_encrypt = hashlib.new(encryptValue).hexdigest()

HMAC-MD5 特征:

 

十六进制:

 

 十进制:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1380010.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【教程】初识云函数,实现无需服务器的项目上云!

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 你是否也在忧愁&#xff0c;想把自己的项目放在云上跑&#xff0c;但又不想花大价钱购买云服务器&#xff1f; 云函数介绍 云函数(Serverless Cloud Function&#xff0c;SCF)的简单理解就是&#xff1a;可以部署…

四、文件上传系列-计算文件MD5值

根据业务需要&#xff0c;在上传文件前我们要读取文件的md5值&#xff0c;将md5值传给后端用作秒传和断点续传文件的唯一标识。那么前端就需要使用js获取文件的md5值&#xff0c;对于普通小文件可以很轻松的读取文件md5值&#xff0c;而超大文件的md5值是如何快速的获取到的呢&…

大华智慧园区综合管理平台SQL注入漏洞

大华智慧园区综合管理平台SQL注入漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现PoC查询当前用户小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者…

ApiPost的使用

1. 设计接口 请求参数的介绍 Query:相当于get请求&#xff0c;写的参数在地址栏中可以看到 Body: 相当于 post请求&#xff0c;请求参数不在地址栏中显示。 请求表单类型&#xff0c;用form-data json文件类型&#xff0c;用row 2. 预期响应期望 设置完每一项点一下生成响应…

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

Chrome浏览器各版本对应的驱动

目录 1、Chrome浏览器各版本&#xff08;低版本&#xff09;对应的驱动2、其他版本&#xff08;高版本&#xff09;直接在对应的目录下下载即可3、下载地址 1、Chrome浏览器各版本&#xff08;低版本&#xff09;对应的驱动 chromedriver版本支持的Chrome版本v2.41v67-69v2.40v…

使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户端4.1 连接WebDav服务器4.2 连接成功4.2 连接成功 1. Linux(centos8…

FFmpeg常见命令行(五):FFmpeg滤镜使用

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

Labview控制APx(Audio Precision)进行测试测量(五)

驱动程序 VIs如何处理配置设置中的单元 APx500 应用程序具有复杂的控件&#xff0c;具有以下功能: 数值和单位组合在一个控制中(例如&#xff0c;1.000 Vrms ) •值转换为 SI 格式(例如&#xff0c;1.000 mVrms 或 1.000 μVrms) •单位之间的转换发生在控制(例如&#xff0c;V…

警惕!部分iPhone 6S无法开机,Apple已推出了维修计划

苹果已经发布了一项新维修计划的通知&#xff0c;以解决导致某些iPhone 6S和6S Plus手机无法开机的问题。该程序页面说&#xff1a;“苹果公司确定某些iPhone 6s和iPhone 6s Plus设备可能由于组件故障而无法开机。”该程序俗称“ iPhone 6s和iPhone 6s Plus服务程序&#xff0c…

苹果待处理订单要多久_用苹果 iPhone 时操作失误被扣费,该如何申请退款?

不知道大家是否遇到过这种情况: 在 iPhone 上使用某些应用时,显示需要付费,自己本身是拒绝的,结果一不小心点错了,出现误操作导致出现了扣费的问题。 咳咳,肯定不止我一个人遇到过,这时候很多人就慌了,有的赶紧联系客服,有的就觉得几块钱的事,算了。 其实这种误操作导…

iphone手机计算机彩蛋,神奇彩蛋!iPhone 6可用容量从537MB秒变3.3GB

16GB版&#xff0c;也叫乞丐版iPhone用户有个共同的秘密&#xff1a;每隔一段时间就要想办法清理手机存储空间&#xff0c;删掉那些不常用的app。实在删不动的时候&#xff0c;难免后悔没多花几百块钱买64GB的。乐观派则会安慰自己&#xff0c;常常清理手机有助于养成“断舍离”…

苹果app退款_苹果App Store应用,5月最新退款

作为一个iOS设备用户&#xff0c;在AppStore上买点东西那是难免的&#xff0c;比如看到什么好玩的游戏或好用的APP&#xff0c;只要不是贵的离谱&#xff0c;相比不少人都不会吝啬这点钱&#xff0c;但人总有看走眼的时候&#xff0c;一旦不小心买错APP该如何申请退款呢&#x…

文字生成图片:输入描述语,人工智能自动帮你绘图!

Disco Diffusion 是发布于 Google Colab 平台的一款利用人工智能深度学习进行数字艺术创作的工具&#xff0c;它是基于 MIT 许可协议的开源工具&#xff0c;可以在 Google Drive 直接运行&#xff0c;也可以部署到本地运行&#xff0c;目前最新的版本是 Disco Diffusion v5.2。…

Python人工智能之图片识别,Python3一行代码实现图片文字识别

自学Python3第5天&#xff0c;今天突发奇想&#xff0c;想用Python识别图片里的文字。没想到Python实现图片文字识别这么简单&#xff0c;只需要一行代码就能搞定 #作者微信&#xff1a;2501902696 from PIL import Image import pytesseract #上面都是导包&#xff0c;只需要…

人工智能识别图片食物

一、准备食物图片&#xff08;橘子和苹果&#xff09; 二、识别学习关键代码编写 public static void study() throws Exception {//学习 Picture picture new Picture();//图片解析类 图片&#xff08;文件&#xff09;-三通道矩阵 Config config new Config();//现有的环境…

【论文阅读】基于深度学习的时序预测——Crossformer

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文三&#xff1a;2022 FEDformer&#xff1a;长序列数据预测 论文四&#xff1a;2022 Non-Stationary Transformers&#xff1a;非平…

人工智能图片分类Python小程序

个人小作业&#xff0c;虽说做的很差&#xff0c;也算是一个学习的转化&#xff1b;主要用于分类自己下载的壁纸 1 背景 学期末需要一个学习成果的展示&#xff0c;高难度的自己做不来&#xff0c;模型也跑不动&#xff08;电脑有点渣&#xff09;&#xff0c;刚好自己也有图…

人工智能最全图谱

在过去的几个月中&#xff0c;我一直在收集有关人工智能的相关资料。随着各种的问题被越来越频繁的提及&#xff0c;我决定整理并分享有关人工智能、神经网络、机器学习、深度学习与大数据的技术合辑。同时为了内容更加生动易懂&#xff0c;本文将会针对各个大类展开详细解析。…

人工智能AI - 以图搜图产品

网站首页 以图搜图产品 主要特性 底层使用特征向量相似度搜索单台服务器十亿级数据的毫秒级搜索近实时搜索&#xff0c;支持分布式部署随时对数据进行插入、删除、搜索、更新等操作支持在线用户管理与服务器性能监控&#xff0c;支持限制单用户登录 系统功能 搜索管理&#…