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)# 填充到模512为448# 至少进行一次填充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
型数据,编写bytes
和str
互转的函数
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')
结果一致
python: SHA256算法的实现和消息的哈希散列值计算相关推荐
- 讨论帖:比特币中的SHA256算法的实现与标准的SHA256算法实现是否相同?
近日阅读了比特币源码中与哈希相关的部分,对于其中一些细节还是有不清晰的地方. 于是我写了一个小的测试demo:sha256_test,代码下载 分别测试了三个版本对于SHA-256算法的实现: Bit ...
- python SHA1算法的实现
关于SHA1的知识点,好多文章介绍的很详细,我在这里分享一下直接用python实现的SHA1算法,和大家一起交流学习 首先和大家介绍一下sha1: SHA-1(英语:Secure Hash Algor ...
- 消息认证之SHA散列算法族
消息认证--安全散列算法SHA(Secure Hash Algorithm) 一. 消息认证 对要传递的消息进行加密有两个目的,其一是防止消息被消息发送者和消息接收者之外的第三者窃听(被动攻击),在之 ...
- 摘要/哈希/散列算法MD5 SHA1 SHA256 SHA512的区别和MAC算法
目录 一.摘要算法大致都要经过以下步骤 1. 明文数据预处理 1.1 填充比特 1.2 附加消息长度 2. 摘要计算 2.1 常量初始化 2.2 分组及分组拓展和分组分段 2.3 轮函数(每段一轮,此 ...
- python中delta是什么意思_python – 根据dataframe中的值计算delta
我有这个DataFrame(这只是一个例子,而不是真实的数据): In [1]: import pandas as pd my_data = [{'client_id' : '001', 'items ...
- RSA算法和RSA数字签名算法的实现
RSA算法和RSA数字签名算法的实现 http://blog.chinaunix.net/uid-21880738-id-1813146.html 顾婷婷 李涛 (四川大学计算机系(西区) 成都 61 ...
- 关于SimHash算法的实现及测试V2.0
@祁俊辉,2017年6月4日测试. 1 说明 本文章衔接关于SimHash算法的实现及测试V1.0: 将Hash函数更新为MD5_Hash函数(二进制为128位): 个人感觉用海明距离并不能只管说明 ...
- matlab求心率变异性的程序,心率变异性及其相关算法的实现
<心率变异性及其相关算法的实现>由会员分享,可在线阅读,更多相关<心率变异性及其相关算法的实现(34页珍藏版)>请在人人文库网上搜索. 1.结题报告,心率变异性及其相关算法的实 ...
- 心率变异性 matlab,心率变异性及其相关算法的实现.ppt
心率变异性及其相关算法的实现 附加功能参考文献 附加功能 该算法除了可以计算心率变异性之外,还有以下2种附加功能: 对心率的正常与否进行判断,输出有心率正常.心动过速.心动过缓3种情况: 对心脏的早搏 ...
- Java版cityHash64 与cityHash128算法的实现
简介 cityhash系列字符串散列算法是由著名的搜索引擎公司Google 发布的 (http://www.cityhash.org.uk/).Google发布的有两种算法:cityhash64 与 ...
最新文章
- 使用Python批量修改数据库执行Sql文件
- Android通过cat /sys/kernel/debug/usb/devices获取USB信息
- Ext.form.field.CheckBox复选框和Ext.form.field.Radio单选框
- 嵌入式、快速人脸算法库Vision.Face SDK开放下载!已经商用检验
- android elf 加固_APK一键自动化加固脚本
- Requests方法 -- 参数关联
- C++ static、const和static const 以及它们的初始化
- 零知识证明在匿名投票中的应用
- Git hub加载慢?下载慢?浏览慢?几个小技巧让你一键起飞!
- Gambit中,interface和interior的区别
- csma研究背景_前言 自制8位计算机 项目背景介绍
- 电子商务网络购物平台实例运营分析+电子商务概述及阿里巴巴集团模式五大核心内容[连载之电子商务网络营销]...
- 快来看,数据分析BI软件居然也能完成基金变迁大数据分析?
- 基于QT的英文文献的编辑与检索系统的实现
- 使用uigi将英雄小头像显示在详细资料中(图片切换)
- java inflate deflate_Java中的可迭代gzip deflate / inflate
- C语言例题5: 三角形周长面积
- java获取虎牙直播弹幕消息_虎牙直播弹幕转换字幕格式 基于Node.js 的 huya-danmu
- 初探MUI制作微信APP页面(二)
- 腾讯浏览服务X5内核集成