python: SHA256算法的实现和消息的哈希散列值计算

目录

  • 1 SHA256
  • 2 实现原理
    • 2.1 消息预处理
    • 2.2 使用的常量和循环移位函数
    • 2.3 主循环
  • 3 结果
  • 4 对中文编码


1 SHA256

SHA256是SHA-2下的一个子算法,与之类似的还有SHA224、SHA384、SHA512,算法原理基本一致。

哈希算法通过对消息进行计算,生成一定长度的数据,称作消息摘要。SHA256能生成64*8=512 bits的消息摘要,每一个数据都可以当做一条消息的索引,这样能代表的数据就有2^512=13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096种可能,这个消息量已经足够大了。

另外,我们知道,能用一个摘要(索引)代表一条消息的前提是:没有其他消息的摘要与另一条不同消息的摘要相同,如果相同,称作碰撞。算法过于简单则会很容易发生碰撞,也就容易被破解。


2 实现原理

一些原理和伪代码可以参考这篇文章

2.1 消息预处理

消息预处理成长度是512bits的倍数。首先需要对消息进行至少一次的填充,先在消息后附加8比特的b10000000,然后填充0至长度模512余448。再填充64bits的长度,这样总长度就是512的倍数了。
计算长度时直接让长度值左移3位快速计算乘上8,也就是消息的比特长度。使用chr把int型数据转成比特对于的字符,注意和str的区别。

def msgProcess(m):# 附加长度str_l = chr(len(m)<<3)# 填充到模512448# 至少进行一次填充m += '\x80'm += '\x00' * ((55 - len(m)) % 64)str_l = '\x00' * (9 - len(str_l)) + str_lm += str_lreturn m

2.2 使用的常量和循环移位函数

循环右移时为了保证数据在32bits内,需要取与。

#预定义常量
_H0 = [0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]
_HashConstant = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2]def shiftRight(a, x, bitnum=32):return ((a >> x)|(a << (bitnum - x))) & (2 ** bitnum - 1)

2.3 主循环

流程是将预处理好的消息分成512bits的数据块处理,更新ABCDEFGH的值,在对数据进行操作后,每次加法都应与11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111取与使得消息大小受限制。

def mySHA256(message):H = _H0.copy() # 使用列表的复制,不要修改常量的值message = msgProcess(message)for i in range(0, len(message), 64):msg = message[i:i+64]W = []for j in range(0,64,4):cut = msg[j:j+4]W.append(ord(cut[0])*(256**3)+ord(cut[1])*(256**2)+ord(cut[2])*256+ord(cut[3]))W = W + ([0]*48)for j in range(16,64):s0 = shiftRight(W[j-15],7) ^ shiftRight(W[j-15],18) ^ (W[j-15]>>3)s1 = shiftRight(W[j-2],17) ^ shiftRight(W[j-2],19) ^ (W[j-2]>>10)W[j] = (W[j-16] + s0 + W[j-7] + s1) & (2**32-1)a,b,c,d,e,f,g,h = Hfor i in range(64):s0 = (shiftRight(a, 2) ^ shiftRight(a, 13) ^ shiftRight(a, 22)) & ((2**32)-1)maj = ((a & b) ^ (a & c) ^ (b & c)) & ((2**32)-1)t2 = (s0 + maj) & ((2**32)-1)s1 = (shiftRight(e,6) ^ shiftRight(e,11) ^ shiftRight(e,25)) & ((2**32)-1)ch = ((e & f) ^ (~e & g)) & ((2**32)-1)t1 = (h + s1 + ch + _HashConstant[i] + W[i]) & ((2**32)-1)a,b,c,d,e,f,g,h = (t1+t2) & ((2**32)-1), a,b,c,(d+t1) & ((2**32)-1),e,f,gtemp = [a,b,c,d,e,f,g,h]for i in range(8):H[i] += temp[i]H[i] = H[i] & ((2**32)-1)#转字符串,可能未满8位十六进制,补0en = [str(hex(it))[2:] for it in H]for i in range(8):it = en[i]if len(it)<8:en[i] = '0'*(8-len(it))+itreturn ''.join(en)

3 结果

if __name__ == '__main__':msg = ['121a s;f3','121a s;f3'*10]for it in msg:print('消息:   ', it)print('散列值: ', mySHA256(it))

哈希值计算
然后发现中文的计算和一些标准还是有些不同的。

