2

[编辑] 我已经完全改写了这个问题,试图更简洁明了

我正在寻找一个 1-1 函数,encode这样

  • encode( 32_bytes_of_data ) => {w_1, w_2, ..., w_n}, 在哪里:
    • w_1 ... w_n 是真正的英文单词
    • n 应该是合理的——我不想用 256 个字来编码 256 位

理想情况下: - n 不应该对所有输入值都相同,但这不是一个非常重要的要求。

目标 - 使公钥更具可读性和可识别性。

4

3 回答 3

3

如果您不担心手动检查并且只寻求防止明显的正则表达式,那么有几种选择,增加烦恼因素:

  • 对于这种事情, ROT13已经在 usenet 上使用过无数次了。它将击败 base-64 检测

  • 使用 256 位作为整数,并在 ASCII 中使用其 base-10 表示。它看起来像这样:115792089237316195423570985008687907853269984665640564039457584007913129639936

  • 您可以将先前的数字编码成一个看说的序列并拼写它:二一、一五、一七……

  • 将 256 位编码为 base-26,并使用编码后的 26 个字母作为短语中每个单词的第一个字符。你需要大约55个字。如果您觉得有创意,您可以使用每个单词的前两个字符,然后将其减少到 27 个,但您可能不得不使用非常奇怪的单词。如果你不关心外观,只需发布​​ 55 个字符:ennjuuzflkeenzhszxamvlrnusvcpknavbgzllukzllrkvatszirbkq

  • 如果你想使用 unicode,有110,000 个不同的字符。假设其中只有一半是可打印的,那么每个字符的熵略高于 15 位,因此您需要 17 个字符来编码 256 位

  • 如果您和您的收件人可以预先共享任意数量的数据(您必须至少共享有关“隐写”方法的知识),您可以为字典中的每个单词分配一个数值。英语中大约有1,000,000 个单词,因此每个单词都有大约 20 位熵。您需要 256/20=13 个单词。生成密钥以纠正语法和语法并重写Jabberwocky的奖励积分

于 2013-01-28T14:31:38.253 回答
0

您可以将密钥编码为每个单词一位,其中单词长度的奇偶性表示该位:具有偶数个字母的单词是 0 位,具有奇数个字母的单词是 1 位。我在我的博客上讨论这个。

于 2013-01-28T14:24:51.730 回答
0

一个有 100 万字的字典可以提供输入到 19 位编码,只有 524k 字。由于您的 32 位输入/19 = 1.68,因此您至少需要两个字进行编码。这主要是因为可以保守地存储 2^19 个值,比如 524,288 个单词。

然后我注意到你说的是 32 字节,所以这是 256 / 19 或 13.47 ......称之为 14 个字来编码你的数据。也许制作确定性钱包的人使用 20 位并用他们喜欢使用的 12 个单词短语来覆盖它。

最大的好处必须是自我纠错 12 词短语种子具有:任何拼写错误实际上都是由我们正确拼写这些单词的能力所发现的。这很漂亮。

于 2018-03-21T11:59:52.743 回答