我需要洗牌'一个0-255的列表,但没有使用随机函数,因为列表必须根据长度为10的字符串进行混洗。我目前正在尝试做的事情如下:
key = "testtest12"
mapping = range(256)
然后,我需要在不使用mapping
或类似内容的情况下随机播放random.shuffle(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之间是唯一的,只是根据键混合到不同的顺序。如果您有任何想法,请写下您的想法。
由于
答案 0 :(得分:2)
最简单的做法似乎是仍然使用random
这是一个伪 - 随机数生成器,种子它与给定的字符串: / p>
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 twister作为默认随机数生成器,而Mersenne twister不具有加密安全性。如果您想拥有一个真正的加密安全随机数生成器,您需要使用NIST SP800-90A中定义的DRBG之一和足够大的种子。
答案 1 :(得分:1)
一种方法:继续执行列表并将当前元素与具有当前索引的元素以及该键中某个字符的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
警告:从加密的角度来看,这可能是垃圾。
答案 2 :(得分:1)
请注意,十个字符的字符串没有足够的熵(=随机性)来正确地混洗256个项目列表。有256个!列表可能的随机顺序,十个字符串不能容纳那么多替代品。您的系统可能永远无法实现随机播放。
您的有限输入限制了系统的可能输出。这可能重要,也可能不重要,但您需要在设计中考虑这一点。