4 对中文编码

使用gbk对含有中文的消息编码,编码后是bytes型数据,编写bytesstr互转的函数

def byte2str(b):s = ''for i in b:i = hex(i)[2:]s += str(i)return sdef str2byte(s):b = b''b = bytearray()ind = 0while ind < len(s):b.append(int(s[ind:ind+2],16))ind += 2return bytes(b)

此外,还有一个重点是,其实python库里有sha256算法…,它是hashlib库下的sha256函数,将两个对比一下结果

import hashlib
if __name__ == '__main__':msg = ['message','message'*16,'message'*17]for it in msg:it = it.encode('gbk')it = byte2str(it)print('消息:     ', it)print('散列值:   ', mySHA256(it))print('库函数结果:',hashlib.sha256(it.encode('utf-8')).hexdigest(),'\n')

对比结果

结果一致

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

财报上的云计算战场: 巨头们垄断加剧

来源&#xff1a; 第一财经一周之内&#xff0c;四大云业务巨头公司前后脚发布财报。亚马逊的云业务&#xff08;AWS&#xff09;依然跑在了最前面&#xff0c;以174亿美元排在首位。微软、谷歌、阿里巴巴也没有放慢步伐。阿里云去年累计的营收超过了百亿&#xff1b;微软的Azu…

Preserve Whole Object(保持对象完整)

从某个对象中取出若干值&#xff0c;将它们作为某一次函数调用的参数 int low daysTempRange().getLow(); int height daysTempRange().getHigh(); withinPlan plan.withinRange(low, high); 重构&#xff1a;改为传递整个对象 withinPlan plan.withinRange(daysTempRan…

简明Python教程学习笔记_5_解决问题

问题 我提出的问题是&#xff1a; 我想要一个可以为我的所有重要文件创建备份的程序。 尽管这是一个简单的问题&#xff0c;但是问题本身并没有给我们足够的信息来解决它。进一步的分析是必需的。例如&#xff0c;我们如何确定该备份哪些文件&#xff1f;备份保存在哪里&#…

【开始研究Community Server,转贴一点东西】Community Server资料收集

Community Server学习资料 uGoer 系列文章 Community Server专题一&#xff1a;概述Community ServerCommunity Server专题二&#xff1a;体系结构Community Server专题&#xff1a;附件(DOC&PPT)--2005年10月10日更新Community Server专题三&#xff1a;HttpModuleCommuni…

python实现RSA算法,对数据进行加密认证

RSA算法RSA一、数学原理二、实现代码1 生成素数2 生成秘钥3 对数据进行加密、解密总结RSA RSA是一种非对称加密体制&#xff0c;由公钥和私钥组成&#xff0c;数学原理是实数域的模余法。在使用私钥对数据进行加密后&#xff0c;可用公钥对数据进行解密。 在RSA算法中&#xf…

C++学习之路 | PTA乙级—— 1008 数组元素循环右移问题 (20分)(精简)

1008 数组元素循环右移问题 (20分) 一个数组A中存有N&#xff08;>0&#xff09;个整数&#xff0c;在不允许使用另外数组的前提下&#xff0c;将每个整数循环向右移M&#xff08;≥0&#xff09;个位置&#xff0c;即将A中的数据由&#xff08;A ​0 ​​ A ​1 ​​ ⋯A …

他研究了5000家AI公司,说人工智能应用该这么做!

来源&#xff1a;公众号InfoQ编辑&#xff1a;陈思 Eva&#xff1b;视频剪辑&#xff1a;汪春良 概要&#xff1a;本文作者 Henry Shi是美国人工智能的博士&#xff0c;连续创业者&#xff0c;专注于 AI 领域的早期投资&#xff08;AI List Capital管理合伙人&#xff09;。无…

Replace Parameter with Methods(以函数取代参数)

对象调用某个函数&#xff0c;并将其结果传递给另一个函数 int basePrice quantity * itemPrice; double discountLevel getDiscountLevel(); double finalPrice discountPrice(basePrice, discountLevel); 重构&#xff1a;让参数接受者移除该项参数&#xff0c;并直接调…

简明Python教程学习笔记_6_面向对象编程

面向对象编程&#xff1a;https://www.liaoxuefeng.com/wiki/897692888725344/923030496738368面向对象高级编程&#xff1a;https://www.liaoxuefeng.com/wiki/897692888725344/9230305380126401、类、对象 类 和 对象 是面向对象编程的两个主要方面。 类 是创建一个 新类型&a…

