助记词越多越安全吗: 12助记词 VS 24助记词

研究了一下 12 个助记词和 24 个助记词的区别，BIP39 定义了助记词的生成算法，其中生成 12 个助记词的种子随机数 (随机熵) 是 128 位，密码学安全强度为为 2^128，而 24 个助记词的种子随机数是 256 位，密码学安全强度为 2^256。

或者从另一个角度看，从 2048 个单词库中选择 24 个助记词的组合是 2048^24 (与 2^256 接近)，而选择 12 个助记词的组合是 2028^12 (与 2^128 接近)，因此理论上讲 24 个助记词更难暴力碰撞，安全性更高。

但是有一个著名的理论叫生日悖论，是指如果一个房间里有 23 个或 23 个以上的人，那么至少有两个人的生日相同的概率要大于 50%， 对于 60 或者更多的人，这种概率要大于 99%。

生日悖论对密码学的影响是巨大的。具体来说，当哈希函数的输出长度为 n 位时，当元素数量达到 2^(n/2) 时，存在两个元素的哈希值相同的概率大约为 50%。也就是说，256 位哈希函数的密码学安全强度为其 bit 位数的一半，即 2^128，这个刚好是 12 个助记词的密码学安全强度，而目前大多数公链在交易签名之前使用的哈希函数是 256 位。

如果攻击者能够找到两个不同的输入数据，它们的哈希值相同，那么攻击者就可以利用这个漏洞在交易签名环节进行碰撞攻击，比如拿已经上链的转帐交易，碰撞哈希值 (对原交易做一些修改，比如修改转帐的接收地址) 制造假的交易。

也就是说，这里最薄弱的环节不在助记词或者私钥，而在于交易签名的哈希算法部分 (或者说二者是难度差不多)；攻击者与其去碰撞助记词，不如碰撞交易的哈希值 (当然这 2 种都几乎不可能)。

所以并不是助记词越多越安全，12 个助记词刚好是足够的，其密码学安全强度是 2^128，再增加助记词的数量并不能提高密码学安全强度。更多的助记词反而会增加保存的难度。