1.BTC-密码学原理

BTC中用到了密码学中的两个原理,哈希和签名

哈希(Hash)

加密哈希函数 (Cryptographic Hash Function) 将任意长度的数据(如文本、文件或密码)转换为一个固定长度的、独一无二的字符串。这个输出的字符串被称为哈希值 (Hash Value)消息摘要 (Message Digest)。用来检测信息是否被篡改。

加密哈希函数的性质:

  1. 抗碰撞性 (Collision Resistance)/抗第二原像攻击 (Second Pre-image Resistance) 抗碰撞性的意思是找到两个不同的输入数据,使得它们能够产生相同的哈希值,在计算上是不可行的。即难以找到任意两个不同的输入 xy,使得 Hash(x) = Hash(y)。这里不是指找不到这种输入数据,而是在人力的计算条件下不可行。 注意:目前没有任何一种哈希函数经过了数学证明这个形式,在实用中往往都是经验得出。
  2. 抗原像攻击 (Pre-image Resistance) 给定一个哈希值 h,要找到一个输入数据 m,使得 Hash(m) = h,在计算上是不可行的。这要求输入空间足够大,且输入足够均匀。

作用:承诺方案(Sealed Envelope)

第一阶段:承诺 (Commit)

  • 过程:发送方(比如叫 Alice)想要对一个信息(例如,一个出价或一个预测)做出承诺,但暂时不想让接收方(比如叫 Bob)知道具体内容。Alice 会将这个信息和一个只有她自己知道的随机数结合起来,然后通过一个加密哈希函数 (Cryptographic Hash Function) 计算出一个哈希值。这个哈希值就是所谓的“承诺”或“数字信封”。Alice 将这个哈希值发送给 Bob。
  • 效果
    • 保密性:Bob 收到了哈希值,但因为哈希函数的抗原像攻击 (Pre-image Resistance) 性质,他无法从中反推出 Alice 的原始信息。这就好比 Bob 收到了一个密封的信封,但他不知道里面写了什么。

第二阶段:揭示 (Reveal / Open)

  • 过程:在未来某个约定的时间点,当需要公开信息时,Alice 会把她的原始信息以及那个随机数都发送给 Bob。
  • 验证:Bob 接收到后,会用和 Alice 完全相同的方式(原始信息 + 随机数)来计算哈希值,然后验证这个结果是否与他之前收到的“承诺”哈希值完全一致。
  • 效果
    • 承诺性/绑定性 (Binding):由于哈希函数的抗碰撞性 (Collision Resistance),Alice 无法在做出承诺后,再找出另一份不同的信息和随机数组合,使其能产生完全相同的哈希值。因此,她一旦做出承诺,就无法反悔或篡改她的原始信息。这就好比信封一旦封上,她就不能再换掉里面的纸条了。

实际的应用场景有在线拍卖数字合约等。

在比特币中,加密哈希函数还需要有一个性质就是谜题友好性 (Puzzle Friendliness),即:

  • 计算高效性 (Efficiently Computable):虽然找到一个符合特定条件的哈希值非常困难,但对任何一个给定的输入,计算其哈希值的过程本身必须非常快速和高效
  • 不可预测性 (Unpredictability):哈希函数的输出必须看起来是完全随机的。对输入进行微小的改动(比如改变 Nonce),输出的哈希值应该发生“雪崩效应”,变得完全不同且无法预测。这意味着矿工无法“聪明地”构造 Nonce,只能通过不断尝试(暴力破解)来寻找答案。这保证了算力是唯一的竞争因素,使得挖矿像一个公平的“彩票游戏”。
  • 难度可调节 (Adjustable Difficulty):通过调整“目标值”的大小,比特币网络可以精确地控制找到一个有效哈希的平均时间。比特币协议的设计目标是大约每10分钟产生一个新区块。如果全网算力增加,导致出块速度变快,协议就会自动调低目标值(即提高难度);反之,如果算力下降,协议就会调高目标值(即降低难度)。这种动态调整能力是维持比特币稳定运行的关键。

加密哈希函数的谜题友好性服务于比特币的工作量证明 (Proof-of-Work, PoW)机制,这是一种去中心化的、无需信任的共识规则。它的核心思想是:你必须付出实际的、可验证的努力(工作),才能获得某种权利(比如记账权)。

在BTC中,使用的加密哈希函数是SHA-256,满足上述的几种性质。

签名(Signature)

BTC采用非对称加密技术,这项技术的核心是公钥和私钥,一对公钥和私钥就是一个账户

  • 私钥 (Private Key):这是一串极其机密的、随机生成的数字。在BTC中,私钥由本人保管,类似于银行卡的密码,用于解密。同时,只有持有私钥才能生成有效的签名。
  • 公钥 (Public Key):公钥是由私钥通过一个单向的数学算法(椭圆曲线乘法)计算出来的。这个过程是不可逆的,即你可以从私钥轻易地计算出公钥,但无法从公钥反推出私钥。公钥是公开的,可以安全地分享给任何人。这个公钥用于别人发送给你BTC的时候进行加密,也代表了你的BTC地址。

在BTC中,公钥和私钥的核心作用不是为了加密交易信息以实现保密,而是为了证明资产所有权并对交易进行授权。它们的功能是签名,而不是加密。这时,私钥更像是个人章,而公钥像是印章比对样本,只有持有私钥,才能生成有效的签名。其他人没有私钥,就无法伪造签名。在BTC中,其他人可以通过公钥验证数字签名,以确认交易的正确性。

需要注意的是,一个比特币私钥本质上是一个 256位的二进制数字。这意味着私钥的总数量是 2^256。这意味着恰好生成一个已经使用过的私钥在现实中是不可能的。但是这一切的前提是要有一个好的随机源。不仅是在生成的时候,在签名的时候也需要有好的随机源,不然十分容易导致私钥的泄露。

在BTC中,经常是先对一个Messege进行Hash,在对这个Hash进行Signature。