哈希
一、哈希函数基础概念
哈希函数(Hash Function)是一种将任意长度的输入数据转换为固定长度输出的数学函数。简单来说,它就像一个"数字指纹生成器",无论输入多大,输出都是固定长度的字符串。
通俗解释:想象一下,你有一本厚厚的《红楼梦》,无论你把这本书放在哪个地方,都能通过一个独特的"指纹"(哈希值)来标识它。这个指纹很短,但能唯一标识整本书。
二、加密哈希函数的三大特性
在比特币中,哈希函数是核心密码学工具,它必须满足三个关键特性:
1. 抗碰撞性(Collision Resistance)
定义:很难找到两个不同的输入,使得它们的哈希值相同。
通俗解释:就像世界上没有两片完全相同的雪花,哈希函数也应保证不同内容产生不同指纹。
技术细节:
- 由于输入空间远大于输出空间,理论上碰撞不可避免
- 但好的哈希函数能让找到碰撞的计算量极大,几乎不可能
- 比特币中使用的SHA-256算法,碰撞概率极低,需要约2^128次计算才能找到碰撞
应用场景:比特币中用于验证交易完整性。如果有人篡改交易内容,哈希值会改变,系统能立即检测到。
疑问1. 什么是输入空间和输出空间?
-
输入空间:所有可能的输入数据的集合。在哈希函数中,输入可以是任意长度的任何数据(文本、图片、视频等),这个空间几乎是无限大的。
-
输出空间:哈希函数产生的哈希值的集合。例如,SHA-256的输出是256位,所以输出空间大小为2^256(约1.1579×10^77)。
2. 为什么输入空间远大于输出空间?
- 哈希函数的输出长度是固定的,比如SHA-256固定输出256位。
- 但输入可以是任意长度的任何数据,理论上输入空间是无限的。
3. 鸽巢原理(Pigeonhole Principle)的解释
鸽巢原理是一个简单的数学原理:如果你有n个物品和m个容器,当n > m时,至少有一个容器包含多于一个物品。
在哈希函数中:
- 输入数据(物品)数量:几乎无限
- 哈希值(容器)数量:固定,如2^256
因为输入数量远大于输出数量,所以必然会有至少两个不同的输入产生相同的哈希值,这就是"碰撞"。
4.SHA-256 的碰撞抵抗强度
SHA-256 的输出是 256 位(即 2^256 种可能的哈希值)。根据生日攻击,要找到一对碰撞,平均需要尝试大约 2^(n/2) 次,其中 n 是哈希值的位数(这里 n=256)。
2^128 是一个天文数字,大约是 340 亿亿亿亿(3.4×10^38)。即使使用全世界最强大的计算机,也需要远超宇宙年龄的时间才能完成这个数量的计算。
因此,SHA-256 的碰撞抵抗强度是 128 位安全级别。
2. 隐藏性(Hiding)
定义:从哈希值无法反推出原始输入。
通俗解释:就像把一锅汤煮成"指纹",你无法从指纹还原出汤的成分。
技术细节:
- 哈希函数是单向的,不可逆的
- 成立前提:输入空间足够大,分布均匀
- 例如,SHA-256的输出是256位,输入空间极大,暴力破解几乎不可能
应用场景:比特币中用于"数字承诺"(Digital Commitment)。例如,预测股市走势时,先公布哈希值,再公布预测内容,证明预测是在结果之前做出的。
3. 谜题友好性(Puzzle Friendly)
定义:哈希值的计算事先不可预测,必须通过尝试才能找到特定条件的输出。
通俗解释:就像猜密码,你不知道哪个密码能打开门,只能一个一个试。
技术细节:
- 没有捷径,必须通过穷举法
- 与"工作量证明"(PoW)直接相关
应用场景:比特币挖矿的核心原理。矿工需要不断调整随机数(Nonce),直到找到满足特定条件的哈希值。
三、BTC中使用的哈希算法
1. SHA-256(Secure Hash Algorithm 256)
特点:
-
输出长度:256位(64个十六进制字符)
-
用途:比特币区块头哈希、交易哈希、挖矿
-
为什么选择它:安全性高,抗碰撞性强
输入:"Hello, Bitcoin!"
SHA-256输出:
"0b9d2a1d6c6d5c8a4f3e7c6d2a1d6c6d5c8a4f3e7c6d2a1d6c6d5c8a4f3e"
2. RIPEMD-160
特点:
-
输出长度:160位
-
用途:生成比特币钱包地址
-
为什么选择它:在生成地址时,与SHA-256结合使用
输入:"04a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0"
RIPEMD-160输出:
"5e8d9a4b3c2f1e0d9a8b7c6d5e4f3a2b1c0d9e8f"
签名
核心比喻:玉玺与印鉴
-
你的私钥 = 玉玺上独一无二的雕刻纹理。这是绝密,只有皇帝(你)持有。
-
你的公钥 = 根据玉玺纹理制作出的公开"印鉴图案"。任何人都可以拿到这个图案,用来核验。
-
你的地址 = 印鉴图案的"编号"或"二维码"。一个更短、更方便公开分享的收款标识。
-
交易信息 = 一份需要颁布的圣旨(内容:"朕将100两黄金赐予爱卿张三")。
-
数字签名 = 用玉玺在这份具体圣旨上盖出的、独一无二的"朱砂印"。
一、非对称密码学基础
1. 私钥:你的终极秘密
-
专业上说:一个随机生成的256位二进制数(介于1到约10^77之间)。宇宙中的原子数大概在10^80个,所以猜中你的私钥概率极低。
-
通俗理解 :就像在1到"全宇宙沙子总数"之间,随机挑一个数字记在你的脑子里。这就是你的全部权力,丢了它,你的钱就永远找不回了;泄露它,你的钱就是别人的了。
2. 公钥:由私钥推导而出的公开锁孔
-
专业上说 :通过 椭圆曲线乘法(ECDSA的基础) 这个单向函数计算得出。公式
公钥 = 私钥 * G。G是椭圆曲线secp256k1上一个公认的起点。 -
通俗理解 :有一个设计极其精巧的、只能单向运转的"机器"。你把你的私钥数字 喂进去,机器会吐出一个复杂的几何图形(公钥)。全世界都能看到这个图形,但谁也无法通过这个图形反推出你当初喂进去的数字是什么。这就是数学上的"单向门"。
3. 地址:公钥的压缩快递单号
-
专业上说:对公钥进行SHA256和RIPEMD160两次哈希运算,再进行Base58Check编码得到。用于公开收款。
-
通俗理解:那个几何图形(公钥)太长了,不方便传播。我们就把它扔进一个"粉碎搅拌机"(哈希函数),出来一串固定长度的、看似乱码的字符串。这个字符串就是地址。它也是单向的,无法反推。
关系链 :
私钥(绝密数字) → [单向椭圆曲线机器] → 公钥(公开的几何图形) → [单向哈希搅拌机] → 地址(公开的收款码)
这个链条的单向性是比特币安全的根基。
二、颁布圣旨------交易的签名过程
假设你要转1个BTC给朋友。你需要创建一笔交易,并对它进行"玉玺盖印"。
步骤1:创建待签名消息
你写好了交易内容:"从我的地址A(这笔钱之前是锁给我的),转1个BTC到地址B,找零0.5个BTC回到我的新地址C。"
- 关键点 :在签名前,比特币软件会做一个特殊处理:它会把你输入中原本应该放签名的地方,替换成上一笔交易锁定这笔钱的脚本 (里面包含你的公钥哈希)。这样做的目的是为了精准地声明:"我正在动用那一笔特定的钱。"
步骤2:哈希运算
将上面这份"圣旨草稿"通过SHA256算法计算两次,得到一个256位的"数字指纹"(哈希值 z)。
- 通俗理解:给这份圣旨做一个极其灵敏的"DNA检测"。哪怕圣旨上改一个标点符号,这个"DNA指纹"都会完全不同。
步骤3:生成签名
现在,用你的私钥 和刚才的"DNA指纹" z,运行ECDSA签名算法。这个算法会输出两个数字 (r, s),合起来就是你的数字签名。
-
专业细节 :算法内部会引入一个随机数(k),确保每次签名都不同,防止被追踪或破解。
r是椭圆曲线上一个临时点的坐标,s是一个由私钥、指纹和随机数计算出的值。 -
通俗理解 :你的玉玺(私钥)和这份圣旨的DNA指纹(z)一起,在一个特殊的、带有随机纹理的印泥里蘸了一下,然后盖在圣旨上,形成了一个独一无二的、无法仿制的朱砂印(签名
(r, s))。即使是同一份圣旨,两次盖印的微观纹理也会不同,但都能被同一个"印鉴图案"验证。
步骤4:封装并发送
将这份盖好朱砂印的圣旨(交易),连同你的公开印鉴图案(公钥),一起广播给比特币网络。
三、全网的验证过程
任何一个比特币节点(好比朝堂上的文武百官)收到你的交易后,都会进行严谨的核验:
-
提取要素 :从交易中取出三样东西:
公开的印鉴图案(公钥K)、朱砂印(签名 (r, s))、圣旨文字(交易信息)。 -
重现指纹 :用同样的方法(步骤1&2),对圣旨文字进行 完全相同的 "DNA检测",得到它认为的指纹
z'。 -
数学核验 :启动ECDSA验证算法。这是一个纯粹的数学公式 。它将
公钥K、签名(r, s)和计算出的指纹z'代入公式进行运算。 -
裁决时刻:
-
如果公式成立:那就证明了两个铁的事实:
-
这个朱砂印,必须且只能由持有对应玉玺(私钥)的人盖出。
-
这份圣旨的DNA指纹与盖印时完全一致,内容自盖印后从未被篡改。
-
-
如果公式不成立:要么是玉玺不对(私钥无效),要么是圣旨被调包(交易被篡改)。交易将被立即驳回。
-
关键的精妙之处 :验证者完全不需要知道你的私钥是什么。他们只需要你的公钥和签名,通过纯粹的数学计算,就能以极高的确定性确认你的身份和交易的完整性。这就是非对称密码学的魔力。
四、高级特性与安全深析
1. 签名类型(SIGHASH):给圣旨的哪部分盖印?
-
ALL(默认):玉玺盖在整个圣旨上,所有内容(输入、输出)都已确认,不可更改。
-
NONE :玉玺只盖在"朕已阅"这部分,不锁定收款人。危险! 别人可以改掉你的收款地址。
-
SINGLE :玉玺盖在朕已阅和指定的一个收款人上。
-
ANYONECANPAY:可以和上面组合。意思是"朕这部分钱已经同意动了,其他人也可以往这笔交易里加钱"。用于构建复杂交易。
2. 为什么绝对安全?(基于的数学难题)
-
椭圆曲线离散对数问题 :已知
公钥 = 私钥 * G,想从公钥反推私钥,在现有计算能力下需要数亿年。这是私钥安全的基石。 -
哈希函数的抗碰撞性:无法伪造另一份不同的"圣旨",使其DNA指纹和原版一模一样。这是交易不可篡改的基石。
3. 对未来的考量(量子计算)
量子计算机理论上能破解椭圆曲线密码(通过秀尔算法)。但比特币社区早已关注:
-
地址是哈希过的:量子计算机无法直接从地址反推公钥。
-
升级能力:如果危机临近,比特币可以通过软分叉升级到抗量子的签名算法(如基于哈希的签名)。你的资金只需要在升级后用新算法进行一次交易即可保全。
总结:比特币签名的精髓
比特币的签名系统,是一套将 "绝对权力归于私钥" 和 "公开验证无需信任" 完美结合的杰作。它用最严谨的数学,在去中心化的混沌世界里,建立了坚不可摧的身份与授权秩序。
你可以这样向任何人概括:
"比特币的签名,就像你用一把全世界只有你知道密码的隐形钥匙,在一张交易单上签下了一个用数学公式生成的、独一无二的魔法印章。全网任何人都能用公开的'解密板'(公钥)来验证这个魔法印章的真伪,但谁也造不出第二枚。"