Algorithm-Design

是否有一種方法可以加密循環值集的值之間的關係並使用偽 RNG 從該集合中生成值?(全部在使用者 PC 上)

  • January 14, 2020

有沒有偽RNG和函式 $ f $

1.) RNG 產生一個值 $ v_0 $ 在……之外 $ N $ 不同的值(設置 $ S $ )。

2.) 獨立於RNG的功能 $ f $ 生成 $ v_{i+1}=f(v_i) $

要求:

$ \bullet $ $ v_{i+N} = v_i $

$ \bullet $ $ \forall i $ : $ {v_{i+k}, 1\le k \le N} = S $

$ \bullet $ $ v_{i+j} = f^j(v_i) $ 所以它需要 $ O(N) $ 計算(難以計算)

所有這些都是在使用者 PC 上計算的。他可以訪問所有變數。給定由 RNG 生成的兩個隨機值,使用者不應該知道如何計算第一個中的第二個(= 多久 $ f $ 需要申請)。

**問題:**是否有任何密碼方法具有這種條件?


進一步說明

(*..) …在進一步的文本中表示可選的簡化

$ \bullet $ 每個 $ v_0 $ 是同一周期的一部分(*或最多 10 個相同大小的周期中的一個 (+/-5%))

$ \bullet $ 應該沒有更快的計算方法 $ v_{i+j} $ 在……之外 $ v_{i} $ 除了在 $ j $ $ (\mod n) $ 步驟(或 $ N-j $ 步驟)(*線性加速小於 5 倍是可以的)

$ \bullet $ (*函式的結果集 $ f $ 可以大於那些 $ N $ 值(最多約 1000 次)(以及循環大小),但需要存在一個有效的函式來證明它是否是其中之一 $ N $ 值。)

$ \bullet $ 需要一種有效的方法來(偽)隨機生成值 $ v_0 $ (*並非所有值 $ S $ 需要由RNG生成,但至少 $ N^{2/3} $ )

$ \bullet $ (*RNG不需要在這些人之間均勻分佈 $ N $ 值(但它可以)。如果沒有一個值的機率遠高於包含所有值的 80% 的任何子集的 1000 倍,那很好。)


例子

$ \bullet $ 使用未知方法:

具有函式的隨機循環置換(循環大小為 N) $ f $ 它會在該循環中生成下一個值,並且 RNG 可以是 1 到 1 之間的隨機數 $ N $ .

$ \bullet $ 太容易計算:

離散對數 $ \mathbb{Z}/N\mathbb{Z} $ 帶素數 $ N $ 和一個原始根 $ g $ 作為發電機 $ f(v)=v⋅g $ . RNG 只會給出一個隨機值 $ 1 $ 和 $ N−1 $ . 如果現在使用者得到兩個這樣的隨機值,他不知道如何計算其中一個(與 $ g $ ) 即使他知道所有內部變數。但是大約可以解決 $ O(\sqrt{N}) $ 腳步。對於計算速度太快的小數字。我正在尋找類似的東西,但 $ O(N) $ (或更大)。


範例案例

在此處輸入圖像描述_ 在此處輸入圖像描述

在此處輸入圖像描述_ 在此處輸入圖像描述

綠色方塊是價值 $ v_0 $ 由 RNG 生成。

AF 是集合的成員 $ S $ .

在每張圖片中,從一個值到下一個值的關係是相等的(模 9)。

例如,要從值 D 到 E,它總是向右 1 個正方形,下面是 1 個正方形。

如果現在 $ N=80 $ 和 $ f $ 提供循環排列中的下一個值(大小為 N),可以生成以下藍色方塊,如下所示

: $ v_{i+1} = f(v_i) $ 然後水平移動 $ = v_{i+1} \mod 9 $ 和垂直 $ = \operatorname{roundDown}(v_{i+1}/9) $

這可能導致同一位置有多個值,但循環中接近的值也共享幾乎相等的其他值。週期另一端的價值仍然共享一半以上的價值。不需要此屬性,始終相等的值會更好。

如果現在只給定兩個隨機值,例如 D 和 G,那麼應該盡可能難以推導出 G 從 D 開始的位置。

