Implementation

這如何產生排列?

  • May 27, 2021

在試圖回答這個問題的過程中,我最終陷入了困境。我找到了一篇似乎解決了他們的問題的論文:它的作者定義了一個產生偽隨機排列生成器的過程 $ h $ 當應用於偽隨機函式時 $ f $ 以及由此產生的 $ g $ 自己組合兩次:

讓 $ f={f}^n $ 是一個偽隨機函式生成器,其中密鑰長度函式為 $ l(n) $ . 定義一個函式發生器 $ g={g}^n $ 按照 $ f $ 如下。讓 $ k $ 是一個長度的字元串 $ l(n) $ , 讓 $ k’ $ 是一個長度的字元串 $ l(n+1) $ , 讓 $ L $ , $ R $ , 和 $ L’ $ 是長度的字元串 $ n $ , 然後讓 $ R $ 是一個長度的字元串 $ n+1 $ . 然後$$ g_{k}^{2n}(L\bullet R)=R\bullet[L\oplus f_k^n(R)] $$ $$ g_{k’}^{2n+1}=R’\bullet[L’\oplus\text{first }n\text{ bits of }f_{k’}^{n+1}(R’)] $$

讓 $ h=g\circ g\circ g $ . … 定理 1 表明 $ h $ 如果是偽隨機的 $ f $ 是偽隨機的……

$$ however, note that $$ $ h=g\circ g $ 完全不是偽隨機的$$ . $$

Michael LubyCharles Rackoff如何從偽隨機函式構造偽隨機排列

但是,當我正在實施它時,它似乎實際上並沒有產生輸入位的重新排列。我將展示一個範例,其中我提供了一個漢明權重為 4 的輸入,但它返回了一個漢明權重為 15 的字元串——因此,顯然不是輸入的排列。

  • 參數:

    • $ f $ = SHAKE256
    • $ m = 00001000\ 00000100\ 00000010\ 00000001 $
    • $ n = 32 $
    • $ l(n) = 0 \Rightarrow k = \text{‘’} $

所以,一步一步地完成它:

  1. $ g_{k}^{n}(g_{k}^{n}(g_{k}^{n}(m))) $
  2. $ g_{k}^{n}(g_{k}^{n}(g_{k}^{n}(00001000\ 00000100\bullet 00000010\ 00000001))) $
  3. $ g_{k}^{n}(g_{k}^{n}(00000010\ 00000001\bullet[00001000\ 00000100\oplus f_k^{n/2}(00000010\ 00000001)])) $
  • Python:Crypto.Hash.SHAKE256.new(k).update(b'\x02\x01').read( (n//2) // 8 )
  1. $ g_{k}^{n}(g_{k}^{n}(00000010\ 00000001\bullet[00001000\ 00000100\oplus 10111101\ 00000101])) $
  2. $ g_{k}^{n}(g_{k}^{n}(00000010\ 00000001\bullet 10110101\ 00000001)) $
  3. $ g_{k}^{n}(10110101\ 00000001\bullet[00000010\ 00000001\oplus f_k^{n/2}(10110101\ 00000001)]) $
  • Python:Crypto.Hash.SHAKE256.new(k).update(b'\xb5\x01').read( (n//2) // 8 )
  1. $ g_{k}^{n}(10110101\ 00000001\bullet[00000010\ 00000001\oplus 10100111\ 01010000]) $
  2. $ g_{k}^{n}(10110101\ 00000001\bullet 10100101\ 01010001) $
  3. $ 10100101\ 01010001\bullet[10110101\ 00000001\oplus f_k^{n/2}(10100101\ 01010001)] $
  • Python:Crypto.Hash.SHAKE256.new(k).update(b'\xa5\x51').read( (n//2) // 8 )
  1. $ 10100101\ 01010001\bullet [10110101\ 00000001\oplus 10000010\ 01010011] $
  2. $ 10100101\ 01010001\ 00110111\ 01010010 $

因為這並沒有產生一個排列 $ m $ ,作者實際上打算如何完成這個組合?我誤解了嗎 $ \bullet $ ? 我搞砸了構圖嗎?我應該分開嗎 $ m $ 不同?沒看到有什麼特殊要求 $ f $ 除了能夠輸出 $ n $ 位(甚至看起來不嚴格,當需要奇數位時可以裁剪),那麼我在這裡缺少什麼?

它不是置換給定輸入的位位置的意義上的排列,而是指從一組(位串)到同一組的一一對應關係,如該論文中所定義:

2. 術語……

讓 $ F^n $ 成為所有的集合 $ {2^n}^{2^n} $ 功能映射 $ {0,1}^n $ 進入 $ {0,1}^n $ … 讓 $ P^n\subset F^n $ 是這樣的排列函式的集合,即它們是 1-1 到函式上的。

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