2013-07-11 52 views

回答

6

x^yx XOR y,結果有1位x和y不同,0爲比特它們是相同的:

x   = 01010011 
y   = 00010011 
x^y  = 01000000 

^(X^y)的否定此,即你得到0爲他們是不同的位和1否則:

^(x^y)  = 10111111 => z 

然後,我們開始移動z到右邊掩蓋其自己的位。移位焊盤的數量的左側用零個比特:

z >> 4  = 00001011 

隨着z傳播任何零到結果的目標,開始與運算:

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

也摺疊的新值來移動任何零向右:

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

進一步折到最後一位:

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

在另一方面,如果你有x == y最初,它是這樣的:

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

所以它真的返回1時x == y,否則爲0。

通常,如果x和y都爲零,則比較可以比其他情況花費更少的時間。該函數試圖使所有調用都是相同的時間,而不管其輸入的值如何。這樣,攻擊者就不能使用基於時間的攻擊。

6

它確實是文檔所說的:它檢查x和y是否相等。從功能角度來說,它只是x == y,簡單而已。

在這個隱蔽位擺弄路防止定時側攻擊算法否則x == y:甲x == y可能會編譯以執行更快的代碼,如果x = y和較慢如果X = Y(或反過來)由於!在CPU中分支預測。攻擊者可以利用這一點來了解密碼例程處理的數據,從而危害安全性。