我目前正在用C编写一些加密代码,这些代码必须处理的数字大于uint64_t能够容纳的数字。 (它用于执行HDCP身份验证,其中一个密码值为84位)
最好的方法是什么?我需要存储的变量之一是84位长 - 我应该为低64位采用一个uint64_t,而对于高20位采用uint32_t?这似乎是对我的攻击,但我不确定是否真的有更好的解决方案,尤其是存储在结构中。
理想的替代方法是声明自定义数据类型,如uint64_t,而是84位长,其行为方式相同。这甚至可能吗?我不确定libc是否可以处理位宽不是8的倍数的变量,但88位类型可以用于此,虽然我甚至不确定声明自定义位宽数据类型的可行性。
编辑:我检查了uint128_t,但在clang的C99模式下似乎不存在。我将对此进行标准算术和位操作,这是与加密代码相关的标准shebang。
答案 0 :(得分:3)
好的,我刚刚安装了一个32位的Clang 3.1,这可行:
#include <stdio.h>
int main()
{
unsigned __int128 i;
printf("%d\n", sizeof(i));
}
(并打印“16”。)
答案 1 :(得分:3)
答案 2 :(得分:2)
如果您需要超过64位,并且目标环境中没有超过64位的整数类型,则必须使用其他内容。您将不得不使用两个变量,一个数组,或者可能是一个具有多个成员的结构。您还必须自己创建操作,例如,如果要添加数字,请使用加号函数。
C中没有内置支持可以轻松自动地创建N位整数。
答案 3 :(得分:1)
GNU Multiple Precision (GMP)图书馆怎么样?它声称具有任意精度:
GMP是一个免费的库,用于任意精度算术,对有符号整数,有理数和浮点数进行操作。精度没有实际限制,除了机器GMP中可用内存所暗示的那些限制。 GMP具有丰富的功能,并且功能具有常规接口。