【问题标题】:128 bit values on 64 bit architecture in CC 中 64 位架构上的 128 位值
【发布时间】:2012-01-25 16:43:56
【问题描述】:

我正在用 C 语言在 64 位 linux 架构上实现 SHA-512。SHA-512 接受 128 位作为要散列的数据长度。目前我正在使用两个 64 位长的整数来组成 128 位的值,但我有意将零放在前 64 位中,并且长度存储在剩余的低 64 位中。我为什么要这样做?

好吧,我认为在 64 位架构上,我可能永远不会得到超过 2^64 的值,或者可以吗?这是在 64 位架构上实现 SHA-512 的正确方法,还是有什么方法可以在我不知道的 64 位架构上满足 128 位值?需要注意的一点是,我正在根据 FIPS 180-3 实施 SHA-512。

任何帮助都会受到高度评价。

问候

【问题讨论】:

    标签: c 64-bit


    【解决方案1】:

    我希望您所说的“64 位长整数”实际上是指无符号长整数……说真的,在您完全了解如何使用较小的整数完成 bigint 算术之前,请不要执行您自己的 SHA-512 实现。

    如果您想实现符合标准的东西,请使用完整的 128 位。如果你使用一个函数调用来散列整个块,你几乎不需要完整的 128 位,64 就可以了。但要符合要求,您应该允许在数据包中散列一个完整的块。因此,您有 3 个这样的功能:

    Init - 为下一次散列初始化内部状态。

    添加 - 将数据块添加到当前散列,内部缓冲不完整的块和 128 位大小的内部计数。它需要一块内存,因此干净的 C 风格接口将使用 size_t 作为字节数。但是,64 位无符号整数足以满足预期目的并简化计数。

    Finish - 进行填充,完成哈希并返回最终的哈希值。

    显然,这种方法需要一个额外的外部可见结构来保存当前状态。

    【讨论】:

      【解决方案2】:

      128-bits integers in GCC

      作为扩展,整数标量类型__int128 支持具有足够宽以容纳 128 位的整数模式的目标。只需将__int128 用于有符号的 128 位整数,或将unsigned __int128 用于无符号的 128 位整数。 GCC 不支持为具有小于 128 位宽度的 long long 整数的目标表示类型为 __int128 的整数常量。

      【讨论】:

        猜你喜欢
        • 2015-01-07
        • 2019-10-22
        • 2015-07-01
        • 1970-01-01
        • 2011-06-11
        • 2011-03-16
        • 2014-01-10
        • 2015-08-27
        • 1970-01-01
        相关资源
        最近更新 更多