我有一个奇怪的想法,我想尝试加密,它可能是坏的,它可能已经做过,但我只是为了好玩。该问题的简短版本是:是否有可能从一个小种子生成一个长的,确定的和非均匀分布的数字/数字序列?
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”。显然,不可能对此进行任何类型的频率分析。
答案 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')] += 1
,zip(*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}}
所以,结果很好地符合预期。