区块链技术与应用一 密码学原理
ffchic Lv2

本篇是学习笔记:最近工作和学习中总觉得自己掌握的知识还不够,就想系统补一补。听朋友说 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 ResistanceHiding 这两个性质,可以实现“数字承诺”(Digital Commitment):

  • 原理
    1. 发布方计算并公布 commitment = H(message || nonce)
    2. 由于 Hiding 性质,即便公开了 commitment,其他人也无法知道 message 的内容(就像把信件放进了密封的信封)。
    3. 由于 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 的转账请求?
  • 流程
    1. 签名:A 使用自己的私钥对交易信息进行加密生成签名。
    2. 验证:其他节点(矿工)使用 A 的公钥来验证这个签名是否与交易内容匹配。
  • 结论:如果验证通过,说明这笔交易一定是由持有私钥的人(即 A 本人)发起的。

3. 安全性基础

“如果我不停地通过暴力手段生成公私钥对,有没有可能碰巧生成一个和别人一模一样的公私钥,然后偷走他的钱?”

  • 理论上的可能性:确实存在。
  • 实际上的不可能性:这种概率在数学上微乎其微,在现有的算力条件下被认为是不可行的。
  • 重要前提:生成密钥时必须拥有一个好的随机源(a good source of randomness)
    • 如果随机源不够随机(比如每次都在很小的范围内随机),那么生成的私钥就可能被推导出来。
    • 不仅是生成账户时,每次签名时也同样需要良好的随机源。如果签名过程中的随机数泄露或不安全,也有可能导致私钥泄露。

总结

  • Hash(哈希)
    用于摘要工作量证明(挖矿)。利用其抗碰撞性确保交易不可篡改,利用其 Puzzle Friendly 特性构建挖矿难题。

  • Signature(签名)
    用于身份认证。利用非对称加密技术,确保只有拥有私钥的人才能动用账户里的资金。
    在比特币中hash和签名是可以结合使用的,一般是对一个输入的message取一个hash然后再对hash的结果进行一个签名
    这两大技术构成了比特币去中心化的基石:所有的交易记录公开透明(不怕篡改),而账户的所有权绝对安全(不怕伪造)。