One-Time-Password

什麼是/如何計算我需要使碰撞機率非常小的位數(?)?

  • August 15, 2019

如果我想創建一個 TOTP 式算法,該算法生成一個n長字元串字元,每個字元都是一個 base64 字元,從使用者秘密rBase64 字元長,每秒生成s,對於每個u使用者數量,其中衝突的機率是非常小,我將如何計算所需字元串的長度?

如果我的措辭不好(我是新手),這裡有一個例子:假設它是從使用者的秘密每 30 秒生成一次,我有 100,000,000 個使用者,算法輸出是 8 個字元長,每個使用者的秘密是使用者註冊時隨機生成的 32 個字元的 Base64 字元串。兩個使用者在任何一個 30s* 週期內獲得相同算法輸出的機率是多少?我如何計算出我需要多少個字元才能使其成為百萬分之一的機會?

  • 與 TOTP 一樣,對於所有使用者來說,30 秒的周期是相同的,即時鐘上的 0-29 秒或 30-59 秒之間。

如果我想創建一個 TOTP 式算法,該算法生成一個n長字元串字元,每個字元都是一個 base64 字元,從使用者秘密rBase64 字元長,每秒生成s,對於每個u使用者數量,其中衝突的機率是非常小,我將如何計算所需字元串的長度?

那麼,兩個特定使用者獲得相同r秘密的機率是 $ 2^{-6r} $ ; 有 $ u(u-1)/2 $ 不同的使用者對,因此在某處存在具有相同秘密的一對的機率不超過 $ 2^{-6r} u(u-1)/2 $ - 與價值觀 $ r, u $ 你提到( $ r=32, u=100,000,000 $ ),這是很小的(大約 $ 2^{-138.8} $ ,所以我們可以放心地忽略它。

現在,在特定的s第二時間間隔內,兩個特定使用者獲得相同n字元序列的機率為 $ 2^{-6n} $ ; 再次,有 $ u(u-1)/2 $ 不同的使用者對,因此在某處存在具有相同輸出的一對的機率不超過 $ 2^{-6n} u(u-1)/2 $

現在,你建議 $ n=8 $ , 如果你把它代入上面的方程 $ u=100,000,000 $ ,你會得到一個大於 1 的值(因此它對碰撞機率沒有有意義的界限,實際上意味著可能存在多個碰撞)。

推斷什麼 $ n $ 將需要使機率有界 $ 10^{-6} $ ,我們需要解決這個問題 $ 10^{-6} \ge 2^{-6n} u(u-1)/2 $ ; 數值求解 $ u=100,000,000 $ 給 $ n \ge 12.014… $ ; 也就是說,一個 $ n $ 12 不足以給你你正在尋找的機率(但它很接近)。

現在,如果你想要那個 $ 10^{-6} $ 跨越的機率 $ k $ 間隔(也就是說,在 $ k $ $ s $ -第二個跨度,你需要解決 $ 10^{-6} \ge k \cdot 2^{-6n} u(u-1)/2 $

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