主页 > imtoken钱包最新下载 > 区块链1.0-比特币密码学原理

区块链1.0-比特币密码学原理

imtoken钱包最新下载 2023-03-20 07:25:39

博客以技术讨论为目的,不构成任何投资建议

炒币有风险,投资需谨慎

请遵守相关法律法规

比特币被称为加密货币cryptocurrency,但cryptocurrency并没有加密比特币密码学原理,区块链中的数据是公开的,包括交易、钱包等。比特币使用的密码学原理主要是:哈希和签名

1.散列

密码学中使用的散列称为密码散列函数,它有两个重要的性质

抗碰撞隐藏1.1抗碰撞

Collision是指哈希碰撞,数学形式的定义如下:

对于密码哈希函数,表示 H

∃x≠y⇒H(x)=H(y){\exists}\x\ne y\Rightarrow \H(x)=H(y)∃x=y⇒H(x)=H(y)

也就是说,不同的输入可以映射到相同的值。 一般来说,哈希冲突是不可避免的,因为输出空间远小于输入空间。 例如:一个256位的哈希值的输出空间只有22562^{256}2256个可能,但输入空间可以无限大。 根据鸽巢原理,必须有两个输入映射到同一个输出。

抗碰撞表明没有有效的方法来人为地创建散列碰撞。 只能通过蛮力(brute force)破解,即给定一个x,遍历整个输入空间,以找到碰撞y,但这种方法在现实中是不可能的。

抗碰撞的作用是消化数据,没有办法篡改数据内容而不被发现。 即对于一段数据m

H(m)=degestH(m)=degestH(m)=degest

对数据m进行修改,记为h(m),下面的表达式有很大概率为真

H(h(m))≠degestH(h(m))\ne degestH(h(m))=degest

此属性广泛用于文件验证码。 例如,大多数网站会在提供文件下载链接后提供验证码。 用户下载文件后,可以计算出一个文件的哈希值,并与官方验证码进行比对。 知道下载的文件是否被篡改或完整。因为不可能人为制造哈希冲突,被篡改文件的哈希与原始文件的哈希是一致的

注:hash函数在数学上没有被证明是抗碰撞的,只能通过实践经验证明。比如MD5一直被认为是抗碰撞的,但是最后被山东大学王晓云院士证明不满足抗碰撞性,即MD5可以人为制造散列碰撞

1.2 隐藏

隐藏表示哈希函数的计算是单向不可逆的

x→H(x)x↚H(x)x \ \to H(x) \\x \ \nleftarrow H(x)x→H(x)x↚H(x)

即无法通过哈希值推导出原始数据。 换句话说,哈希值不会透露有关输入的任何信息。 但是,它仍然可以通过蛮力解决。 因此,建立隐藏性的前提是输入空间足够大且分布均匀,这样暴力破解是不可行的。

隐藏和抗碰撞的结合可以实现数字承诺

1.3 数字承诺

更通俗的说法是密封信封的数码设备,现实中密封信封的例子如下:

如果A声称自己可以预测股市,如何验证A是否在说谎,最简单的方法就是提前公布自己的预测结果,等到第二天收盘时再与预测结果进行比较。 但由于“名人效应”,这种做法存在一个问题。 比如A是一家金融巨头,提前公布某只股票,会引起股民疯狂买入,导致股价上涨。 当然,也可能出现相反的结果。 因此,预测结果不能提前公开,但如果不公开预测结果,则无法确定结果在验证时是否被篡改。 密封信封法是将预测结果装入信封,交由可信赖的第三方机构保管,收市后打开信封核实。

对于数字密封信封,对预测结果进行哈希处理,公布预测结果的哈希值。 根据隐藏性,预测结果无法通过哈希值推导出来,需要封盘后才能验证。 同时,抗碰撞特性保证了预测结果不会被Revise。 但是对于股票预测的情况,在实际操作中需要注意很多细节,因为股票的输入空间有限,存在被暴力破解的风险。

除了密码学的上述两个属性,比特币还需要另一个属性——puzzle friendly

