Python 基于用户输入创建伪随机表

Python 基于用户输入创建伪随机表,python,list,encryption,cryptography,Python,List,Encryption,Cryptography,我需要将列表从0-255“洗牌”,但不使用随机函数,因为列表必须根据长度为10的字符串洗牌。我目前正在做的工作如下: key = "testtest12" mapping = range(256) 然后我需要洗牌映射列表,而不只是使用random.shuffle(映射)或类似的东西。我最初的想法是添加密钥的所有值: keytotal = 0 for i in key: keytotal += ord(i) for i, item in enumerate(mapping):

我需要将列表从0-255“洗牌”,但不使用随机函数,因为列表必须根据长度为10的字符串洗牌。我目前正在做的工作如下:

key = "testtest12"
mapping = range(256)
然后我需要洗牌
映射
列表,而不只是使用
random.shuffle(映射)
或类似的东西。我最初的想法是添加密钥的所有值:

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

for i, item in enumerate(mapping):
    mapping[i] = (mapping[i] * keytotal) % 255
这会很好地洗牌
映射
列表,但是会导致重复的值,而我需要所有值在0-255之间都是唯一的,只是根据键混合成不同的顺序。如果你有什么想法,请写下来


谢谢一种方法:继续浏览列表,将当前元素与具有当前索引的元素加上键中一个字符的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

警告:从加密的角度来看,这可能是垃圾。

一种方法:继续浏览列表,将当前元素与具有当前索引的元素以及键中一个字符的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

警告:从加密的角度来看,这可能是垃圾。

最简单的方法似乎是仍然使用
随机
,这是一个随机数生成器,并使用给定字符串对其进行种子设定:

random.shuffle(x, random.seed("testtest12"))
其中
x
是列表。这将根据种子“test12”对列表进行洗牌,也就是说,它将始终根据输入生成相同的洗牌列表

所以这似乎是可行的:

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和一个足够大的种子。

最简单的方法似乎是仍然使用
随机
,它是一个随机数生成器和种子它与给定的字符串:

random.shuffle(x, random.seed("testtest12"))
其中
x
是列表。这将根据种子“test12”对列表进行洗牌,也就是说,它将始终根据输入生成相同的洗牌列表

所以这似乎是可行的:

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和一个足够大的种子。

请注意,十个字符的字符串没有足够的熵(=随机性)来正确地洗牌256项列表。有256个!可能的列表无序排列顺序,而一个十个字符的字符串不能容纳那么多的替代项。在您的系统下,可能存在永远无法达到的洗牌


您有限的输入限制了系统可能的输出。这可能是重要的,也可能不是重要的,但这是你在设计中需要考虑的问题。

< P>请注意,十个字符串没有足够的熵(=随机性)来正确地洗牌256个项目列表。有256个!可能的列表无序排列顺序,而一个十个字符的字符串不能容纳那么多的替代项。在您的系统下,可能存在永远无法达到的洗牌


您有限的输入限制了系统可能的输出。这可能是重要的,也可能不是重要的,但这是你在设计中需要考虑的。

谢谢,我不确定是否可以用种子来使用洗牌功能,但是如果这样,看起来很好。谢谢。如果这是一个任务,那么你可能想看看其他答案:我不确定是否可以使用带种子的shuffle函数,但如果可以的话,这看起来不错,谢谢。是的,如果这是一个作业,那么你可能想看看其他答案:)它用于密码学,但是它确实可以很好地洗牌列表,谢谢你的回答。我想这是一个学习密码学的作业,因为仅仅洗牌一个列表通常在加密上是不安全的。主要是,我计划使用这个列表用替换密码加密一个文件,然后用置换密码将新加密的列表传递到一个置换密码中进行最终加密。我知道这不会是有史以来最安全的加密,但我希望它会是sufficient@WillGolledge足够做什么?仅仅是一次替换,再加上一次置换,就不会产生任何接近AES提供的安全性的东西。只需要在我的作业中打一个合理的分数,我也计划做几轮,但这可能不会有太大的区别。它用于密码学,但它可以很好地洗牌列表,谢谢你的回答。我想这是学习密码学的一项任务,因为一般来说,洗牌列表在密码学上是不安全的。主要是,我计划使用此列表使用替换密码对文件进行加密,然后使用替换密码将新加密的列表传递到置换密码中进行最终加密。我知道这不会是有史以来最安全的加密,但我希望它会是sufficient@WillGolledge足够做什么?仅仅是一次替换,再加上一次置换,就不会产生任何接近AES提供的安全性的东西。这就足以在我的作业中得到一个合理的分数,我也计划做几轮,但这可能不会有太大的区别