網格將是 3D 和大約 100k x 100k x 100k 的圖塊。需要約 $ 10^{12} $ 獨特的價值觀。只需要對標準 PC 安全(>10.000 小時計算時間,而不是超級電腦、網格、硬體)

除了“下一個”功能 $ f $ 逆也可以存在。除了單個函式之外,每個維度的函式都可以存在。如果是這種情況,則僅計算相鄰的正方形。它需要獨立於函式執行的順序,並且不應該存在(簡單的)方法將給定值減少到其維度值。否則找到兩個隨機值之間的方式太容易了。

如果評估 $ f $ 使用電腦時間 $ t $ ,蠻力攻擊平均需要時間 $ Nt/2 $ . 讓這個大於 $ T=36\cdot10^6 $ 秒,與 $ N\approx10^{12} $ , 我們需要 $ t>72\cdot10^{-6} $ ,也就是幾十萬個 CPU 指令。人為地減慢了執行的速度 $ f $ 在程序中將無濟於事。 $ f $ 必須本質上很慢,以便攻擊者很慢;並且可控地慢,以便我們可以調整使用者程序的安全性和速度之間的折衷。

範例應用程序表明 $ S $ 是一個更大集合的隨機子集 $ M\approx10^{15} $ 元素。我們將其視為 $ [0,M) $ , 和 $ M\ge2N $ .

我只針對安全要求的簡化版本:給定 RNG 生成的兩個隨機值,猜測步驟數 $ f $ 從一個到另一個,如果用少得多 $ T $ 幾秒的計算時間,準確的機率很低。為此:

  • 選擇一個整數參數 $ \alpha $ (更大的會減慢 $ f $ )。找一個素數 $ p\approx\alpha N $ 和 $ q=(p-1)/2 $ 主要 ( $ p $ 是一個安全的素數並且 $ q $ 索菲熱爾曼素數),還有 $ 2^q\bmod p=p-1 $ (也許 $ \log_2p $ 非常接近一個簡單的分數)。
  • 定義函式 $ b $ 在片場 $ [1,p) $ 作為 $ x\mapsto b(x)=2x\bmod p $ . 功能 $ b $ 是一個循環置換 $ [1,p) $ .
  • 定義函式 $ c $ 在片場 $ [N,2N) $ 迭代地應用 $ b $ (至少一次)直到結果出現 $ [N,2N) $ ,並返回此結果。功能 $ c $ 是一個循環置換 $ [N,2N) $ . 實施見註釋。
  • 建立一個排列 $ g $ 的 $ [0,M) $ 使用標準的格式保留加密技術。 $ S $ 是整數的集合 $ v $ 在 $ [0,M) $ 和 $ N\le g^{-1}(v)<2N $ .
  • 將RNG定義為繪圖 $ u $ 均勻隨機地 $ [N,2N) $ 並返回 $ g(u) $ .
  • 定義函式 $ f $ 在集合之上 $ S $ 作為 $ f(v)=g(c(g^{-1}(v))) $ . 它循環 $ N $ 要點 $ S $ 確切地說 $ N $ 腳步。

給定隨機 $ v $ , $ v’ $ 由 RNG 生成,可以估計有多少步 $ f $ 有必要從 $ v $ 至 $ v’ $ : 我們計算 $ u=g^{-1}(v) $ 和 $ u’=g^{-1}(v’) $ , 然後 $ y=u^{-1},u’\bmod p $ ,然後求解 $ x $ 離散對數問題 $ 2^x\bmod p=y $ (這仍然很容易,考慮到數量級 $ N $ 和 $ \alpha $ )。多少步的合理猜測 $ f $ 有必要從 $ v $ 至 $ v’ $ 是 $ x,N/p $ 四捨五入到最接近的整數。然而,該估計對於中度而言準確的機率很低 $ alpha $ (遠小於 $ N $ ),並且我希望顯著改進它會帶來可觀的成本。

注意:有時間/記憶體權衡可能用於評估 $ c $ 比瑣碎更快:

uint64_t c(uint64_t x) {
 do {
   x += x;
   if (x&gt;=p)
     x -= p;
 }
 while( x&gt;=2*N || x&lt;N );
return x;
}

並且程序應該使用這些,以增加 $ \alpha $ 在功能上可以容忍的情況下,最大限度地提高蠻力攻擊的成本。

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