2013-07-11 12 views

risposta

6

x^y è x XOR y, il risultato ha 1 per i bit x ed y sono diverse e 0 per i bit sono stessi:

x   = 01010011 
y   = 00010011 
x^y  = 01000000 

^(x^y) nega questo, cioè, si ottiene 0 per i bit sono diversi e 1 altrimenti:

^(x^y)  = 10111111 => z 

quindi iniziamo spostando z a destra per mascherare i bit da sola. Uno spostamento pads lato sinistro del numero con zero bit:

z >> 4  = 00001011 

Con l'obiettivo di propagare eventuali zeri z al risultato, iniziare ANDing:

z   = 10111111 
z >> 4  = 00001011 
z & (z >> 4) = 00001011 

volte anche il nuovo valore per spostare qualsiasi zero a destra:

z   = 00001011 
z >> 2  = 00000010 
z & (z >> 2) = 00000010 

ulteriormente volte all'ultimo bit:

z   = 00001010 
z >> 1  = 00000001 
z & (z >> 1) = 00000000 

D'altra parte, se avete x == y inizialmente, va in questo modo:

z   = 11111111 
z (& z >> 4) = 00001111 
z (& z >> 2) = 00000011 
z (& z >> 1) = 00000001 

Quindi è davvero restituisce 1 quando x == y, 0 altrimenti.

In genere, se xey sono zero, il confronto può richiedere meno tempo rispetto ad altri casi. Questa funzione cerca di far sì che tutte le chiamate abbiano la stessa durata indipendentemente dai valori dei suoi ingressi. In questo modo, un utente malintenzionato non può utilizzare attacchi basati sui tempi.

6

Fa esattamente ciò che dice la documentazione: Controlla se xey sono uguali. Da un punto funzionale è solo x == y, dead simple.

Fare x == y in questo criptico bit-giocherellare vie prevenire gli attacchi lato distribuzione ad algoritmi: Un x == y può ottenere compilato in codice che esegue più veloce se x = y e più lento se x = y (o viceversa) a causa! previsione delle diramazioni nelle CPU. Questo può essere usato da un utente malintenzionato per apprendere qualcosa sui dati gestiti dalle routine crittografiche e quindi compromettere la sicurezza.