日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

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

發布時間:2023/12/10 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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型數據,編寫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算法的实现和消息的哈希散列值计算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。