Implementation

什麼是在二維網格中打亂數據的好算法

  • December 12, 2015

我想知道是否存在我可以使用的算法,其中輸入是一串數據,輸出是相同的加擾版本,但在二維數組中,

即給出如下內容:


|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 的整數。

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