Nonce

OCB 隨機數使用

  • July 19, 2014

我剛剛在 Bouncy Castle 的OCB Mode實現中遇到了這段程式碼:

if (N.length > 16 || (N.length == 16 && (N[0] & 0x80) != 0))
{
           /*
            * NOTE: We don't just ignore bit 128 because it would hide from the caller the fact
            * that two nonces differing only in bit 128 are not different.
            */
           throw new IllegalArgumentException("IV must be no more than 127 bits");
}

我對這個檢查的理解是,如果nonce長於16個字節,或者nonce是16個字節並且nonce的第一個字節的第一位不為0(假設big endian),那麼就會拋出錯誤。

我理解正確嗎?如果是這樣,創建隨機數的最佳實踐是什麼(假設我想要一個完整的 127 位隨機數)。生成 16 個隨機字節並取消設置第一個字節的第一位?

此外,關於簡單地忽略第 128 位的程式碼註釋,如果使用完整的 128 位隨機數(不取消設置第一位)和經過身份驗證的模式(或 encrypt-then-mac),這樣做是否安全?確保 nonce 的完整性?

您查看了 1.49 版,其中 OCB 似乎沒有完全實現。實際上 OCB 僅使用 120 位隨機數,其他 8 位按照 RFC 中的描述進行編碼。

看看 1.50 版。如果給定的隨機數長於 15 個字節(原始碼行 #158),OCB 似乎(幾乎)完全實現並引發異常。

如果您或其他人需要使用該版本的 OCB 和/或 Bouncy Castle,我將給出另一個答案。

我對這個檢查的理解是,如果nonce長於16個字節,或者nonce是16個字節並且nonce的第一個字節的第一位不為0(假設big endian),那麼就會拋出錯誤。

我理解正確嗎?如果是這樣,創建隨機數的最佳實踐是什麼(假設我想要一個完整的 127 位隨機數)。生成 16 個隨機字節並取消設置第一個字節的第一位?

是的。但是,如果您正在進行任何隨機數比較以確保不等式,請記住將它們與未設置的高位進行比較。畢竟,這就是他們添加支票的原因。

對於合理數量的消息,隨機 127 位 nonce 不應發生衝突,但如果您想要一種無需擔心 nonce 衝突的簡單方法,計數器也可以用作 OCB nonce。

此外,關於簡單地忽略第 128 位的程式碼註釋,如果使用完整的 128 位隨機數(不取消設置第一位)和經過身份驗證的模式(或 encrypt-then-mac),這樣做是否安全?確保 nonce 的完整性?

誠信不是問題。問題是兩個 nonce 僅在高位上有所不同,這將導致 nonce 重複,可能允許攻擊者破壞共享 nonce 的(部分)消息的加密。

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