1.4 益智友好

Puzzle friendly 表示哈希值的结果是不可预测的,不可能期望一个输入的哈希值落在指定的范围内。 例如,对于一个256位的哈希值,期望哈希值满足前k位为0,后面的位的值是任意的。 puzzle friendly 属性告诉我们,如果我们事先不知道输入,则更有可能计算出符合预期的哈希值。 只有一个 一个尝试,没有捷径。 后面会提到,挖矿的原理就是找到一个nonce,使得整个区块头的hash小于等于目标。 Puzzle friendly保证大家的挖矿没有捷径,所以这个作品可以作为工作量证明

比特币使用的哈希算法是SHA-256(secure hash algorithm-256)

2. 签名

从比特币系统中的账户管理开始

2.1 非对称加密

日常生活中如果需要开户,往往需要携带身份证到银行开户。 这是中心化系统的账户管理,但是作为去中心化的比特币系统,没有银行这样的机构。 在比特币系统开户是个人行为,不需要任何人的批准,极其简单。 其本质是创建一对公钥和私钥(public key, private key)。 公私钥对来源于非对称加密算法。

在对称加密时代,数据的加解密使用同一个秘钥,但在不可信的环境下传递密钥是不安全的。 因此,非对称加密使用公钥和私钥。 对于A和B两个系统,分别生成两对公钥和私钥,公钥可以随意公开。 如果A要给B发消息,只需要用B的公钥加密发送,B收到密文用自己的私钥解密即可。这样就解决了秘钥的传输问题。 下面是一个简单的基于python的非对称加密消息传递

import rsa
# 生成一个公私钥对
newkeys_a = rsa.newkeys(1024)
public_key_a = newkeys_a[0]
private_key_a = newkeys_a[1]
# 生成一个公私钥对
newkeys_b = rsa.newkeys(1024)
public_key_b = newkeys_b[0]
private_key_b = newkeys_b[1]
# A 对 B 发送消息
a2b = "you are pig!!!"
# A 使用 B 的公钥加密
a2b_encrypt = rsa.encrypt(a2b.encode(), public_key_b)
print(f"a 发送密文到 b,密文是:{a2b_encrypt}")
# B 使用自己的私钥解密
a2b_decode = rsa.decrypt(a2b_encrypt, private_key_b).decode()
print(f"b 收到的消息解密后是:{a2b_decode}")

因此,在比特币系统开户只需要在本地生成一对公私钥即可。 公钥相当于银行账户,私钥相当于账户秘钥。 当交易发生时,只需要知道对方的公钥即可。但是这里就会出现问题。 如果A向B发起一笔交易比特币密码学原理,并在区块链系统中公开,如何验证这笔交易确实是A发起的,而不是他人伪造的虚假交易。 这就需要使用非对称加密的第二个功能——签名

2.2 签名

与非对称加密传输相反,签名是用个人私钥加密,区块链上的其他人使用“我”公开的公钥进行签名,验证消息是否是“我”发出的。 下面是一个简单的基于python的签名

import rsa
# 生成一个公私钥对
newkeys_a = rsa.newkeys(1024)
public_key_a = newkeys_a[0]
private_key_a = newkeys_a[1]
# 生成一个公私钥对
newkeys_b = rsa.newkeys(1024)
public_key_b = newkeys_b[0]
private_key_b = newkeys_b[1]
# A 发起交易
trade = "我要向全世界每个人捐款十亿".encode()
# A 对本消息签名
sign = rsa.sign(trade, private_key_a, "SHA-256")
# B 来验证这个签名的合法性
try:
    print(f"使用B的公钥验证是否合法:{rsa.verify(trade, sign, public_key_b)}")
except:
    print("使用B的公钥验证不合法")
try:
    print(f"使用A的公钥验证是否合法:{rsa.verify(trade, sign, public_key_a)}")
except:
    print("使用A的公钥验证不合法")

比特币中通常哈希和签名一起使用,先对一条消息取哈希,然后对哈希值进行签名