3

对于我想尝试的加密,我有一个奇怪的想法,它可能很糟糕,而且它可能以前做过,但我只是为了好玩。问题的简短版本是:是否有可能从一个小种子生成一个长的、确定的和非均匀分布的数字字符串/序列?

长(er)版本:我正在考虑通过更改编码来加密文本。新的编码将通过 Huffman 算法生成。为了运行良好,霍夫曼算法需要相当长且分布不均匀的文本。然后字符可以具有不同的位长,这将是这种加密的主要强度。问题在于,每次要解密文本时输入/记住长文本是不切实际的。所以我想知道是否可以从密码种子生成文本?

文本是什么并不重要,只要它的字符分布不均匀,并且每次给它相同的种子时都可以重新创建完全相同的序列。最好,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”。显然,不可能对此进行任何类型的频率分析或类似的事情。

4

2 回答 2

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))
于 2013-10-23T09:33:50.080 回答
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(…))which 基本上更喜欢较低的数字作为输出来实现的。

在第一次尝试中,我得到了这个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)

因此,结果非常符合预期。

于 2013-10-23T09:54:14.420 回答