2014-06-11 57 views
2

我正在通過維基百科上的SHA256實現工作,但都陷入了僵局。我剛剛試圖編寫消息預處理代碼,最終消息的長度是504位,而不是512位。預處理SHA256 Python實現

百科:SHA256

預處理:

追加比特 '1' 到消息

追加k比特 '0',其中k是最小數目> = 0使得得到的消息長度(以512爲單位的比特)爲448.

將消息的附加長度(不包括'1'位或填充符)作爲64位big-endian int埃格爾 (這將使整個後處理的長度爲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

有兩個問題:

1)488幻數在你的代碼應該448

2)你只是在append_length_of_message使用16 「位」(字符)(是)。

HIH!

+0

感謝您的回答。 :)我將488更改爲448,並將'length = 16-len(hex)'更改爲'length = 64-len(hex)'。輸出現在是正確的(512的倍數)如果我使用64位,我應該保持在十六進制的長度或更改爲二進制? – Joseph

+1

您應該將其轉換爲big-endian二進制。 –