2

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

最好的方法是什么?我需要存储的变量之一是 84 位长——我是否应该将 uint64_t 用于低 64 位,将 uint32_t 用于高 20 位?这对我来说似乎是一个 hack,但我不确定是否真的有更好的解决方案,特别是对于存储在结构中。

理想的替代方法是声明一个自定义数据类型,如 uint64_t,但改为 84 位长,其行为方式相同。这甚至可能吗?我不确定 libc 是否可以处理位宽不是 8 倍数的变量,但是 88 位类型可以解决这个问题,尽管我什至不确定声明自定义位宽数据类型的可行性。

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

4

4 回答 4

3

好的,我刚刚安装了一个 32 位的 Clang 3.1,它可以工作:

#include <stdio.h>

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

(并打印“16”。)

于 2012-11-25T06:46:15.327 回答
3

7 年前,我的密码学教授向我们介绍了MIRACL开源库,其中包含非常快速的密码函数实现和处理大精度数字的工具。我已经很久没有使用它了,但它似乎仍然处于良好状态。如果您的问题只是准确地表示 84 位值而不是其他任何东西,这可能并不理想,但它可能是一个更通用的解决方案。

于 2012-11-25T09:15:51.077 回答
2

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

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

于 2012-11-25T06:56:05.057 回答
1

GNU 多精度 (GMP)库怎么样?它声称任意精度:

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

于 2012-11-25T07:23:40.423 回答