Я работаю с криптографическим кодом с открытым ключом bigint. Безопасно ли использовать побитовое маскирование, чтобы гарантировать, что время вычисления и адреса памяти доступны независимо от значений данных?Является ли маскирование эффективным для предотвращения атак бокового канала?
Является ли этот метод уязвимым для атак на стороне канала, основанных на времени синхронизации, мощности, радиоизлучении или других вещах, о которых я не знаю? (Для справки, я знаю методы, как RSA ослепления, EC Montgomery трапа, кэш гиперемии, и такой.)
Пример простого кода (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
http://codereview.stackexchange.com/ – inetknght
С первого взгляда все в порядке, вы проверили его при высоких настройках '-o'? Обратите внимание, что doBar, конечно, не имеет побочных эффектов, потому что теперь он вызывается, если 'isFoo' возвращает true или false. –