Cryptanalysis
這種恆定時間比較安全嗎?
我正在考慮恆定時間比較以及它與“==”的不同之處,當時我想到了一種可能是恆定時間的簡單方法。作為密碼學的初學者,我想知道我的方法是否安全。這種方法可能不安全,但我想知道它的弱點。這真的很簡單。
- 取兩個字元串進行比較,將它們分別轉換為數字列表(0-255)
- 放
totalDifference = 0
- 從第一個列表中取出第一個數字,然後從第二個列表中的第一個數字中減去它。將此差異添加到
totalDifference
.- 對兩個列表中的每個字元/數字執行 4.
- 如果
totalDifference
遍歷每個數字後為 0,則兩個字元串相等。例子:
[1,3,5,9,7,8] -[1,3,5,5,7,8] -------------- 0,0,0,4,0,0 0+0+0+4+0+0!=0, so strings not equal
這種恆定時間比較方案有什麼問題嗎?
這種恆定時間比較方案有什麼問題嗎?
一個明顯的問題是它會聲稱字元串“AB”和“BA”是相同的。在第一個字元中,它會看到’A’-‘B’ = -1,對於第二個字元,它會看到’B’-‘A’ = 1;這兩個總和為0。
另一方面,這實際上非常接近於對相等字元串進行恆定時間比較的標準方法,但我們不是對差異求和,而是按位或它們,如下所示:
total_difference = 0; for (i=0; i<len_strings; i++) { int this_difference = a[i] - b[i]; total_difference = total_difference | this_difference; /* | is the bit-wise or operator */ } if (total_difference == 0) { /* The strings are the same */ }
這裡的想法是“或”操作可以設置 total_difference 中的位,但從不清除它們。因此,total_difference 最後為 0 的唯一方法是,如果在每次迭代中,this_difference 始終為 0,如果字元串 a 的每個字元與字元串 b 中的字元相同,就會發生這種情況。
通常,您會看到 this_difference 是通過按位異或而不是減法計算的;無論哪種方式,算法的工作原理都是一樣的。