C++学习之路 | PTA乙级—— 1009 说反话 (20分)(精简)

1009 说反话 (20分) 给定一句英语&#xff0c;要求你编写程序&#xff0c;将句中所有单词的顺序颠倒输出。 输入格式&#xff1a; 测试输入包含一个测试用例&#xff0c;在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成&#xff0c;其中单词是由英文字…

哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗

前文 使用socket实现局域网不同主机通信 SHA256算法的实现和消息的哈希散列值计算 python实现RSA算法&#xff0c;对数据进行加密认证 文章目录数字签名与认证攻击类型算法选择实现流程总结数字签名与认证 什么是数字签名&#xff1f; 签名我们大家都知道&#xff0c;A在纸上签…

2017 年脑机接口研发热点回眸

来源&#xff1a;科技导报概要&#xff1a;脑机接口&#xff08;brain-computer interface&#xff0c;BCI&#xff09;通过解码人类思维活动过程中的脑神经活动信息&#xff0c;构建大脑与外部世界的直接信息传输通路&#xff0c;在神经假体、神经反馈训练、脑状态监测等领域有…

Visual Studio“Orcas”October 2006 CTP版下载

Visual Studio “Orcas” October 2006 CT版可以下载了&#xff0c;但这次Release的是一个虚拟机的镜像&#xff0c;所以需要在虚拟PC上运行&#xff0c;文件的大小是4150.5 MB&#xff0c;有点太大了。下载地址&#xff1a;http://www.microsoft.com/downloads/details.aspx?…

C++学习之路 | PTA乙级—— 1010 一元多项式求导 (25分)(精简)

1010 一元多项式求导 (25分) 设计函数求一元多项式的导数。&#xff08;注&#xff1a;x ​n ​​ &#xff08;n为整数&#xff09;的一阶导数为nx ​n−1 ​​ 。&#xff09; 输入格式: 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过 1000 的整数…

简明 Python 教程学习笔记_7_文件操作(os、shutil、pathlib )

参考 &#xff1a;http://www.cnblogs.com/nulige/archive/2016/12/06/6037752.html 在很多时候&#xff0c;你会想要让你的程序与用户&#xff08;可能是你自己&#xff09;交互。你会从用户那里得到输入&#xff0c;然后打印一些结果。我们可以分别使用 raw_input 和 print 语…

地牢房间迷宫走廊生成(二),Python实现洪水法、完美迷宫

文章目录前言1 随机房间和房门2 生成走廊2.1生成迷宫2.4 使用循环改进2.3 走廊缩减2.3 走廊再简化总结前言 前面通过随机房间、房门&#xff0c;对房门寻路生成走廊。由于使用A星算法&#xff0c;寻到的是最短路径&#xff0c;这样生成的走廊过直和简单。如果需要生成弯曲的走廊…

Introduce Parameter Object(引入参数对象)

某些参数总是很自然地同时出现 重构&#xff1a;以一个对象取代这些参数

深度解析,马斯克最新发射的先进火箭

来源&#xff1a;环球时报概要&#xff1a;就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。就在几个小时前&#xff0c;美国人成功发射了目前全世界运载能力最强的超级火箭——“猎鹰重型”。虽然中芯级火箭在回收过程中坠毁&a…

发现还是 True Image Server v8.1.941 比较好用

今天下了 True Image Server 9.1 并安装使用&#xff0c;发现9.1版本的用起来似乎更麻烦了&#xff0c;还是喜欢 8.1 的&#xff0e;于是卸载了 9.1 版本重新安装 8.1 版的 但是我发现 8.1 版本的安装使用时总是提示已经过期了&#xff0c;失效了&#xff0e;搞了半天&#xff…

C++学习之路 | PTA乙级—— 1011 A+B 和 C (15分)(精简)

1011 AB 和 C (15分) 给定区间 [−2 ​31 ​​ ,2 ​31 ​​ ] 内的 3 个整数 A、B 和 C&#xff0c;请判断 AB 是否大于 C。 输入格式&#xff1a; 输入第 1 行给出正整数 T (≤10)&#xff0c;是测试用例的个数。随后给出 T 组测试用例&#xff0c;每组占一行&#xff0c;顺…