GMP 为中间计算创建的对象是不是保留在内存中?

Posted

技术标签:

【中文标题】GMP 为中间计算创建的对象是不是保留在内存中?【英文标题】:Are objects created by GMP for intermediate computations persisted in memory?GMP 为中间计算创建的对象是否保留在内存中? 【发布时间】:2021-12-24 04:07:53 【问题描述】:

我正在尝试使用 GMP 6.2.1 作为后端,使用长整数进行密码学计算。最好的做法是不要留下任何敏感计算的痕迹超过需要的时间。因此,我想确保 GMP 不会在内存中留下任何内容,但在文档中找不到任何相关内容。

我是否正确假设内存中存在两种可能的不需要值的来源:

    将数字重新分配到更大的内存部分。可能由于自分配而发生,例如mpz_mul (x, x, x);。 GMP 函数内部的中间计算,它们在某种程度上与这些函数的操作数或输出相关。

虽然似乎可以通过正确设计客户端代码来避免重新分配,但中间变量困扰着我,至少是那些在堆上分配的变量。 GMP在这方面是否有明确的保证?

【问题讨论】:

您可以 1) 告诉 gcc 不要使用 alloca (--disable-alloca) 和 2) 重新定义 (mp_set_memory_functions) 分配函数以提供您自己的清除版本。 gmplib.org/manual/… @MarcGlisse 谢谢,我不知道我怎么错过了你的最后一个链接,但这似乎正是我所需要的。我们可以给出答案吗? @MarcGlisse 你知道为什么这些函数只有一个高级包装器:powm_sec 用于模幂运算吗?仅仅是因为模幂是边信道攻击的流行目标吗?我猜其他mpn_sec_ 方法可以使用powm_sec 作为模板进行类似的包装? 不知道。也许这是在意识到为此目的提供较低级别的功能更好之前的遗留物。 【参考方案1】:

GMP 提供了一些low level functions for cryptography,特别是让您可以控制分配。

对于更高级别的功能,您没有任何保证,但您仍然可以通过custom allocation 和配置temporary allocations 来改进默认值。

【讨论】:

以上是关于GMP 为中间计算创建的对象是不是保留在内存中?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 内存管理

java对象的加载过程

尝试使用 boost 库时缺少 gmp.h

Qt QSettings 是不是会在加载后将键/值保留在内存中?

用 GMP 解析十进制值?

Java - 创建类关闭时是否会破坏对象引用?