Эффективна ли маскировка для предотвращения атак по побочным каналам?
Я работаю с некоторым криптографическим кодом с открытым ключом bigint. Безопасно ли использовать побитовое маскирование, чтобы гарантировать, что время расчета и адреса памяти, к которым обращаются, не зависят от значений данных?
Является ли этот метод уязвимым для атак по побочному каналу, основанных на синхронизации команд, мощности, радиочастотном излучении или других вещах, о которых я не знаю? (Для справки мне известны такие методы, как ослепление RSA, лестница ЕС Монтгомери, очистка кэша и тому подобное.)
Пример простого кода (C / C ++):
uint a = (...), b = (...);
if (a < b)
a += b;
Теперь переведено для использования маскировки с постоянным временем:
uint a = (...), b = (...);
uint mask = -(uint)(a < b);
a = ((a + b) & mask) | (a & ~mask);
Обратите внимание, чтоa < b
0 или 1, а маска 0x00000000 или 0xFFFFFFFF.
Точно так же для операции высокого уровня (C ++):
Integer x = (...);
if (x.isFoo())
x.doBar();
Является ли следующий приемлемый безопасный перевод?
Integer x = (...);
uint mask = -(uint)x.isFoo(); // Assume this is constant-time
Integer y(x); // Copy constructor
y.doBar(); // Assume this is constant-time
x.replace(y, mask); // Assume this uses masking