我正在用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。
任何帮助都将不胜感激。
2条答案
按热度按时间icnyk63a1#
我希望你所说的“64位长整型”,真的是指无符号长整型……说真的,在完全理解如何使用更小的整数完成bigint算术之前,不要自己实现SHA-512。
如果你想实现一致的东西,那么就使用完整的128位。如果你使用一个函数调用来散列整个块,你几乎不需要完整的128位,64位就可以了。但是为了符合要求,你应该允许在数据包中散列一个完整的块。因此,你有3个这样的功能:
Init -为下一次散列初始化内部状态。
添加-将数据块添加到当前散列,内部缓冲不完整的块,内部计数为128位大小。它占用一块内存,因此干净的C风格接口将使用
size_t
作为字节数。然而,64位无符号整数对于预期目的足够好,并且简化了计数。完成-填充,完成哈希并返回最终的哈希值。
显然,这种方法需要一个额外的外部可见结构来保存当前状态。
eyh26e7m2#
128-bits integers in GCC
作为扩展,整数标量类型
__int128
支持具有足够宽的整数模式以容纳128位的目标。简单地写__int128
表示一个有符号的128位整数,或者unsigned __int128
表示一个无符号的128位整数。GCC中不支持表示__int128
类型的整数常数,用于具有小于128位宽的long long整数的目标。