(这是Padding the message in SHA256的后续问题 . )
(我正在尝试在C中实现SHA-256哈希函数 . 我这样做纯粹是为了娱乐和学习目的 . )
我的字符串 message
长度为 message_length
. 我在字符串后面加了 1
位后跟 0
s,这样字符串的长度现在是448位mod 512位 .
我现在需要将带有 message_length
的字符串作为64位大端整数附加到字符串中,但我无法弄清楚如何在C中执行此操作 .
为了论证,让我们说 message_length
是3字节= 24位 . 十六进制24是 18
,所以我需要将 00 00 00 00 00 00 00 18
追加到字符串中 .
所以我想要的是一个将整数3转换为字符串 00 00 00 00 00 00 00 18
的函数,以便我可以追加它 .
我的问题归结为
如何在C中将64位整数转换为大端字节数组
1 回答
Edit: 我只是重读了你的问题(打算编辑它) . 我想你误解了SHA256希望你使用的格式 . 如果消息长度为24,则不需要附加字符串
00 00 00 00 00 00 00 18
(每个字节十六进制编码并用空格分隔),而是需要附加原始字节0x00,0x00,0x00,0x00,0x00,0x00,0x00和0x18 . 它们不代表任何可打印的字符 . 请参阅下面的获取这些字节的方法 . 我的示例使用一个整数,其字节表示恰好只包含可打印字符(ASCII格式) .顺便说一句,你填充到448位的原因是你在512位的整个块大小中剩下64位,所以你可以在那里放置消息长度的大端编码 .
您可以使用
num>>(8*i) & 0xff
提取num
的单个字节,其中您将获得i=0
的最低有效字节和带有i=7
的无符号长(64位)的最高有效字节 . 迭代所有位置,您可以获得每个字节:如果你需要它作为一个字符串,你可以使用字符串的迭代器构造函数转换它:
包含测试输出的完整代码: