Cryptanalysis

這種恆定時間比較安全嗎?

  • March 4, 2021

我正在考慮恆定時間比較以及它與“==”的不同之處,當時我想到了一種可能是恆定時間的簡單方法。作為密碼學的初學者,我想知道我的方法是否安全。這種方法可能不安全,但我想知道它的弱點。這真的很簡單。

  1. 取兩個字元串進行比較,將它們分別轉換為數字列表(0-255)
  2. totalDifference = 0
  3. 從第一個列表中取出第一個數字,然後從第二個列表中的第一個數字中減去它。將此差異添加到totalDifference.
  4. 對兩個列表中的每個字元/數字執行 4.
  5. 如果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 是通過按位異或而不是減法計算的;無論哪種方式,算法的工作原理都是一樣的。

引用自:https://crypto.stackexchange.com/questions/88612