簡體   English   中英

根據用戶輸入創建偽隨機表

[英]Create a pseudo random table based on user input

我需要從0-255“混洗”一個列表,但不能使用隨機函數,因為必須基於長度為10的字符串對列表進行混洗。我目前正在嘗試做的如下:

key = "testtest12"
mapping = range(256)

然后,我需要不使用random.shuffle(mapping)或類似的東西而重新random.shuffle(mapping) mapping列表。 我最初的想法是這樣添加鍵的所有條例值:

keytotal = 0
for i in key:
    keytotal += ord(i)

for i, item in enumerate(mapping):
    mapping[i] = (mapping[i] * keytotal) % 255

這會很好地洗排mapping列表,但是會導致重復的值,而我需要所有值在0-255之間都是唯一的,只是根據鍵混合成不同的順序。 請寫下您的想法。

謝謝

最簡單的方法似乎是仍然使用random ,這是一個隨機數生成器,並使用給定的字符串作為種子

random.shuffle(x, random.seed("testtest12"))

其中x是列表。 這將基於種子“ testtest12”對列表進行混洗,即,它將始終根據輸入生成相同的混洗列表。

所以這似乎可行:

import random
from random import shuffle
x = [[i] for i in range(0, 255)]
shuffle(x, random.seed("testtest12"))
print x

請注意,Python使用Mersenne扭曲器作為默認隨機數生成器,並且Mersenne扭曲器不是加密安全的。 如果要使用真正的加密安全的隨機數生成器,則需要使用NIST SP800-90A中定義的DRBG之一和足夠大的種子。

一種方法:遍歷列表,將當前元素與具有當前索引以及鍵中字符之一的ASCII值的元素交換。 (在必要時,從列表和字符串的末尾到末尾環繞。)

沒有理由關心或限制列表或鍵的長度。 因此以下內容可使用任意長度。

key = "testtest12"
mapping = range(256)

keylen = len(key)
maplen = len(mapping)

for i, v in enumerate(mapping):
    c = ord(key[i % keylen])
    t = (i + c) % maplen
    mapping[i] = mapping[t]
    mapping[t] = v

警告:從加密的角度來看,這可能是垃圾。

請注意,十個字符串的熵(=隨機性)不足以正確地隨機播放256個項目列表。 有256個! 列表的可能改組順序,十個字符串不能容納那么多替代方案。 在您的系統下,可能會有一些無法實現的改組。

您的有限輸入限制了系統的可能輸出。 這可能重要也可能不重要,但這是您在設計中需要考慮的事項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM