BTC-密码学原理
约 3035 字大约 10 分钟
2021-08-26
相关术语
crypto-currency 加密货币
cryptographic hash function 哈希函数
collision 碰撞
collision resistance 抗碰撞性
digest 签名、摘要
hiding 隐藏
one-way function 单向函数
digital commitment 数字化承诺
sealed envelope 密封信封
digital equivalent of a sealed envelope 密封性的数字等效物
nonce 随机数
puzzle friendly 拼图友好
block header 块头
proof of work(POW) 工作量证明
difficult to solve, but easy to verify 难以解决,但易于验证
SHA-256(Secure Hash Algorithm - 256 bit) 加密算法
public key 公钥
private key 私钥
symmetric encryption algorithm 对称加密
asymmetric encryption algorithm 非对称加密
encryption key 加密密匙
crypto-currency
加密货币,但其实加密货币是不加密的,区块链上的所有交易内容都是公开的,包括账户的地址,转账的金额,都是公开的。
比特币主要用到了密码学中的俩个功能,一个是Hash,一个是签名。
hash
密码学中的hash被称为cryptographic hash function
: 密码哈希函数。 它具备三个重要的性质:
collision resistance
抗碰撞性hiding
隐藏puzzle friendly
拼图友好
collision resistance
一个是collision resistance
(抗碰撞性),这collision
是指哈希碰撞。如果 x不等于y,但是H(x) = H(y)
,那么这就叫做哈希碰撞。一般来说,哈希碰撞是不可避免的,客观存在的。
collision resistance
这个性质有什么用呢,可以用来对一个message求digest
(签名)。用来检测这个message是否被篡改。数学上,是无法证明这个性质的。但是目前为止没有能主动造成碰撞的情况出现,所以在软件开发中认为是抗碰撞的。这有个有趣的故事,MD5
,以前是很流行的hash算法。但是现在md5是可以认为的制造碰撞的。
hiding
hiding
意思是hash函数的单向的、不可逆的。x -> H(x) ,但是无法通过H(x)反推出x。 one-way function
。但是想要反推,倒是也能通过蛮力求解,看看有多少可能。这个性质有什么用呢,他可以和第一个性质结合,用来实现:digital commitment
或者digital equivalent of a sealed envelope
密封型的数字化承诺。
举个例子,现实生活中,有个经济学家,他说他能例预言股市涨停。比如有一天,他预测A股票明天会涨停。这种情况有什么问题呢,因为预测本身没问题,但是公开预测的话,因为是著名的经济学家,可能会影响股市。或者反方向影响,有人不想让他预测准确,疯狂砸盘,造成本来应该涨停的A变得相反的情况了。所以,预测不能公开。但是预测结果不公开,等到收盘后再公开,那人们怎么知道预测结果有没有被篡改过!这个就要用到,sealed envelope
。 把预测结果放到密封的信封,交给一个第三方的包管,等第二天收盘之后,打开,来验证是否预测准确。那么在软件中,如何实现呢。把预测结果作为输入X,算出一个H(x) 来。然后把H(X) 公布出去,因为有hiding
性质,从这个H(x) 不知道预测结果是什么,然后第二天再把X公布出去,因为有collision resistance
性质,所以X不可能被篡改的,因为篡改了就和H(X)不一致。如果输入空间不够大,可以拼接随机数nonce
,俗称加盐,来提高输入空间。
puzzle friendly
puzzle friendly
。输入的微小变动也会导致输出的极大变动,难以推测。讲到挖矿就是这个性质的应用。挖矿的本质就是找到一个nonce
随机数,根据区块头的值,H(block header) <= target
。 挖矿的过程就是不停的尝试nonce
,使的H(block header + nonce) <= target
。puzzle friendly
性质就是说,没有捷径,只能去大量的去尝试,像拼图一样。所以这个过程,才能叫做proof of work(POW)
工作量证明。 挖矿很难,验证很容易,算出来nonce之后发布出去,大家很方便验证,这个性质就是 difficult to solve, but easy to verify
。
比特币中的哈希函数用的是SHA-256
。即Secure Hash Algorithm 256 bit
,以上的三个性质,这个算法都是满足的。到这里讲完了hash部分。
关于SHA-256
SHA-256(Secure Hash Algorithm 256 bit)
是一种加密哈希函数,属于SHA-2(Secure Hash Algorithm 2)
算法家族中的一员。SHA-2
算法家族包括了多个不同的哈希函数,如SHA-224
、SHA-256
、SHA-384
和SHA-512
等,它们分别产生不同长度的哈希值。SHA-256
是其中最常用的一种,它产生一个256位(32字节)的哈希值。
SHA-256
的主要特点包括:
- 安全性:
SHA-256
被设计为抗碰撞的,即找到两个不同的输入值,它们产生相同的哈希值是非常困难的。这使得SHA-256
在安全性方面非常可靠。 - 确定性:对于同一个输入,
SHA-256
总是产生相同的哈希值。 - 快速性:
SHA-256
算法的计算速度相对较快,适合处理大量数据。 - 不可逆性:
SHA-256
是一个单向函数,意味着从哈希值几乎不可能逆向推导出原始数据。 - 应用广泛:
SHA-256
被广泛应用于各种安全领域,包括数字签名、密码学协议、区块链技术(如比特币)等。
SHA-256
算法的基本工作流程包括几个主要步骤:初始化哈希值、处理消息(通过一系列的操作,如填充、分割、扩展、压缩等)、产生最终的哈希值。这个过程中,消息被分成多个块,每个块通过一系列的操作转换成一个固定长度的哈希值,最终这些哈希值被合并产生最终的输出。
尽管SHA-256
目前仍然是一个安全的哈希函数,但随着计算技术的发展,特别是量子计算的进步,未来可能会有新的更安全的哈希函数被开发出来以替代现有的算法。
在计算机科学中,字节(Byte)是数据存储的基本单位,1字节等于8位(bit)。位是计算机中最小的数据单位,用来表示二进制数中的0或1。
SHA-256
算法产生的哈希值是256位的,这是因为“256”指的是哈希值的位数。要将位转换为字节,我们可以用位数除以8(因为1字节=8位):
8位/字节256位=32字节
所以,256位等于32字节。这意味着SHA-256算法的输出是一个32字节长度的哈希值。每个字节由两个十六进制数表示,因此,一个256位的哈希值通常以64个十六进制数(32字节 * 2个十六进制数/字节)来表示。
签名
还有一个是签名。
要讲签名就要首先了解比特币中的例账户管理。
日常生活中,如果想开账户怎么开,待着身份证去银行开户,这就是中心化的思路。比特币是去中心化的,那怎么开户呢。每个人自己创建,不需要其他人批准。开户操作很简单,就是创建一个公钥public key
,和私钥private key
一对。 公私钥这个概念来源于非对称加密asymmetric encryption algorithm
。最早的加密是对称的,symmetric encryption algorithm
(对称加密),比如俩个人之间通信,但是这个通信的网络有可能被窃听的,怎么办呢?可以两个人之间商量一个密钥就是用同一个encryption key
,一个通过这个key加密之后,把消息发给另一个人,收到之后,也用这个key来解密。因为加密和解密用的是同一个密钥,所以叫做对称加密,它这个前提是,有某种安全的渠道,把密钥分发给通信的双方,显然不能把密钥通过明文的方式在网络上传播,因为网络本身就是不安全的。这也是对称加密的一个弱点,就是密钥的分发不是很方便。那么为了解决这个问题,非对称加密就提出来,不是用一个密钥,而是用一对密钥,加密用的是公钥,解密用的是私钥。比如说A要把一个信息传给B,A用B的公钥给这个信息加密,B收到之后再用B自己的私钥来解密得到原来的信息。需要注意的是,加密和解密用的是同一个人的公钥和私钥,都是接收方的公钥和私钥。有什么好处呢,这个加密用的公钥是不用保密的,可以告诉所有人。私钥是要保密的,私钥是保存在本地的,不用告诉通信的人。解决了密钥分发不方便的问题。
比特币创建一个账户,就在本地产生一对公钥和私钥,这个公钥就相当于一个银行帐号。别人要给你转账,只要知道你的公钥就行了。这个私钥相当于你的账户密码。之前说的比特币叫加密货币,其实是不加密的,信息都是公开的。那要这个公钥和私钥干嘛呢?实际上就是用来做签名的,比如说A要转10个比特币给B,然后把这个交易发布到区块链上,别人怎么知道这个交易确实是A发起的呢?会不会有人冒名顶替,像把A的钱转走。这就需要A在发布这个交易的时候,要用A自己的私钥对这个交易签名,其他人收到这个交易之后,再用A的公钥去验证这个签名的正确性。 a good source of randomness
,好的随机源。生成公私钥要有好的随机源。这一点要注意。
关于加解密
问:公钥加密私钥解密,私钥加密公钥可以解密么?验证是解密么?
公钥加密私钥解密是常见的非对称加密算法的使用方法,例如RSA算法。在这种加密方式中,公钥是公开的,任何人都可以用它来加密信息,但只有持有相应私钥的人才能解密这些信息。这种机制常用于保护信息传输的安全。
私钥加密公钥解密也是可行的,但用途不同。这种方式通常用于数字签名,而不是加密信息。数字签名允许接收者验证信息的来源和完整性。发送者用自己的私钥对信息进行签名,接收者则用发送者的公钥来验证签名。如果签名验证成功,说明信息确实是由声称的发送者发送的,并且在传输过程中未被篡改。
验证通常指的是确认某个操作或信息的合法性、正确性或真实性。在数字签名的上下文中,验证就是指使用公钥来检查私钥加密的签名是否有效,从而确认信息的来源和完整性。
总结如下:
- 公钥加密,私钥解密:用于保护信息的机密性。
- 私钥加密(签名),公钥解密(验证):用于验证信息的来源和完整性
小结
hash和签名这俩个功能是可以结合起来用的。比特币系统当中一般先对一个message取hash,然后在对这个hash值签名,暂时密码学的部分就了解到这里。