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