Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不是';大多数c编译器都优化了这段归零代码吗?_C_Security_Cryptography_Compiler Optimization - Fatal编程技术网

为什么不是';大多数c编译器都优化了这段归零代码吗?

为什么不是';大多数c编译器都优化了这段归零代码吗?,c,security,cryptography,compiler-optimization,C,Security,Cryptography,Compiler Optimization,许多加密库包含类似于以下代码段的代码: /*编译器永远不应该优化的实现*/ 静态无效优化\u证明\u归零(无效*v,大小\u t n) { 易失性无符号字符*p=v; 而(n-)*p++=0; } 但我的天真实现无法在优化编译器中生存: /*朴素的零化实现*/ 静态void naive_zeroize(无符号字符*c,大小\u t n) { int i; 对于(i=0;i

许多加密库包含类似于以下代码段的代码:

/*编译器永远不应该优化的实现*/
静态无效优化\u证明\u归零(无效*v,大小\u t n)
{
易失性无符号字符*p=v;
而(n-)*p++=0;
}
但我的天真实现无法在优化编译器中生存:

/*朴素的零化实现*/
静态void naive_zeroize(无符号字符*c,大小\u t n)
{
int i;
对于(i=0;i
该代码用于在释放内存之前将敏感数据归零。由于不再使用缓冲区,优化编译器假定可以安全地从已编译代码中删除zeriozation


是什么阻止了第一个实现的优化?

这里的关键字是。当一个变量被声明为volatile时,它告诉编译器该变量可以在该程序之外修改/访问(例如通过硬件),因此它强制编译器不优化该变量,并在每次引用该变量时访问内存

在加密中使用它通常是从堆栈(局部变量)中清除秘密(密钥)。由于堆栈用于局部变量,因此常规代码(如
/*Naive zeroization实现*/
)似乎不会对程序的其他变量/状态产生任何影响,因此编译器可能(也可能会)优化该代码。为了防止这种情况,使用了
volatile
限定符,使编译器离开该代码并将局部变量的内存内容归零

编辑

例如:

void decrypt(void* src, void* dest, crypto_stuff_t* params)
{
    crypto_key_t decryption_key; // will hold the decryption key
    ....
    ....
    // end of flow
    // we want to zero the content of decryption_key, otherwise its value 
    // will remain on the stack
    // this:
    // decryption_key <-- 0;
    // will be just optimized out by the compiler
    // but this won't:
    volatile uint8_t* key_ptr = (uint8_t*)&decryption_key;
    int i;
    for(i = 0; i < sizeof(crypto_key_t); i++)
        key_ptr[i] = 0;
}
void decrypt(void*src、void*dest、crypto\u stuff\u t*params)
{
加密密钥\u t解密密钥;//将保存解密密钥
....
....
//结束流动
//我们希望解密密钥的内容为零,否则为其值
//将保留在堆栈上
//这:

//解密密钥您可能想了解更多信息。我看不出任何代码段会被优化掉的原因。也许您可以在您的问题中包含一个说明,说明为什么您认为第二个代码段必须被优化掉。