预处理SHA256 Python实现



我正在维基百科上完成SHA256的实现,但却卡住了。我刚刚试着为消息预处理编写代码,最终消息的长度是504位,而不是所需的512位。

维基百科:SHA256

预处理:

将位'1'追加到消息

附加k位'0',其中k是最小值>= 0,使得结果消息长度(以512位为模)为448。

将消息长度(不带'1'位或填充)附加为64位大端整数,以位为单位(这将使整个后处理长度为512位的倍数)

我不确定缺陷在哪里,我已经检查了代码好几次了。

def joe_sha256 ( input_string ):
    "Joe's SHA256 implementation"
    # Create a binary version of the input string
    binary_string = create_binary ( input_string )
    # Append '1' bit to the end as per the SHA256 specification
    appended_1_bit_string = append_bit_1 ( binary_string )
    # Append 'k' bits to allow for len(string) % 512 == 488
    appended_k_string = append_k_bit ( appended_1_bit_string )
    # Append length of message
    length_of_message = append_length_of_message ( binary_string )
    # Create final message
    final_message = appended_k_string + length_of_message
    print(len(final_message)) # This prints out 504, it should be 512!!!!
    return final_message # Just for testing.

def create_binary ( input_string ):
    "Takes a string and outputs its binary form"
    A = ''.join(format(ord(x), 'b').zfill(8) for x in input_string)
    return A

def append_bit_1 ( input_string ):
    "Appends the bit 1 to the binary form"
    input_string = input_string + '1'
    return input_string

def append_k_bit ( input_string ):
    "Makes sure the length of input will become X % 512 == 488"
    if len(input_string) % 512 == 488:
        return input_string
    else:
        while len(input_string) % 512 != 488:
            input_string = input_string + '0'
        return input_string

def append_length_of_message ( input_string ):
    ""
    # Get value
    hex = format(len(input_string),'x')
    # Construct the 64 bit number?
    final_num = ''
    length = 16-len(hex)
    for x in range(length):
        final_num = final_num + '0'
    final_num = final_num + hex
    return final_num

有两个问题:

1)你的代码中488的幻数应该是448。

2)你在append_length_of_message()中只使用了16个"比特"(字符)。

因HIH !公司破产引发

如果您将hex视为一个变量,则

hex = format(len(input_string),'x')

应更新为

hex = format(len(input_string),'b')

得到正确的结果。

这样做的结果将成为相对于SHA

最新更新