在密码学中,熵描述攻击者猜测一个秘密值时还面临多少不确定性。对于 Bitcoin 钱包,它从生成密钥基础的那一刻就很重要。关键不在字符看起来有多复杂,而在当时实际可能出现多少种结果、各自概率如何,以及攻击者对这个过程知道多少。
假设有人用创建钱包的日期和时间来生成秘密。编码后,结果可能看起来像一长串杂乱字符。但如果攻击者知道大致时间和生成方法,可能只需尝试很小一部分候选值。写得更长,不一定让攻击更难。因此 RFC 4086 区分了不可预测性与表面上的随机。只看一把密钥,无法判断它的熵;还需要知道它是如何生成的。 [3]
位(bit)是记录数据的基本单位,取值为 0 或 1。但位数本身并不说明攻击者还面临多少不确定性。 钱包按照 BIP39 创建 Seed Phrase 时,首先需要随机输入,然后才把输入转换为单词。12 个词对应 128 位输入和 4 位校验和;24 个词对应 256 位输入和 8 位校验和。校验和能帮助发现某些抄写错误,但不增加熵,因为它是从已有输入计算出来的。因此,更长的词列表也无法补救生成不良的随机性。重要的是备份如何产生,而不只是有多少个词。 [4]
钱包不必为每个新字节都做一次新的物理测量;一个字节包含 8 位。它可以使用称为 DRBG 的密码学生成器:一种从秘密初始状态生成更多数值的算法。在设计和使用正确时,不知道内部状态的人很难预测输出。但算法本身仍是确定性的:相同的完整状态和输入,会产生相同的后续结果。所以生成更多字节,并不自动产生更多新的物理熵。初始输入的质量和内部状态的保护都很重要。 [2]
哈希函数根据数据计算一个长度固定的指纹,这个指纹可能看起来很随机。但知道输入的人也能计算出同样的结果。完全已知的输入,不会就此成为秘密。技术术语 conditioning 指一种处理,可以减少偏差,并将已经存在的不确定性集中起来。它不是凭空制造秘密。多个来源的熵也不能自动相加:这些来源可能相互关联,提供的是同一份信息。 [1] [3]
电子噪声源可能发生故障,也可能随环境变化而改变表现。因此,NIST SP 800-90B 要求在启动时和运行中检查原始噪声,也就是在后续处理之前进行检查。这些检查寻找故障迹象,并不证明每次输出都安全。开发者需要了解来源、限制及可能存在的依赖关系。发现故障后,必须通知使用数据的应用;如果故障持续存在,来源必须停止输出。仅仅装有一颗标着“随机数发生器”的芯片还不够。 [1]
如果攻击者获得 DRBG 的内部状态,根据具体设计,他可能预测后续输出。恢复不可预测性,需要足够的新输入,而且这些输入必须是攻击者不知道的;补充这种熵称为 reseeding。只是继续计算,或加入已知时间,都不能保证恢复保护。同时要区分修复生成器和保护已有资金:生成器恢复正常,并不会使已经泄露的密钥失效。 [2]
统计测试可以发现可疑的重复等现象。但它无法确定攻击者是否掌握秘密输入,或者知道预测输出的方法。NIST SP 800-22 明确提醒了这一局限。测试是评估中有用的一环,却不能替代对整个生成器的分析。因此,一个充满看似随机数字的文件,本身并不能证明钱包安全。 [5]
初学者不必手动计算自己钱包的熵。更有用的是寻找有记录、可核查的生成过程:随机性从哪里来,如何处理,怎样应对错误,又如何保护秘密。NIST SP 800-90C 讨论的正是将熵源与 DRBG 组合成完整生成器。但引用某项标准或使用知名芯片,尚不能证明某个钱包版本正确使用了它。关键是实际实现中有证据支持的性质。 [1] [6]
要获得更完整的理解,请将本词条与以下词条结合阅读: Entropy Bit, CSPRNG, Dice Roll Entropy, Private Key. 反向关联还来自: BIP85, Dice Roll Entropy, Entropy Bit, Brute Force Search Space.