本篇是学习笔记:最近工作和学习中总觉得自己掌握的知识还不够,就想系统补一补。听朋友说 Web3 方向机会不少(也有一些远程岗位),我就在 B 站找到了北京大学肖臻老师的课程。
接下来我会根据课程内容写几篇对应的博客;对我来说,更准确地说是“笔记”。
密码学原理
比特币(Bitcoin)主要用到密码学的两个核心功能:哈希(Hash)和签名(Signature)
Hash(哈希函数)
比特币中使用的哈希函数是 SHA-256 (Secure Hash Algorithm 256)。它在此处应用中需要满足以下三个关键性质:
1. Collision Resistance(抗碰撞性)
- 定义:对于哈希函数
,如果输入 ,但 ,这种情况称为“哈希碰撞”。 - 性质:虽然从理论上讲,输入空间是无限的而输出空间(256位)是有限的,碰撞必然存在;但在实际应用中,想要人为找到两个不同的输入
和 使得 是计算上不可行的(除非使用蛮力破解,但这几近不可能完成)。 - 作用:这一特性保证了信息的防篡改。我们可以对一个消息
message求摘要digest = H(message)。如果message被篡改,其 Hash 值必然变化,从而被轻易发现。
2. Hiding(隐藏性 / 单向性)
- 定义:哈希函数的计算过程是单向不可逆的。给定输入
,很容易计算出 ;但给定 ,很难反推出 。 - 注意:为了保证 Hiding 的安全性,输入空间必须足够大。如果输入的取值范围很小,攻击者可以通过遍历所有可能的输入来破解。
- 解决方案:在实际应用中,通常会在输入值后面拼接一个随机数(nonce),即计算
,从而保证输入空间足够大,防止暴力破解。
3. Puzzle Friendly(谜题友好 / 难以预测)
- 定义:哈希值的输出是不可预测的。如果希望哈希值的输出落在某个特定的范围内(例如前
位都是 0),没有比随机尝试输入更好的方法。 - 挖矿应用:比特币的“挖矿”就是基于这一性质。矿工需要不断尝试不同的随机数(Nonce),与区块头信息组合在一起计算 Hash,直到找到一个结果满足特定的“难度目标”(例如前多少位必须为 0)。
- 特点:寻找这个合法的输入非常困难(Difficult to solve),需要消耗大量算力,这就是工作量证明(Proof of Work);但验证结果非常容易(Easy to verify),只需进行一次哈希运算即可。
Digital Commitment(数字承诺)
结合 Collision Resistance 和 Hiding 这两个性质,可以实现“数字承诺”(Digital Commitment):
- 原理:
- 发布方计算并公布
commitment = H(message || nonce)。 - 由于 Hiding 性质,即便公开了
commitment,其他人也无法知道message的内容(就像把信件放进了密封的信封)。 - 由于 Collision Resistance 性质,发布方日后在揭示
message时,无法将其篡改成其他内容,因为他无法找到另一个也能算出同样commitment的消息。
- 发布方计算并公布
Signature(签名)
在了解签名之前,需要先介绍一下加密体系:
对称加密(Symmetric-key algorithm):
通信双方使用同一个密钥。缺点是难以解决密钥的安全分发问题。非对称加密(Public-key Cryptography):
- 每个用户生成一对密钥:公钥(Public Key)和私钥(Private Key)。
- 公钥可以对外公开,私钥必须严格保密。
- 加密场景:发送方使用接收方的公钥加密,接收方用自己的私钥解密。这样即便密文在网络上传输,也只有拥有私钥的人能解开。
在区块链和比特币系统中,我们主要使用私钥进行签名(而非加密传输,因为交易信息本身是公开的)。
1. 账户即密钥对
在比特币系统中,创建一个账户其实就是生成一对公钥和私钥 (public key, private key)。
这就意味着,只要拥有了私钥,就拥有了该账户下资产的控制权。
2. 签名的作用
签名的核心目的是身份验证和防伪造。
- 场景:假设 A 想转给 B 10个比特币。
- 问题:如何向全网证明“这笔交易确实是 A 发起的”,而不是某个黑客伪造了 A 的转账请求?
- 流程:
- 签名:A 使用自己的私钥对交易信息进行加密生成签名。
- 验证:其他节点(矿工)使用 A 的公钥来验证这个签名是否与交易内容匹配。
- 结论:如果验证通过,说明这笔交易一定是由持有私钥的人(即 A 本人)发起的。
3. 安全性基础
“如果我不停地通过暴力手段生成公私钥对,有没有可能碰巧生成一个和别人一模一样的公私钥,然后偷走他的钱?”
- 理论上的可能性:确实存在。
- 实际上的不可能性:这种概率在数学上微乎其微,在现有的算力条件下被认为是不可行的。
- 重要前提:生成密钥时必须拥有一个好的随机源(a good source of randomness)。
- 如果随机源不够随机(比如每次都在很小的范围内随机),那么生成的私钥就可能被推导出来。
- 不仅是生成账户时,每次签名时也同样需要良好的随机源。如果签名过程中的随机数泄露或不安全,也有可能导致私钥泄露。
总结
Hash(哈希):
用于摘要和工作量证明(挖矿)。利用其抗碰撞性确保交易不可篡改,利用其 Puzzle Friendly 特性构建挖矿难题。Signature(签名):
用于身份认证。利用非对称加密技术,确保只有拥有私钥的人才能动用账户里的资金。
在比特币中hash和签名是可以结合使用的,一般是对一个输入的message取一个hash然后再对hash的结果进行一个签名
这两大技术构成了比特币去中心化的基石:所有的交易记录公开透明(不怕篡改),而账户的所有权绝对安全(不怕伪造)。