文章总结: 比特币虽被称为加密货币但交易内容公开可见,主要使用哈希和签名两种密码学功能。哈希函数具有抗碰撞性、不可逆性和谜题友好性三大特性,SHA-256被用于比特币系统。签名应用于比特币账户创建过程,用户通过本地创建公私钥对建立账户,无需第三方权威机构介入。这些密码学原理构成了比特币安全性的基础。
综合评分: 84
文章分类: 数据安全,网络安全,应用安全
BTC中所使用的密码学原理
LinaBaby
0x33 SEC
2025年11月20日 21:08
贵州
BTC中所使用的密码学原理
前言:
比特币被称为加密货币(Crypto-Currency),但实际上加密货币是不加密的(加密指的是这种货币是基于密码学实现的,但是比特币系统/区块链中所有的交易内容都是公开可见的,包括账户地址以及转账金额)
#
比特币中主要使用到了密码学中的两个功能,一个是哈希、一个是签名。
哈希:
密码学中使用的哈希函数被称为Crypto Graphic Hash Function,有两个重要的特性,分别是:
性质一: Collision Resistance(抗碰撞性):
Collision指的是哈希碰撞
哈希碰撞是指两个不同的输入传入同一个哈希函数产生同样的输出(哈希值),不同的输入被映射到了哈希表中的同一个位置。
一般来说哈希碰撞是不可避免的,因为输入的空间是远远大于输出空间的。以SHA-256哈希算法为例,SHA-256会生成一个256位的哈希值,那么这个算法的输出的范围/空间的所有取值范围是2的256次方。但是输入空间是无限的,所以从理论上来说是存在哈希碰撞的可能的,只是这个搜索空间是一个很大的范围(基本上不可能实现),所以说SHA-256存在哈希碰撞的概率极低。
如果按照鸽笼原理,那么必然会出现两个输入映射到同一个输出的情况
鸽笼原理:
10只鸽子放进9个鸽笼,那么一定有一个鸽笼放进了至少两只鸽子
有的书上管Collision Resistance这种特性叫Collision Free,这很容易让人产生误解,觉得好像是碰撞不会发生的意思,但碰撞是客观存在的。Collision Free指的是很难人为的制造哈希碰撞。
想要人为的制造哈希碰撞,只有通过暴力破解(Brute-Force)的方式,便利大量的输出计算哈希,直到遍历出一个相等的哈希值。
碰撞示例代码:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"os"
)
func main() {
data, _ := os.ReadFile("input.txt")
target := "75124ecaf33b805b5e42e2deac73e630"
for i := 1; ; i++ {
newData := append(data, []byte(fmt.Sprintf("%d", i))...)
hash := md5.Sum(newData)
hashStr := hex.EncodeToString(hash[:])
if i%100000 == 0 {
fmt.Printf("尝试 %d: %s\n", i, hashStr)
}
if hashStr == target {
fmt.Printf("碰撞找到! 后缀: %d, 哈希: %s\n", i, hashStr)
break
}
}
}
Collision Resistance的作用是用来检测数据是否被篡改,可以利用这个性质来检测对某条信息的篡改,如下方公式所示,哪怕是对输入任何微小的改动,都会导致输出完全不同。
()
这个特性也常用于验证文件的合法性,假设说需要使用云存储存储一个文件,那么在上传的时候对整个文件进行一次HASH计算得到digest(摘要: 哈希函数计算的结果),再重新下载回文件时就可以再计算一次查看digest是否相等,如果不等则说明文件被篡改。
注:
没有任何一个哈希函数能够在数学上证明自己是Collision Resistance的,这种性质在理论上是证明不出来的。
现目前没有任何人能找到人为制造哈希碰撞的快捷方法,所以我们认为这些哈希函数是Collision Resistance的。
也有曾经我们认为是安全的哈希函数,但后面被找到了认为制造哈希碰撞的方法(MD5)
性质二: Hiding(不可逆,无法从输出反推出输入):
无法用H(X)的结果反推出X
Hiding特性要求输入均匀,各种取值的可能性都是差不多的,如果输入空间范围很大,但绝大多数取值都集中在少数几个值,那么也是很容易被破解的。
作用:
可以和Collision Resistance性质结合在一起,实现Digital Commitment/Digital Equivalent of a sealed envelope(数字承诺/数字信封)
所谓的数字承诺就是通过某种方法(例如哈希函数),计算出一个摘要,这个摘要不能反向推算出Msg(Hiding特性),也不能轻易的计算出某个Msg正好等于某个Digest(Collision Resistance)。
视频中引用了一个例子:
一个股神说他能够预测明天股市的行情,如何判断这位股神是否预测的准,就可以采用数字承诺的方式。
股神的言论可能会影响市场的行情,如果提前公布预测结果可能会间接的导致股市某只股票的上涨或跌停。
所以可以将预测结果进行一次hash运算,公布Digest,待到第二天封盘股神给出明文比对Digest即可。
Hiding特性要求哈希函数的输出足够均匀,股票的数量是有限的,所以一般会拼接上一个随机数进行哈希运算,让输出足够均匀。
除了这两个性质以外,比特币中所使用的哈希函数还要求第三个特性
性质三: Puzzle Friendly(谜题友好):
光看输入,很难猜出计算出的哈希值是什么,如果想要计算出的哈希值正好落在某个范围,没有什么好的办法,只有通过暴力破解的方式来推算。比特币的共识机制(工作量证明→Proof of work)正是利用了这一特性来决定记账节点。
工作量证明要求矿工做大量的计算(对Block Header取哈希,Block Header中有一个区域是专门用来设置nonce随机数的),直到得到一个符合预期的目标值,例如前五位是0的hash值,即可获得记账的权利。
目标值
比特币中使用的哈希函数是SHA-256(Security Hash )
签名:
签名计算运用在比特币账户创建的过程中,因为比特币是一个区中心化的系统,所以开户不需要任何第三方的权威机构介入,用户在本地就可以创建。
用户在本地创建一个公私钥对就是一个账户
Public Key && Private Key
公私钥的概念来源于非对称的加密体系,Asymmetric encryption algorithm(非对称加密算法)。
最早的加密体系是对称的(encryption algorithm),加解密使用同一把密钥(encryption key),保证安全的前提是能够通过安全的途径把密钥分发给对端(假设网络是不安全的,可能被窃听),对称加密算法的弊端(密钥的分发)。
非对称加密解决了对称加密密钥分发不方便/安全的问题,解密解密使用不同的密钥。
公钥→加密
私钥→解密
参考北京大学肖臻老师《区块链技术与应用》公开课
学习记录
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:0x33 SEC LinaBaby《BTC中所使用的密码学原理》