Example #1
0
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
Example #2
0
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
Example #3
0
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)
Example #4
0
#!/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轮循环