由种子产生确定的非均匀长串

2024-09-29 00:19:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个奇怪的想法,我想尝试一下,它可能是坏的,它可能以前做过,但我做它只是为了好玩。这个问题的简短版本是:有没有可能从一个小种子中生成一个长的、确定性的、非均匀分布的数字串/序列?在

Long(er)版本:我正在考虑通过更改编码来加密文本。新的编码将通过哈夫曼算法生成。哈夫曼算法需要相当长的非均匀分布文本。然后字符可以有不同的位长度,这将是这种加密的主要优势。问题是每次你想解密一个长文本时输入/记住一个长文本是不切实际的。所以我想知道是否可以从密码种子生成文本?在

文本是什么并不重要,只要它的字符分布不均匀,并且每次给它相同的种子都可以重新创建完全相同的序列。最好,Python中有没有函数/扩展可以做到这一点?在

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

然后,假设我的哈夫曼算法生成 t=101 e=1100111 s=10001

最后一个字符串是 如果我们把它编码回ASCII,我们得到101110011110001101000,这是3个完全不同的字符,它的“\xh”。显然,在这上面进行任何频率分析或类似的分析是不可能的。在


Tags: 字符串文本版本算法密码编码ascii序列
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列表:

^{pr2}$

结果random_string(由f = [ 0 ] * 25for c in random_string: f[ord(c) - ord('a')] += 1zip(*reversed(sorted(zip(f, range(26)))))[1])中的字符计数给出了这个列表:

^{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))

相关问题 更多 >