def grouped_pad(string): """对字符串进行填充,然后按512bit进行分组 返回分组的结果 """ string = binascii.b2a_hex(string) # 转化为16进制 bin = base.hex_bin(string) # 转化为二进制 #print bin #print len(bin) length_pad = base.dec_bin(len(bin), 64) # 最后填充的消息本身长度 #print length_pad mod = len(bin) % 512 #print mod if mod == 0: bin += '1' # 填1位'1' bin += '0' * 511 # 填511位'0' bin += length_pad #最好的bits数小于448 else: bin += '1' # 填1位'1' bin += '0' * (447-mod) # 填448 - 1 - mod位'0' bin += length_pad # 填充信息的二进制长度 grouped = [] i = 0 while i+512 <= len(bin): grouped.append(bin[i:i+512]) i += 512 return grouped
def grouped_pad(string): """对字符串进行填充,然后按512bit进行分组 返回分组的结果 """ string = binascii.b2a_hex(string) # 转化为16进制 bin = base.hex_bin(string) # 转化为二进制 #print bin #print len(bin) length_pad = base.dec_bin(len(bin), 64) # 最后填充的消息本身长度 #print length_pad mod = len(bin) % 512 #print mod if mod == 0: bin += '1' # 填1位'1' bin += '0' * 511 # 填511位'0' bin += length_pad #最好的bits数小于448 else: bin += '1' # 填1位'1' bin += '0' * (447 - mod) # 填448 - 1 - mod位'0' bin += length_pad # 填充信息的二进制长度 grouped = [] i = 0 while i + 512 <= len(bin): grouped.append(bin[i:i + 512]) i += 512 return grouped
def sha1(message): """ """ groups = grouped.grouped_pad(message) # 获得消息的二进制分组 #print groups for group in groups: H = ['67452301','efcdab89','98badcfe','10325476','c3d2e1f0'] for i in range(5): H[i] = base.hex_bin(H[i]) #print H[i] words = grouped.expand(group) # 将每组消息扩展为80个字 #print words FIVE = H (A, B, C, D, E) = (FIVE[0], FIVE[1], FIVE[2], FIVE[3], FIVE[4]) #print FIVE for step in range(80): round = step / 20 # 4轮循环 aA = base.circle_left_shift(A, 5) # 左移5位 BCD = base.round_fun(B, C, D, round) #print 'aA = %s, BCD = %s' % (aA, BCD) tmp = base.mod32add(aA, BCD, E, words[step], K[round]) aB = base.circle_left_shift(B, 30) (A, B, C, D, E) = (tmp, A, aB, C, D) FIVE = [A, B, C, D, E] #print 'FIVE:', FIVE print 'step %d :' % step, for i in range(5): haha = base.bin_hex(FIVE[i]) print haha, print for i in range(5): H[i] = base.mod32add(H[i], FIVE[i]) print 'The groups answer:', for h in H: print base.bin_hex(h), print result = [] for i in range(5): result.append(base.bin_hex(H[i])) return ''.join(result)
#!/usr/bin/env python #-*- coding:utf-8 -*- import grouped import base K = ['5a827999', '6ed9eba1', '8f1bbcdc', 'ca62c1d6'] for i in range(4): K[i] = base.hex_bin(K[i]) def sha1(message): """ """ groups = grouped.grouped_pad(message) # 获得消息的二进制分组 #print groups for group in groups: H = ['67452301','efcdab89','98badcfe','10325476','c3d2e1f0'] for i in range(5): H[i] = base.hex_bin(H[i]) #print H[i] words = grouped.expand(group) # 将每组消息扩展为80个字 #print words FIVE = H (A, B, C, D, E) = (FIVE[0], FIVE[1], FIVE[2], FIVE[3], FIVE[4]) #print FIVE for step in range(80): round = step / 20 # 4轮循环