SHA256的Python实现预处理

2 投票
2 回答
1090 浏览
提问于 2025-04-18 09:26

我正在研究维基百科上的SHA256实现,但遇到了一些困难。我刚尝试写消息预处理的代码,结果发现最终消息的长度是504位,而不是要求的512位。

维基百科: SHA256

预处理步骤:

在消息后面加上一个'1'位。

然后再加上k个'0'位,其中k是一个最小的非负整数,使得处理后的消息长度(以位为单位,取模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

2 个回答

0

如果你把 hex 当作一个变量来考虑,那么

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

应该更新为

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

这样才能得到正确的结果。

这样做之后,结果就会与SHA相关联。

2

这里有两个问题:

1) 你代码里的488这个数字应该改成448。

2) 在append_length_of_message()这个函数里,你只用了16个“位”(字符)。

希望这能帮到你!

撰写回答