主页 > imtoken钱包下载苹果 > 《区块链技术与应用》课堂笔记(二):密码学原理

《区块链技术与应用》课堂笔记(二):密码学原理

imtoken钱包下载苹果 2023-03-16 07:35:05

比特币被称为加密货币(crypto-currency)

区块链上的内容是公开的,包括区块地址和转账金额。

比特币在密码学中主要使用了两个函数:1.哈希 2.签名

1、密码学中使用的散列函数称为密码散列函数:

它有两个重要的属性:

①抗碰撞(这里指hash碰撞)抗性:比如x≠y H(x)=H(y) 两个不同的输入,但是输出是相等的,称为hash碰撞。 这是不可避免的,因为输入空间总是大于输出空间。 给定 x,除非通过蛮力,否则很难找到 y。

该属性的作用:寻求消息的摘要

比如消息取m,m的hash值为H(m)=digest 如果有人想篡改m的值,而H(m)不变,那是做不到的。

哈希冲突无法人为制造或验证,而是基于实践经验。

抗碰撞性可用于消化一条信息以检测对信息的篡改。 因为如果改变了这些信息的内容,那么hash值也会改变,没有什么特殊的手段可以在不改变它的hash值的情况下修改信息的内容。 例如,使用云存储时,在上传文件前计算一个哈希值,存储在本地。 下载文件后,计算哈希值,与本地记录的哈希值进行比较。 如果相同,则说明下载的内容与之前相同。 内容未被篡改。

没有哈希函数可以在数学上证明是抗碰撞的。 这个性质只是根据实践经验得出的,也就是说,那些满足这个性质的散列函数已经很久没有找到人为制造散列冲突的方法了。 将它们视为抗碰撞性。

有些函数之前被认为是抗碰撞的,但是后来人们找到了人为制造散列碰撞的方法,比如MD5,所以不再安全了。

② 隐藏哈希函数的计算过程是单向的,不可逆的。 (x不能从H(x)推导出来) 隐藏属性的前提是输入空间足够大,分布比较均匀。 如果不够大,一般在x后面拼接一个随机数,比如H(x||nonce)。

该属性的作用:

结合防碰撞特性(collision resistance)实现数字承诺(也称为密封信封的数字等效)

将预测结果作为输入x,计算一个哈希值,并公布哈希值。 隐藏让人们知道哈希值但不知道预测值,最后发布x。 由于抗碰撞的特性,预测的结果是不可篡改的。

在这里,肖老师举了一个真实的例子来解释密封的信封。 如果一个人声称他可以预测股票涨停板比特币钥匙密码掉了,他如何证明呢? 如果让他提前公布他的“预测”——股票明天涨停,然后明天去股市,那么他公布的信息本身就会影响股票的涨停。 如果是在股价涨停之后公布,那么大家就会怀疑他是不是篡改了自己的“预测”。

这里的密封信封就是解决这个问题的方法。 让这个人先把预测结果写在纸上比特币钥匙密码掉了,装进信封封好,然后交给第三方公证机构保管。 第二天股市收盘后,让公证机构检查信封是否完好,打开信封,查看纸上的预测结果与实际涨停板是否一致。

在这个问题上使用数字承诺的方法是为预测结果计算一个哈希值,然后发布哈希值。 由于隐藏的特性,每个人都无法通过哈希值知道预测结果。 预测结果将于次日收市后公布。 由于抗碰撞的性质,预测结果没有被篡改,否则与公布的哈希值不匹配。

除了密码学所需的这两个属性外,比特币中使用的哈希函数还有第三个属性:

③puzzle friendly是指hash值的budget是事先不可预测的,即无法仅通过查看输入就知道计算出的hash值可能是什么样子(具有什么特征)。

也就是说,例如,如果计算出的哈希值落在某个范围内,则没有特定的构造输入的方法。 再比如,要计算的hash值前面有k个连续的0,没有具体的输入构造方式。 甚至无法知道什么样的输入更有可能得到具有特定特征的哈希值。 要想得到这种输入,只能一一尝试。 没有捷径。

比特币挖矿的过程其实就是找一个nonce。 请注意,nonce 不是块头以外的东西。 它是域之一,但可以手动设置。 挖矿过程就是不断尝试nonce,使得整个区块头的hash小于等于目标。 nonce结合区块头中的其他信息作为输入,得到的哈希值应小于或等于指定的目标预值:H(block header)≤target

区块头指的是区块头。 区块头中有很多字段。 其中一个字段是我们可以设置的随机数 nonce。 挖矿过程就是不断尝试随机数,使得区块头在取哈希后落在指定的范围内。

Puzzle Friendly 意味着在挖矿过程中没有捷径可走。 为了使输出值落在规定的范围内,只能逐一尝试。 所以这个过程也可以作为工作量证明。

这个puzzle friendly跟正面防撞有些关系,但又不完全一样。 那就是不可能人为地制造哈希碰撞,这就是不可能人为地构造一个符合特定特征的哈希值。

挖矿难,验证容易。 (难解,但容易验证)

虽然很难找到符合要求的nonce,但是一旦找到并发布,其他人就很容易验证这个nonce是否符合要求。 只需计算哈希值并将其与目标进行比较即可。 .

比特币中使用的哈希函数称为 SHA-256(安全哈希算法),它满足以上三个性质。

在比特币系统中开立账户:

在本地创建一个公私钥对(公钥,私钥),就是一个账号。 公私钥对来自非对称加密算法。

解释:

两个人之间的信息交换可以使用加密密钥。 A将信息加密后发送给B,B收到后用密钥解密。 因为加密和解密使用同一个密钥,所以称为对称加密。 . 前提是有一个通道可以安全地将密钥分发给通信双方。 因此,对称加密的缺点是密钥分发不方便,因为在网络上很容易被窃听。 非对称密钥使用一对密钥而不是一个。 公钥用于加密,私钥用于解密。 加密和解密都使用接收方的公钥和私钥。 公钥不需要保密,私钥需要保密,但是私钥只需要保存在本地,不需要传递给对方。 公钥相当于银行帐号。 其他人只需要知道公钥就可以转账。 私钥相当于账户密码。 知道私钥就可以把账户里的钱转走。

公钥和私钥用于签名。 如果A想转10个比特币给B,A把这笔交易放到区块链上,别人怎么知道这笔交易是A发起的呢? 这就需要A用自己的私钥对交易进行签名,其他人接收。 收到这笔交易后,用A的公钥验证签名。 私钥用于签名,公钥用于验证,还是同一个人。 创建一个账户生成相同的公私钥的可能性很小,所以创建大量账户来盗取别人的账户是不可行的。

公钥和私钥对的复制

由于公钥和私钥对总是在本地生成,如果有重复怎么办?

比如生成大量的公钥和私钥对,然后比较生成的公钥和区块链上已有的公钥是否相同。 如果相同,则可以用对应的私钥将账户中的钱转走。

这种方法理论上可行,但实际上做不到,因为产生重复的公私钥对的概率很小,可以忽略不计。 迄今为止,还没有使用这种方法进行成功​​攻击的先例。

随机性的良好来源

生成公钥和私钥的过程是随机的,但是需要选择一个好的随机源,否则前面的分析是不成立的(不够小,生成重复的公私钥对)。 我们假设在生成公钥和私钥时有很好的随机性来源。 公钥和私钥是随机生成的。 如果随机源不好,有可能生成相同的公钥和私钥。 比特币中使用的签名算法不仅在生成公钥和私钥时需要一个好的随机源,而且在每次签名时都要有一个好的随机源。 只要用于签名的随机源不好,就有可能泄露私钥。