Sto lavorando con un codice di crittografia a chiave pubblica bigint. È sicuro utilizzare il mascheramento bit per bit per garantire che i tempi di calcolo e gli indirizzi di memoria accessibili siano indipendenti dai valori dei dati?Il mascheramento è efficace per contrastare gli attacchi ai canali laterali?
Questa tecnica è vulnerabile agli attacchi dei canali laterali in base a tempi di istruzione, potenza, emissioni RF o altre cose di cui non sono a conoscenza? (Per avere un riferimento, io sono a conoscenza di tecniche come RSA accecante, scala CE Montgomery, cache di vampate di calore, e così via.)
Esempio di codice semplice (C/C++):
uint a = (...), b = (...);
if (a < b)
a += b;
Ora tradotto da usare tempo costante mascheratura:
uint a = (...), b = (...);
uint mask = -(uint)(a < b);
a = ((a + b) & mask) | (a & ~mask);
noti che a < b
è 0 o 1, e la maschera è 0x00000000 o 0xFFFFFFFF.
Analogamente, per un'operazione di alto livello (C++):
Integer x = (...);
if (x.isFoo())
x.doBar();
è la seguente traduzione sicuro accettabile?
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
sembra ok a prima vista, hanno l'avete provato ad alte impostazioni del '-o'? Nota che doBar non dovrebbe ovviamente avere effetti collaterali, perché ora viene chiamato se 'isFoo' restituisce true o false. –