首先,先把加密货币的想法放在一边几分钟。我们将从更实际的事情开始这个故事:账本和数字签名。 如果您和您的朋友经常兑换货币,支付您应得的晚餐费用等,那么一直兑换现金可能会很不方便。因此,您可能会保留一个公共分类账,记录您将来打算支付的款项。 Alice 付给 Bob 20 美元,Bob 付给 Charlie 40 美元,诸如此类。这个分类账将是公开的,每个人都可以访问,就像一个任何人都可以访问并添加新行的网站。每个月月底,大家都会查看交易清单并统计所有内容。如果你花的钱比收到的多,你就把这笔钱放进锅里;如果你收到的钱比你花的多,你就把那么多钱拿出来。
因此,成为该系统一部分的协议看起来是这样的:任何人都可以向分类账中添加行,并且在每个月末,每个人都会聚在一起用真实的钱进行结算。像这样的公共分类账的一个问题是,当任何人都可以添加一行时,如何阻止鲍勃在未经爱丽丝批准的情况下进入并写入“爱丽丝向鲍勃支付 100 美元”?我们如何相信所有这些交易都是发送者所期望的? 这就是密码学的第一个部分:数字签名。就像手写签名一样,这里的想法是爱丽丝应该能够在交易旁边添加一些东西,证明她已经看到并批准了它。而且其他人应该不可能伪造她的签名。 乍一看,数字签名似乎根本不可能,因为构成签名的任何数据都可以由任何计算机读取和复制,那么如何防止伪造呢?其工作原理是每个人都会生成所谓的公钥/私钥对,每个密钥对看起来都像一些位串。私钥有时也称为“秘密”密钥,因此我们可以将其缩写为 sk,而将公钥缩写为 pk。顾名思义,密钥是您应该保密的东西。 在现实世界中,无论您签署什么文档,您的手写签名看起来都是一样的。数字签名要强大得多,因为它会根据不同的消息而变化。它看起来像一串 1 和 0,通常类似于 256 位,即使稍微改变消息也会完全改变该消息上的签名应该是什么样子。形式上,生成签名涉及一些既取决于消息本身又取决于您的私钥的功能。
私钥确保只有您可以生成签名,并且它取决于消息这一事实意味着没有人可以复制您的签名之一以将其伪造到另一消息上。 与此相关的是验证签名是否有效的功能,这就是公钥发挥作用的地方。它所做的只是输出 true 或 false,以指示这是否是由与您用于验证的公钥关联的私钥创建的签名。我不会详细介绍这些函数到底是如何工作的,但其想法是,如果您不知道密钥,则完全不可能找到有效的签名。 具体来说,没有比使用公钥猜测和检查随机签名是否有效更好的策略了,直到找到一个有效的签名。有 22⁵⁶ 256 位的可能签名,您需要找到有效的签名。这是一个大得愚蠢的数字。称其为天文巨星,未免太过于相信天文学了。 这么说吧,当您根据给定消息和公钥验证签名时,您可以非常有信心地认为,某人生成签名的唯一方法是他们知道与公钥关联的秘密密钥。 这里有一个小问题:如果 Alice 签署了一笔交易,如“Alice 向 Bob 支付 100 美元”,即使 Bob 无法在新消息上伪造 Alice 的签名,他也可以从消息/签名开始多次复制同一行组合有效。 为了解决这个问题,我们在您签署交易时,消息必须包含与该交易关联的一些唯一 ID。这样,如果 Alice 多次向 Bob 支付 100 美元,则每笔交易都需要一个全新的签名。 好吧,太棒了,数字签名消除了对我们初始协议的很大程度的信任。
|