Random-Number-Generator
這個偽隨機函式有什麼好的和/或原創的嗎?
我設計了這個接受 a
uint64
並返回 a 的偽隨機函式算法uint64
。我想知道它是否有任何好處,如果是的話,如果它是原創的?如果不是原創,誰最先提出來的?首先,您從 65 個常量 random 開始
uint64
。讓我們打電話給他們 $ P_0 $ 直通 $ P_{64} $對於輸入 uint64
X
,你可以一起 XOR $ P_0 $ 並且每個 $ P_i $ 第 i 位在哪裡X
。這個 XOR 的結果是輸出Y
。uint64_t P[65]; void init() { for (int i = 0; i < 65; i++) P[i] = /* random number */; } uint64_t generate(uint64_t X) { uint64_t Y = P[64]; for (int i = 0; i < 64; i++) if (X & (uint64_t(1) << i)) Y ^= P[i]; return Y; }
你怎麼看?
問題中的程式碼實現了任何一個 $ 2^{65\times64}\approx2^{(2^{12.02})} $ “仿射”函式來自 $ {0,1}^{64} $ 對自身,即具有屬性的函式$$ \forall u,v,w\in{0,1}^{64},\ f(u\oplus v\oplus w)=f(u)\oplus f(v)\oplus f(w) $$
該仿射屬性使函式對於生成加密質量的偽隨機性無用(至少,按原樣)。特別是,使用選定的輸入進行 65 個查詢,例如 $ 0 $ 和 $ 2^i $ 為了 $ i\in[0,64) $ ,或獲得更多隨機輸入/輸出值,足以完全重構函式。
換個角度來看,眾所周知的函式類是 $ 2^{2\times64}=2^{(2^7)} $ 函式來自 $ {0,1}^{64} $ 對自身來說,可以說是一個循環冗餘校驗。但它是 $ 2^{(2^{64}\times64)}=2^{(2^{70})} $ 函式來自 $ {0,1}^{64} $ 對自己。