Implementation
什麼是在二維網格中打亂數據的好算法
我想知道是否存在我可以使用的算法,其中輸入是一串數據,輸出是相同的加擾版本,但在二維數組中,
即給出如下內容:
|1 2 3 4 5 6 7 8 9|
我想要一個有點像的輸出:
|2 8 * 3 |
|7 9 4 1 |
|* 5 * 6 |
理想情況下,加擾將基於密鑰,並且可以使用相同的密鑰或其對來解擾消息。
似乎您只想置換一個字元串。例如,將字元串“123456789”+ 3 個空格轉換為字元串“28_37941_5_6”。將它放入二維數組只是格式化(例如,同意它是一個 4x3 數組,然後在每 4 個字元後添加一個換行符)。
有很多算法可以隨機排列字元串。例如,Knuth shuffle(又名 Fisher-Yates shuffle)要求您遍歷列表的每個元素,並隨機將其與自身或列表中的較早項目交換。(即對於列表中的第 i 個位置,與第 i 個位置和第 j 個位置交換,其中 j 是介於 0 和 i 之間的隨機數)。例如,這個 shuffle 在下面的 python 中實現:
import random def knuth_shuffle(to_shuffle): for i in range(1, len(to_shuffle)): j = random.randint(0, i) to_shuffle[i], to_shuffle[j] = to_shuffle[j], to_shuffle[i] return to_shuffle
我們可以稍微修改它以將隨機數作為“鍵”,它告訴我們要做什麼排列:
import random def generate_key(input_length): key = [] for i in range(1, input_length): j = random.randint(0, i) key.append(j) return key def knuth_keyed_shuffle(to_shuffle, key): shuffled = to_shuffle[:] # create a copy of input to modify for i, j in zip(range(1, len(shuffled)), key): shuffled[i], shuffled[j] = shuffled[j], shuffled[i] return shuffled def knuth_keyed_unshuffle(to_unshuffle, key): unshuffled = to_unshuffle[:] # create a copy of input to modify for i, j in reversed(zip(range(1, len(unshuffled)), key)): unshuffled[i], unshuffled[j] = unshuffled[j], unshuffled[i] return unshuffled
例如在 python 中(在定義了上面的函式之後)
In [3]: text = list("123456789***") In [4]: print text ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '*', '*'] In [5]: key = generate_key(len(text)) In [6]: print key [0, 0, 2, 2, 1, 1, 1, 6, 8, 2, 11] In [7]: shuffled_text = knuth_keyed_shuffle(text, key) In [8]: print shuffled_text ['3', '8', '*', '2', '4', '1', '9', '7', '*', '6', '5', '*'] In [9]: knuth_keyed_unshuffle(shuffled_text, key) Out[9]: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '*', '*']
一些注意事項:首先這不會特別安全。
此外,如果您不是特別喜歡使用整數列表作為鍵,您可以使用階乘數字系統 (factoriadic)將其編碼為 0 到 (n!-1) 之間的單個整數。密鑰本質上是一個以基階乘寫的數字,最低有效位在前——第一位是 0 或 1;第二個數字 0,1 或 2;第三位 0、1、2 或 3,… 第 n 位是從 0 到 n 的整數。