熵比特是描述猜测秘密值时不确定性的单位。如果两个结果概率相同,而攻击者不知道出现了哪一个,就有一比特熵。四种等概率可能对应两比特,十六种对应四比特。它不等同于文件或密钥在内存中占用的位数。
公平硬币两面出现的概率相同。一次秘密投掷有两种可能,两次独立投掷有四种,四次投掷有十六种。每增加一次独立投掷,可能的结果序列数量就翻倍,熵增加一比特。这就是 H = log2(N) 表达的关系:有 N 种等概率可能时,可以算出熵的比特数。16 种可能对应 4 比特。概率相同是一个重要前提,后面还会谈到。 [1] [2]
现在不继续抛硬币,而是把一次结果写 256 遍。得到的字符串有 256 位,但仍只有两种可能:全是零,或者全是一。实际秘密仍只有 1 比特熵。重复没有创造新的独立选择。各次测量相互关联时,也可能出现同样的问题,只是不那么明显。因此,未验证独立性,就不能把单个样本的熵估计值简单乘以样本数量。 [1]
同一个值可以用普通数字、单词或十六进制表示。十六进制使用数字和 A 到 F 的字母,只是换一种方式写出同一个数,并没有创造新秘密。哈希是用特定函数从数据计算出的指纹,本身也不会增加未知的可能性。如果输入只有少数候选值,攻击者就可以逐一尝试,再比较计算出的指纹。只要知道确切输入,就能算出同样的结果。因此,关键在于秘密值是如何产生的,而不在于它看起来有多复杂。 [1] [2]
在 BIP39 中,12 个词编码 128 位输入和 4 位校验和,共 132 位;24 个词则是 256 加 8,共 264 位。校验位是计算出来的,并非额外的独立秘密选择。而且,128 或 256 比特熵还依赖于良好的输入生成方法。如果自己根据喜欢的故事挑选单词,单词数量并不能保证这些熵。 [3]
假设有 128 个独立秘密位,每一位都像公平硬币投掷那样产生。如果公开其中指定的 32 位,在这个模型里还剩 96 位未知。但这不是所有泄露都适用的通则:要看泄露了什么信息,以及各值之间有什么关系。seed 是钱包用来派生密钥的秘密初始值。知道整个 seed 的人,根本不用再猜。即使 seed 最初生成得完全正确,对他而言不确定性也已经为零。 [1] [2]
前面的结果都具有相同概率。但对于有偏来源,攻击者很可能先猜最常见的结果。最小熵衡量的正是这种首次猜测的优势:Hmin = -log2(pmax),其中 pmax 是最常见结果的概率。如果是 3/4,最小熵约为 0.415 比特。另有香农熵,用于描述平均信息量。这是不同的度量,而且两者都不等于破解秘密所需的精确平均尝试次数。 [1] [2]
攻击者未必只猜原始输入,也可能利用算法的数学性质。因此,熵的比特数、密钥长度和安全强度是不同概念。椭圆曲线密码学(ECC)的安全性依赖于某个数学问题的求解难度。例如,NIST SP 800-57 在经典计算条件下的比较中,将长度为 256 至 383 位的 ECC 密钥对应到 128 位安全强度。这不是对某个钱包的评估,也不是说所有 256 位密钥都提供 256 位安全性。 [4]
应当问:用了哪种熵度量,估计来自什么来源,攻击者又可能知道什么?NIST SP 800-90B 会评估来源及其样本,包括依赖关系和重启后的表现。测量一个文件,不能保证所有设备和未来所有条件都一样。最小熵本身也不能给出精确的攻击时间。只有了解假设,数字才有意义。 [1]
要获得更完整的理解,请将本词条与以下词条结合阅读: Cryptographic Entropy, Brute Force Search Space, Seed Phrase, Private Key. 反向关联还来自: Dice Roll Entropy, Cryptographic Entropy, Brute Force Search Space.