很难准确回答的问题。我将在这里专门参考Theodore T'so的pwgen (v2.07) 实现 ( pwgen -A0
)
这些可发音的密码使用“音素”作为“符号”,而不是单个字符,在(英语偏向)pwgen
中,音素可以是 1 或 2 个字符。定义了 40 个(in pw_phonemes.c
),25 个是单个字符(az ,除了“q”),15 个是对(双元音),每个音素的平均字符是 1.375(由于辅音/元音交替,使用中接近 1.425)。
音素不是随机组合的,这当然是诀窍,有一些规则可以使最终结果发音,因为pwgen
我们(大致)有:
- 某些音素不能以单词开头(不包括 2 个音素)
- 一些音素不能跟在元音后面(对于 13 个元音音素,不包括 8 个音素)
- 选了一个辅音之后再选一个元音
- 选择了一个元音:在前一个元音之后,或在双元音上,或随机(60%)选择下一个辅音
- 否则允许下一个元音
- 不能选择双元音(2 个字符)作为最后一个字符(最明显的副作用是密码永远不会以“q”结尾,因为 q 仅显示为双元音“qu”。)
(如果您可以基于此制定确切的排列数,那就太好了!)
[az] 密码的“符号”是单个字符,对于可发音的密码,它是 1 或 2 个字符的音素。
对于长度为 N 的 [az] 密码,每个符号有 4.7 位 ( lg2(26)
),它的估计熵是26^N
或2^(4.7*N)
每个符号(每个字符 4.7 位)。
对于音素,每个符号有 5.3 位 ( lg2(40)
),长度为n 个符号的密码的估计熵是40^n
或2^(5.3*n)
(每个字符 3.9 位)。m个符号的音素密码(忽略上述规则引起的任何偏差)平均为 1.375m 个字符。
估计两种密码的最大熵(平均长度相同 n=1.375m)可以近似为26^(1.375m)
和40^m
,前者增长得更快 *,并证明了你的断言(长度为 n 的可发音单词的计数显然更少比 26^n )
至少,以这种方式创建的可发音密码应比直接 [az] 随机密码长约 20%,以便具有可比较的熵。假定的优势是发音可能意味着更容易记住,因此对于人类来说,更长的密码实际上可能更容易记住。
由于发音能力的限制进一步限制了这一点。
估计数值差异比较棘手......希望这是一个“数量级”的近似值。pwgen
的 40 个音素分解为:
20 CONSONANT
5 CONSONANT DIPTHONG
2 CONSONANT DIPTHONG NOT_FIRST
5 VOWEL
8 VOWEL DIPTHONG
(无论如何,双元音在来源中拼写错误。)
根据上述规则(并有一些经验证据),我将(大量)近似计算 3-4 个音素(约 5 个字符)的密码。约 80% 的密码是辅音/元音交替的形式,即or ,其余约 20% 有元音对,例如(辅音音素对是被禁止的;它们可能出现在输出字符中,特别是由于到音素“ng”)。(这里的一个问题是,从音素中计算出字符的长度会使问题变得棘手。这不仅仅是一个排列问题,你必须计算出我怀疑的排列的排列以获得准确的答案)。C V C [V ...]
V C V [C ...]
C V V C
通过计算最频繁的安排来获得合理的估计:
c v c v = 25*13*27*13 = 114075
v c v = 13*27*13 = 4563
c v c = 25*13*27 = 8775
v c v c = 13*27*13*27 = 123201
c v v c = 25*13*5*27 = 43875
v c v v = 13*27*13*5 = 22815
v v c v = 13*5*27*13 = 22815
-------
340119
这里的神奇数字是:25 个没有 NOT_FIRST 的辅音(包括双元音),27 个辅音(包括双元音),13 个元音(包括双元音),5 个可以跟随元音的非双元音
经验数据表明真实数字大约高出 15%,但如果包含更多排列,它们开始超过 5 个字符的长度,给出一个夸大的答案。
一个随机的 5 个字母 [az] 密码有大约 1190 万个排列,这不到其中的 3%。
然后粗略的近似,忽略边缘情况并一次考虑成对的符号,对于pwgen
长度为n 个字符的可发音密码,
P = 767 ^ (n/(2*1.4))
其中 767 是,符号对,, ,超过 2 的( 27*13 + 13*27 + 13*5 )
符号对的排列,而 1.4 将字符长度 n 减少到音素的数量。(在幂中估计数字 1.4 会使公式对微小的变化有些敏感。)c v
v c
v v
767(有效符号对)消耗大约 2.8 个字符,log2(767)
有效熵为 9.6 位( ),每个字符 3.4 位。与 [az] 的 4.7 位相比,我们需要大约 1.35 的整体系数才能使这些密码达到相当的强度,即长三分之一。
为了比较,在pwgen
输出中允许随机混合大小写和数字可以让您恢复到每个字符约 4 位,因此pwgen
长度为 n(不带-A0
)的密码仍然小于相同长度的 [az] 密码(约 4.7)。
(对于经验证明,请注意pwgen
仅在长度 >=5 时使用可发音的音素。)
要用作密码,您可能需要至少50 位熵(例如,相当于 [a-zA-Z0-9] 中的 8 个字符 + ASCII 标点符号,每个字符 6.5 位。)这可以通过pwgen -A0
密码长度来实现15-16 个字符(每个字符约 3.4 位)。这是具有可比较强度密码的长度的两倍。
n len 个单词的数量 (26^n) > n len 可发音单词的数量 > n len 密码短语的数量 > n len 英语单词的数量。
全部正确(我假设“n len 英语单词”意味着使用单个单词作为密码)。密码短语需要相当长才能有效,可能每个字符 2 位(例如 40k 字,平均长度 8,与不相关的词 - 相关的词较低)。RFC2289中使用的固定短词字典样式方案实现每个字符约 3 位。
* Wolframgraph 26^(1.375n) versus 40^n
或者也可以试试这里log plot 26^(1.375n) versus 40^n for n [0,16]
缓存的