Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预处理SHA256 Python实现_Python_Python 3.x_Sha256 - Fatal编程技术网

预处理SHA256 Python实现

预处理SHA256 Python实现,python,python-3.x,sha256,Python,Python 3.x,Sha256,我正在维基百科上努力实现SHA256,但遇到了问题。我刚刚尝试编写消息预处理的代码,最终消息的长度是504位,而不是所需的512位 维基百科: 预处理: 将位“1”附加到消息 追加k位“0”,其中k是最小数>=0,因此生成的消息 长度(以位为单位的模512)为448 附加消息长度(不带“1”位或填充),以位为单位,作为64位大端整数 (这将使整个后处理长度为512位的倍数) 我不确定缺陷在哪里,我已经检查过代码好几次了 def joe_sha256 ( input_string ): "

我正在维基百科上努力实现SHA256,但遇到了问题。我刚刚尝试编写消息预处理的代码,最终消息的长度是504位,而不是所需的512位

维基百科:

预处理:

将位“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\u length\u中只使用了16个“位”(字符)


如果将
hex
视为变量,则

hex = format(len(input_string),'x')
应更新至

hex = format(len(input_string),'b')
以获得正确的结果


通过这样做,结果将成为与SHA相关的结果。

谢谢您的回答。:)我将488改为448,并将
length=16 len(hex)
改为
length=64 len(hex)
。现在输出是正确的(512的倍数),如果我使用64位,我应该保持十六进制长度还是将其更改为二进制?您应该将其转换为big-endian二进制。