C语言 128-64位体系结构上的位值

v8wbuo2f  于 2023-06-21  发布在  其他
关注(0)|答案(2)|浏览(106)

我正在用C在64位Linux上实现SHA-512。SHA-512接受128位作为要散列的数据长度。目前,我采用两个64位long int来组成128位值,但我故意将前64位置零,长度存储在剩余的低64位中。我为什么要这么做
我想在64位架构上,我可能永远不会得到一个超过264的值,或者我可以吗?这是在64位体系结构上实现SHA-512的正确方法吗?或者有没有我不知道的方法可以在64位体系结构上满足128位值的需求?需要注意的是,我正在根据FIPS 180-3实现SHA-512。
任何帮助都将不胜感激。

icnyk63a

icnyk63a1#

我希望你所说的“64位长整型”,真的是指无符号长整型……说真的,在完全理解如何使用更小的整数完成bigint算术之前,不要自己实现SHA-512。
如果你想实现一致的东西,那么就使用完整的128位。如果你使用一个函数调用来散列整个块,你几乎不需要完整的128位,64位就可以了。但是为了符合要求,你应该允许在数据包中散列一个完整的块。因此,你有3个这样的功能:
Init -为下一次散列初始化内部状态。
添加-将数据块添加到当前散列,内部缓冲不完整的块,内部计数为128位大小。它占用一块内存,因此干净的C风格接口将使用size_t作为字节数。然而,64位无符号整数对于预期目的足够好,并且简化了计数。
完成-填充,完成哈希并返回最终的哈希值。
显然,这种方法需要一个额外的外部可见结构来保存当前状态。

eyh26e7m

eyh26e7m2#

128-bits integers in GCC

作为扩展,整数标量类型__int128支持具有足够宽的整数模式以容纳128位的目标。简单地写__int128表示一个有符号的128位整数,或者unsigned __int128表示一个无符号的128位整数。GCC中不支持表示__int128类型的整数常数,用于具有小于128位宽的long long整数的目标。

相关问题