种子的确定性和非均匀长串生成

时间:2013-10-23 09:17:10

标签: python encryption huffman-code random-seed

我有一个奇怪的想法,我想尝试加密,它可能是坏的,它可能已经做过,但我只是为了好玩。该问题的简短版本是:是否有可能从一个小种子生成一个长的,确定的和非均匀分布的数字/数字序列?

Long(呃)版本:我想通过改变编码来加密文本。新编码将通过霍夫曼算法生成。为了更好地工作,霍夫曼算法需要相当长的文本和非均匀分布。然后字符可以具有不同的比特长度,这将是该加密的主要优势。问题是每次要解密文本时输入/记住长文本是不切实际的。所以我想知道是否可以从密码种子生成文本?

文本是什么并不重要,只要它具有非均匀的字符分布,并且每次给它相同的种子时都可以重新创建完全相同的序列。优选地,Python中是否有任何可以执行此操作的函数/扩展?

编辑: 扩展不同位长的“强度”: 如果我有一个字符串“test”,ASCII值116,101,115,116,它给出的值为 1110100 1100101 1110011 1110100

然后,说我的霍夫曼算法产生类似的编码     t = 101     e = 1100111     s = 10001

最后的字符串是 101 1100111 10001 101,如果我们将其编码回ASCII,我们得到1011100 1111000 1101000,这是3个完全不同的字符,它的“\ xh”。显然,不可能对此进行任何类型的频率分析。

2 个答案:

答案 0 :(得分:3)

这是一个基于random模块的解决方案,如果给出相同的种子,它将生成相同的序列。

import random
from string import ascii_lowercase
from collections import Counter

seed_value = 3334
string_length = 50
random.seed(seed_value)
seq = [(x,random.randint(1,10)) for x in ascii_lowercase]
weighted_choice = lambda s : random.choice(sum(([v]*wt for v,wt in s),[]))
random_list = [weighted_choice(seq) for x in range(string_length)]
print("".join(random_list))
print("Test non uniform distribution...")
print(Counter(random_list))

答案 1 :(得分:2)

基于DhruvPathak直接回答创建一个简单的随机字符串,我有两个补充:①非均匀分布和②随机翻译以防止预测字母的频率:

translation = range(26)
random.shuffle(translation)  # ②
random_string = ''.join(chr(
  translation[random.randint(0, random.randint(1, 25))] + ord('a'))  # ①
  for _dummy in range(1000))

使用randint(randint(…))来实现非均匀分布,translation基本上更喜欢较低的数字作为输出。

第一次尝试时,我得到了这个[5, 18, 22, 16, 3, 20, 2, 4, 19, 24, 9, 21, 12, 15, 7, 0, 25, 11, 14, 17, 10, 8, 13, 6, 1, 23] 列表:

random_string

结果f = [ 0 ] * 25(由for c in random_string: f[ord(c) - ord('a')] += 1zip(*reversed(sorted(zip(f, range(26)))))[1](18, 5, 22, 16, 3, 20, 2, 4, 19, 24, 12, 21, 15, 9, 0, 7, 25, 14, 17, 10, 11, 13, 8, 1, 23, 6) 完成)中的字符数量给出了此列表:

{{1}}

所以,结果很好地符合预期。