密码学------SHA_1加密的python实现
生活随笔
收集整理的這篇文章主要介紹了
密码学------SHA_1加密的python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.算法介紹
SHA-1(英語:Secure Hash Algorithm 1,中文名:安全散列算法1)是一種密碼散列函數,美國國家安全局設計,并由美國國家標準技術研究所(NIST)發布為聯邦數據處理標準(FIPS)。SHA-1可以生成一個被稱為消息摘要的160位(20字節)散列值,散列值通常的呈現形式為40個十六進制數
2.源碼
import math# 異或算法 def xor_func(a, b):a = bin(a)[2:]b = bin(b)[2:]while len(a) < 32:a = '0' + awhile len(b) < 32:b = '0' + bc = ''for i in range(0, 32):if a[i] == b[i]:c = c + '0'else:c = c + '1'return c# 與運算 def and_func(a, b):a = bin(a)[2:]b = bin(b)[2:]while len(a) < 32:a = '0' + awhile len(b) < 32:b = '0' + bc = ''for i in range(0, 32):if a[i] == '1' and b[i] == '1':c = c + '1'else:c = c + '0'return c# ROTL運算 def ROTL_func(a, n):a = a * 2 ** nt = int(a / 2 ** 32)a = a % (2 ** 32) + treturn a# 非門 def NOT_func(a):a = bin(a)[2:]while len(a) < 32:a = '0' + ac = ''for ch in a:if ch == '0':c = c + '1'else:c = c + '0'return c# 步函數算法編寫 def step_func(W, list):A = list[0]B = list[1]C = list[2]D = list[3]E = list[4]t = 0# t=0-19的計算while t <= 19:k = 0x5A827999 # K1if t <= 15:w = W[t]else:w = xor_func(int(W[t - 3], 16), int(W[t - 8], 16)) # t>15后進行新的賦值w = xor_func(int(w, 2), int(W[t - 14], 16))w = xor_func(int(w, 2), int(W[t - 16], 16))temp = w[0]w = w[1:] + tempw = hex(int(w, 2))W.append(w)t += 1x = and_func(int(B), int(C)) #y = NOT_func(B) #z = and_func(int(y, 2), int(D)) #a = int(xor_func(int(x, 2), int(z, 2)), 2) # Ch(x,y,z)e = EE = DD = CC = ROTL_func(int(B), 30) % (2 ** 32)B = AA = int(ROTL_func(int(A), 5) + a + int(e) + int(w, 16) + int(k)) % (2 ** 32)# t=20-39的計算while t <= 39 and t >= 20:k = 0x6ED9EBA1 # K2w = xor_func(int(W[t - 3], 16), int(W[t - 8], 16))w = xor_func(int(w, 2), int(W[t - 14], 16))w = xor_func(int(w, 2), int(W[t - 16], 16))temp = w[0]w = w[1:] + tempw = hex(int(w, 2))W.append(w)x = int(xor_func(B, C), 2) #y = int(xor_func(x, D), 2) # Parity(x,y,z)e = EE = DD = CC = ROTL_func(int(B), 30) % (2 ** 32)B = AA = int(ROTL_func(int(A), 5) + y + int(e) + int(w, 16) + int(k)) % (2 ** 32)t += 1# t=40-59的計算while t <= 59 and t >= 40:k = 0x8f1bbcdc # K3w = xor_func(int(W[t - 3], 16), int(W[t - 8], 16))w = xor_func(int(w, 2), int(W[t - 14], 16))w = xor_func(int(w, 2), int(W[t - 16], 16))temp = w[0]w = w[1:] + tempw = hex(int(w, 2))W.append(w)x = int(and_func(B, C), 2) #y = int(and_func(B, D), 2) #z = int(and_func(C, D), 2) #xx = int(xor_func(x, y), 2) #yy = int(xor_func(xx, z), 2) # Maj(x,y,z)e = EE = DD = CC = ROTL_func(int(B), 30) % (2 ** 32)B = AA = int(ROTL_func(int(A), 5) + yy + int(e) + int(w, 16) + int(k)) % (2 ** 32)t += 1# t=60-79的計算while t <= 79 and t >= 60:k = 0xca62c1d6 # K4w = xor_func(int(W[t - 3], 16), int(W[t - 8], 16))w = xor_func(int(w, 2), int(W[t - 14], 16))w = xor_func(int(w, 2), int(W[t - 16], 16))temp = w[0]w = w[1:] + tempw = hex(int(w, 2))W.append(w)x = int(xor_func(B, C), 2) #y = int(xor_func(x, D), 2) # Parity(x,y,z)e = EE = DD = CC = ROTL_func(int(B), 30) % (2 ** 32)B = AA = int(ROTL_func(int(A), 5) + y + int(e) + int(w, 16) + int(k)) % (2 ** 32)t += 1AA = 0x67452301BB = 0xEFCDAB89CC = 0x98BADCFEDD = 0x10325476EE = 0xC3D2E1F0A = (AA + A) % (2 ** 32)B = (BB + B) % (2 ** 32)C = (CC + C) % (2 ** 32)D = (DD + D) % (2 ** 32)E = (EE + E) % (2 ** 32)# 給列表傳值list[0] = Alist[1] = Blist[2] = Clist[3] = Dlist[4] = E# 讀取需要加密的明文 def main():A = 0x67452301B = 0xEFCDAB89C = 0x98BADCFED = 0x10325476E = 0xC3D2E1F0list = [A, B, C, D, E]# 三組測試明文# m = 'Beijing University of Posts and Telecommunications'm = 'State Key Laboratory of Networking and Switching'# m = 'iscbupt'print('明文為:', m)W = []l = len(m)x = hex(len(m) * 8)n = 0 # 字符串的讀取位置while 1:# 長度大于64,即所占字節大于512,需要分段處理if l > 64:m = m[n:]nn = 0for i in range(1, 64):if int(nn / 4) * 4 + 4 <= len(m):p = p + hex(ord(m[nn]))[2:4]if (nn + 1) % 4 == 0:W.append(p)p = ''nn = nn + 1step_func(W, list)n += 64l -= 64W = []# 長度在56與64之間,若要字節在448到512之間,若要其字節滿足與512模448同余,還需額外添加使其達到1024字節elif l >= 56 and l <= 64:mm = m[n:]nn = 0p = ''j = 0for i in range(1, 64):if int(nn / 4) * 4 + 4 <= len(mm):p = p + hex(ord(mm[nn]))[2:4]if (nn + 1) % 4 == 0:W.append(p)j += 1p = ''nn = nn + 1else:breakjudge = 0for i in range(0, 4):if nn < len(mm):p = p + hex(ord(mm[nn]))[2:4]nn = nn + 1else:if judge == 0:p = p + '80'judge = 1elif judge == 1:p = p + '00'W.append(p)j += 1if j == 15:p = '00000000'W.append(p)step_func(W, list)W = []p = '00000000'for i in range(0, 14):W.append(p)length = len(x) - 2p = ''for i in range(0, 16 - length):p = p + '0'p = p + x[2:]W.append(p[0:8])W.append(p[8:16])step_func(W, list)break# 長度小于56,字節數在0到448之間,需要補全字節使其長度為512elif l < 56:mm = m[n:]nn = 0p = ''for i in range(1, 56):if int(nn / 4) * 4 + 4 <= len(mm):p = p + hex(ord(mm[nn]))[2:4]if (nn + 1) % 4 == 0:W.append(p)p = ''nn = nn + 1else:breakjudge = 0for i in range(0, 4):if nn < len(mm):p = p + hex(ord(mm[nn]))[2:4]nn = nn + 1else:if judge == 0:p = p + '80'judge = 1elif judge == 1:p = p + '00'W.append(p)for i in range(int(len(mm) / 4) + 1, 14):p = '00000000'W.append(p)length = len(x) - 2p = ''for i in range(0, 16 - length):p = p + '0'p = p + x[2:]W.append(p[0:8])W.append(p[8:16])step_func(W, list)breakc = hex(list[0])[2:] + hex(list[1])[2:] + hex(list[2])[2:] + hex(list[3])[2:] + hex(list[4])[2:]print('密文為:', c)main()3.運行結果
明文為: State Key Laboratory of Networking and Switching 密文為: ea616117a3115a3caa792813ac5de2743f00b613總結
以上是生活随笔為你收集整理的密码学------SHA_1加密的python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【CAD异常】未处理的异常C000000
- 下一篇: 工程院院士:微软黑屏敲响我国信息安全警钟