比特币中用到的密码学功能【区块链学习笔记1】

想要转到web3,这次学习区块链看的课是北大肖臻老师的公开课。

比特币又称是加密货币crypto-currency,但其实是不加密的,全是公开的。比特币中用到的密码学中HASH和签名。

1. HASH

密码学中的哈希:cryptographic hash function

三个重要的性质

collision resistance (collision free)

该性质的作用:用来对一个message求digest(取数据摘要)【密码学相关内容,需要进行补充】 ,得到的哈希值即digest,用来检测这个message是否发生篡改,因为找不到一个H(m')=H(m),即没有办法篡改内容而又不被检测出来。(比如我的名字是柯意,全国有11个叫柯意的人,也就是hash碰撞是客观存在的。输入我的身份证号111222199608260000可以得到我的名字,但凡改掉身份证号中的其中一个数字,都得不到相同的名字,但是如果想改掉身份号又要得到同一个名字:柯意,就要在14亿人口的身份证号里进行尝试,概率是14亿分之11,微乎其微!)

在密码学中,"抗碰撞性"(collision resistance)是指一种理想的属性,用于描述加密哈希函数的安全性。一个具有抗碰撞性的哈希函数能够极大地降低找到两个不同输入,但却产生相同哈希输出的可能性。这是因为在理想情况下,任意两个不同的输入应该产生不同的哈希值。抗碰撞性是加密哈希函数重要的安全特性之一,对于防止数据篡改和确保信息完整性至关重要
并不是不发生哈希碰撞,但是找不到一个H(m')=H(m)

一般来说哈希碰撞是不可避免的,因为输入空间是远远大于输出空间的

比如说,有一个256位的哈希池,那么输出空间就是2的256次方(所有哈希值),但是输入空间是无限大的,有任意多种输入的可能性。按照鸽巢原理(又称为抽屉原理,它是组合数学中一个重要的原理),必然会出现两个输入被映射到同一个输出的情况。

举例:

如果要上传文件到云存储平台,使用的时候再下载,怎么保证下载的时候,和上传的时候是同一份文件?

可以在上传的时候先用这份文件算它的哈希值,将其存在本地,和下载的时候的进行比对。
注:没有哪个Hash函数可以在数学上验证他是collision resistance的,只能依靠实践经验。

MD5:原先很安全,但是现在已经知道怎么人为地制造Hash碰撞

hiding

即:密码学的计算过程是单向的,是不可逆的

从哈希值无法反推"输入值",这个哈希值没有泄漏有关输入的任何信息。成立的前提是:1.输入的空间足够大,输入的分布要比较均匀,各种取值的可能性是差不多的。无法暴力解开(brute-force)。

这个特性可以结合collision resistance用来实现:digital commitment(又称为 ditgital equivalent of a sealed envelope)

案例:对股市进行预测,怎么证明预测是否准确又不需要把预测结果提前公布而影响股票市场:提前把结果放到一个封好的信封中。--->不提前公布预测结果,可以提前公布预测结果的hash值。

x->H(x)

(这个例子中,股票市场作为输入空间,是不够大的,可以把"预测结果"加入一个随机数(加盐),将其整个取哈希。

H(x||nonce),nonce是随机数,保证这样拼接之后,输入是足够随机的,分布也是足够均匀的。)

puzzle friendly

hash的计算是事先不可预测的。光看这个输入,很难知道他这个hash值是什么。所以想要你算出来的hash值是落在某个范围之内的。那没有什么好办法你只能一个一个去试。看那个输入算出来是恰好落在要求的那个范围之内。

比特币是区块链,区块链就是一个一个区块组成的**++链表++** ,每一个区块都有一个块头(block header), block header中有很多的域。 其中有一个域是我们可以设置的随机数nonce。挖矿实际上就是找一个nonce(随机数),这个nonce跟区块的块头里的其他信息合在一起,整个block header作为输入,取出一个哈希来,这个哈希值要小于等于某个指定的目标阈值 。(整个的输出空间outspace。要求算出来的hash值只有前面这一点是合法的。这个是target space。)

H(block header) ≤ target.

puzzle friendly这个性质是指挖矿的过程没有捷径。只能够不停的去试大量的nonce,才能找到符合要求的解。因此这个过程才可以用来作为工作量证明, 叫做proof of work。 (挖到矿了找到了符合要求的的nonce,一定是因为你做了大量的工作。因为没有别的捷径。)

注:虽然挖矿的过程。需要很多的工作量,才能找到一个符合要求的nonce。但是一旦有人找到了这样一个nonce。发布出去之后,其他人要验证这个nonce是不是符合要求。 是很容易的,只要算一次hash就行了。这个nonce作为header的一部分,算一次hash值 看他是不是小于等于这个目标的阈值 。挖矿很难验证很容易。这个性质叫做difficult to solve,but easy to verify。我们设计这种mining puzzle的之后要注意这个性质。

比特币中用的hash函数是SHA-256 ,这个sha的意思是,secure hash algorithm.我们说的这三个性质它都是满足的。

2.签名

比特币系统中的账户管理:

日常生活中开个账户--->带上证件去银行办理开户手续--->中心化系统中的账户管理方式。

比特币是去中心化的,没有银行之类的这类机构。那怎么开账户呢?

每个用户自己决定开户。不需要任何人批准。

开户的过程:创立一个公钥和私钥的对 pair(public key, private key)。在本地创立一个公私钥对,就是一个账户。这个就在比特币中代表了一个账户。

公私钥这个概念是来自非对称加密这个体系,叫做asymmetric encryption algorithm 。最早的加密体系是对称的,叫做symmetric encryption algorithm

比如说两个人之间要进行通信,我要把某个信息发给你。但是这个通信的网络是有可能被窃听的。那怎么办呢。咱们两个事先商量一个密钥。一个叫做encyption key。我把这个信息加密之后发送给你。你收到之后再用这个密钥解密。因为这个加密和解密用的是同一个密钥。所以这个叫做对称的加密体系。他这个前提是假设。有某种安全的渠道。能够把这个密钥分发给通讯的双方。因为你显然的不能把这个密钥在网络上以明文的形式传输。我们假设网络本身就是不安全的。有可能被窃听,这个就是对称加密体系的一个弱点。密钥的分发不是很方便。解决这个问题非对称加密体系就提出来我们不是用一个密钥,而是用一对密钥。有一个公钥还有一个私钥。加密用的是公钥,解密用的是私钥,比如说我要把一个信息传给你,我用你的公钥给这个信息加密,你收到之后再用你的私钥解密。得到原来的信息。 大家注意这个加密和解密用的是同一个人的公钥和私钥。都是这个接收方的公钥和私钥。

这有什么好处呢?公钥是不用保密的,加密用的公钥是不用保密的,你可以告诉所有的人。有的人他的homepage就列出来他的pbk: public key。大家都可以知道。私钥是要保密的,解密是要用私钥解密的, 但是私钥只要保存在本地就行了,不用传给对方。就给你通讯的那个人不需要知道你的私钥。他是用你的公钥加密的。 你要回复他的话你用他的公钥加密。都不需要知道对方的私钥。这就解决了对称加密体系中密钥分发的不方便的问题。

比特币系统中呢,你要创建一个账户。就在本地产生一对公私钥。这个公钥就相当于你的银行账号。别人要给你转账,只要知道你的公钥就行了。这个私钥相当于你的账户密码。知道这个私钥就可以把这个账户上的钱转走。那么有一个问题我们前面说比特币系统是不加密的。他叫加密货币他其实不是加密的。 信息都是公开的,那我要这个公钥和私钥干什么呢?实际上用来做签名。

比如说我要转10个比特币给你。然后我这个交易发布到区块链上,别人怎么知道这个交易确定是我发起的呢?会不会是有人冒名顶替。偷偷把我帐上的钱转走呢?这就需要我在发布这个交易的时候要用我自己的私钥对这个交易进行签名 ,那其他人收到这个交易 之后呢,在用我的公钥去验证 这个签名的正确行。签名用的是私钥,验证签名用的是这个人的公钥

仍然都是同一个人。既然每一个人都是独立的产生账户。本地独立的生成公私钥对。不需要任何人相等,那万一两个人生成的公私钥对相同。怎么办?比如说有人想偷取比特币,一种方法是不停的产生公私钥。然后对比一下我产生的公钥。跟区块链上某个已有的公钥是不是相同。如果是一样的话,就可以用私钥把这个帐上钱给偷走。这种攻击方法从理论上说好像是可以的。但是实际当中是不可行的。比如说你是256位的hash值的话。产生相同的公私钥的可能性是微乎其微的。比如你有一台超级计算机每天产生大量的公私钥对。出现来两个人的公私钥对相同的情况概率也是可以忽略不计的。这个概率比地球爆炸的概率还要小。++到目前为止还没有发现那个人用这种方法。能够攻击成功的先例。++ 这里要强调一点,我们这里假设。产生公私钥的时候有一个好的随机源。这叫做a good source of randomness。生成公私钥的过程显然是随机的。如果选取的随机源不好的话,那么前面的分析就不存在了。就会出现两个人的公私钥对生成的是一样的。比特币中用的签名算法不光是,生成公私钥的时候要有好的随机源。之后每一次签名的时候也要有好的随机源。只要有一次签名用的随机源不好的话,就有可能泄露私钥。然后就全完了。这一点大家要一定注意。

我们讲了两个功能一个是hash,一个签名。 这两个功能是可以结合起来使用的。比特币系统中一般是先对一个消息求一个hash,然后在对这个hash值签名。

相关推荐
并不会40 分钟前
常见 CSS 选择器用法
前端·css·学习·html·前端开发·css选择器
龙鸣丿1 小时前
Linux基础学习笔记
linux·笔记·学习
Nu11PointerException3 小时前
JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习
笔记·学习
芯盾时代4 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
@小博的博客6 小时前
C++初阶学习第十弹——深入讲解vector的迭代器失效
数据结构·c++·学习
南宫生7 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步8 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
love_and_hope8 小时前
Pytorch学习--神经网络--搭建小实战(手撕CIFAR 10 model structure)和 Sequential 的使用
人工智能·pytorch·python·深度学习·学习
Chef_Chen8 小时前
从0开始学习机器学习--Day14--如何优化神经网络的代价函数
神经网络·学习·机器学习
芊寻(嵌入式)8 小时前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习