【问题标题】:Create a pseudo random table based on user input根据用户输入创建伪随机表
【发布时间】:2015-02-01 12:01:47
【问题描述】:

我需要在 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 之间是唯一的,只是根据键混合成不同的顺序。如果你有任何想法,请写下你的想法。

谢谢

【问题讨论】:

    标签: python list encryption cryptography


    【解决方案1】:

    最简单的做法似乎是仍然使用random,它是一个-随机数生成器,并使用给定的字符串seed

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

    【讨论】:

    • 谢谢,我不确定是否可以将随机播放功能与种子一起使用,但如果可以,这看起来不错。
    • 是的,如果这是一项作业,那么您可能想查看其他答案:)
    【解决方案2】:

    一种方法:遍历列表并将当前元素与具有当前索引的元素加上键中字符之一的 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
    

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

    【讨论】:

    • 它是用于密码学的,但它确实很好地洗牌,谢谢你的回答。
    • 我认为这是对 learn 密码学的分配,因为一般来说,仅对列表进行洗牌在密码学上并不安全。
    • 主要是,我打算使用此列表来使用替换密码加密文件,然后将新加密的列表传递给排列密码以进行最终加密。我知道它不会是有史以来最安全的加密,但我希望它就足够了
    • @WillGolledge 满足什么要求?仅一个替换后跟一个排列不会产生任何接近 AES 提供的安全性的东西。
    • 在我的作业中获得一个合理的分数就足够了,我也打算做几轮,并不是说它可能会有很大的不同..
    【解决方案3】:

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

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

    【讨论】:

    • 这给了我一些很好的思考,感谢您的意见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2021-08-20
    • 2016-02-12
    • 2014-01-22
    • 2014-11-16
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多