<固定长度>&gt; C中64

时间:2012-11-25 06:18:36

标签: c types

我目前正在用C编写一些加密代码,这些代码必须处理的数字大于uint64_t能够容纳的数字。 (它用于执行HDCP身份验证,其中一个密码值为84位)

最好的方法是什么?我需要存储的变量之一是84位长 - 我应该为低64位采用一个uint64_t,而对于高20位采用uint32_t?这似乎是对我的攻击,但我不确定是否真的有更好的解决方案,尤其是存储在结构中。

理想的替代方法是声明自定义数据类型,如uint64_t,而是84位长,其行为方式相同。这甚至可能吗?我不确定libc是否可以处理位宽不是8的倍数的变量,但88位类型可以用于此,虽然我甚至不确定声明自定义位宽数据类型的可行性。

编辑:我检查了uint128_t,但在clang的C99模式下似乎不存在。我将对此进行标准算术和位操作,这是与加密代码相关的标准shebang。

4 个答案:

答案 0 :(得分:3)

好的,我刚刚安装了一个32位的Clang 3.1,这可行:

#include <stdio.h>

int main()
{
    unsigned __int128 i;
    printf("%d\n", sizeof(i));
}

(并打印“16”。)

答案 1 :(得分:3)

7年前,我的密码学教授向我们介绍了MIRACL开源库,其中包含非常快速的加密函数实现和处理大精度数的工具。我使用它已经很长时间了,但它似乎仍处于良好状态。如果你的问题仅仅代表84位的值而不是别的,那么它可能并不理想,但它可能是一个更通用的解决方案。

答案 2 :(得分:2)

如果您需要超过64位,并且目标环境中没有超过64位的整数类型,则必须使用其他内容。您将不得不使用两个变量,一个数组,或者可能是一个具有多个成员的结构。您还必须自己创建操作,例如,如果要添加数字,请使用加号函数。

C中没有内置支持可以轻松自动地创建N位整数。

答案 3 :(得分:1)

GNU Multiple Precision (GMP)图书馆怎么样?它声称具有任意精度:

  

GMP是一个免费的库,用于任意精度算术,对有符号整数,有理数和浮点数进行操作。精度没有实际限制,除了机器GMP中可用内存所暗示的那些限制。 GMP具有丰富的功能,并且功能具有常规接口。