本文为个人整理笔记,知识点来源于北京大学肖臻老师的《区块链技术与应用》公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=search&seid=11990345748014503507&spm_id_from=333.337.0.0

BTC-密码学原理


比特币称为加密货币(crypto-currency),但实际上加密货币是不加密的,区块链上所有的交易是公开的。

比特币主要用到了密码学中的两个功能:哈希函数和签名。

一、哈希函数(cryptographic hash function)


密码学中,哈希函数有两个重要性质:哈希碰撞和hiding

1、哈希碰撞(collision resistance)

   x≠y,H(x)=H(y)

哈希碰撞指的是不同的输入,得到的哈希值是相同的。

哈希碰撞理论上是不可避免的,因为输入空间是远远大于输出空间的。比如现在给定256位的哈希值,那么我们的输出空间为2^256,输出空间是无限大的。但是没有什么高效的办法可以人为地输入不同值,使得获取的哈希值是一样的。只有一种蛮力的方式,brute-force,遍历所有输入范围去获取。

理论上是无法证明哈希函数具有哈希碰撞的性质,只是通过实践发现哈希函数发现不了人为制造哈希碰撞的方法。当然也有例外,目前MD5已经被破解了,存在可人为制造哈希碰撞的方法。

哈希碰撞这个性质的作用:没有办法可以篡改内容,而不被检测出来。比如:一个文件存在某个云存储服务器上,如何判定文件是否被篡改。上传之前,会算一个哈希值存在本地,下载之后再去算一个哈希值,比对之前的值,如果是一样的,则说明文件没有被篡改。

2、hiding

hiding指的是哈希函数的计算是单向的,不可逆的。X→H(X),输入X,可以获取哈希值H(X),但是通过H(X)是推不出输入值x的。除非用穷举的方式,所以成立的前提是输入的空间要足够得大,且取值概率是均等,则难以破解。

结合哈希碰撞的性质,可以实现digital commitment,也可以称为digital equivalent of a sealed envelope。现实生活中,可以理解为:预测可能影响结果,比如股市走向,大v预测走向,可能引领一堆人去买,也可能导致有人趁机做套。所以预测结果是不可提前公开的。那么,如何验证哈希值正确与否?需要一个第三方公证机构,事先保管好哈希值。

常用的方法是输入+一个随机数,再去取哈希。

3、Puzzle friendly

除了密码学要求的两个性质以外,比特币中还要求哈希函数的另一个性质,叫做Puzzle friendly。是指哈希值计算的事先是不可预算的,看着输入是看不出来输出的,即无法人为地输入使得哈希值在指定的某一个区间内。

后面会讲到比特币挖矿,挖矿就是找到一个随机数nonce,nonce会跟区块块头的其他信息一起作为输入,得到一个哈希值,使其小于等于指定的目标值target。挖矿的过程就是一直不停地去试各种随机数,使其输出的哈希值在既定范围内。挖矿很难,验证很容易,验证只需要用挖矿得到的输入值做一次哈希运算,得到的值在既定范围内即可。

  比特币用到的哈希函数是SHA-256(Secure Hash Algorithm),我们前面说的三个性质,SHA-256都是满足的。

二、签名


1、账户管理和加密方式

讲签名之前,需要先讲下比特币系统中的账户管理。

日常生活中,开立账户需要带好自己的证件去银行办理开户,这是一种典型的中心化账户管理。而比特币是去中心化的,不存在银行这样的中心机构,每个用户可以自己在本地开户,创建一个公钥和私钥。用户在本地的公私钥对,就是一个账户。

对称加密:公私钥的概念来源于非对称的加密(asymmetric encryption algorithm)。一开始的加密是对称的,即两个人拥有同一个密钥encyption key,用户A将信息用该密钥加密后发送给用户B,用户B收到信息后使用同一密钥解密。对称加密方式下,密钥的传输是个问题,不能在网络上明文传输,容易泄露。

非对称加密:所以出现了非对称加密,加密用的是公钥,解密用的是私钥。还是之前的例子,用户A给用户B发信息,通过用户B的公钥加密信息。用户B接收到信息后,通过用户B自身的私钥解密。即非对称加密用的是同一个人的公私钥对,这样做的好处是公钥是可以公开的。简单理解,公钥相当于银行账号,私钥相当于银行卡密码,我可以通过私钥去交易。

2、签名

前面说到比特币的信息是公开不加密的,那要公私钥有什么用呢?即用于本段落要说明的签名。

比如A转给B10个比特币,怎么证明是A发起的,而不是别人冒名顶替的呢?发起者A可以用私钥签名,接受者B用发起者A的公钥验证发起人身份。

此外,还存在一个安全问题,公私钥都是自己在本地生成的,有没有可能两个人的公私钥重复了,导致可以盗取他人资产的情况?这种概率理论上是存在的,实际上是微乎其微的,可以忽略不计的。不过比特币计算的每一步需要好的随机源,任何一步没用好的随机源,都可能导致私钥泄露。

区块链技术与应用:02-BTC-密码学原理的更多相关文章

  1. 一、Bitcoin比特币与BlockChain区块链技术

    一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...

  2. 001-Bitcoin比特币与BlockChain区块链技术

    一.比特币历史 2008 年 10 月 31 日,一个网名叫中本聪(英文翻译过来滴)的家伙发布比特币唯一的白皮书:<Bitcoin:A Peer-to-PeerElectronic Cash S ...

  3. 给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识

    给本体ONT技术社区的第一封公开信-涉及到不少区块链技术知识 共识是区块链的核心机制,在一系列的区块链的发展历史当中,PoW/PoS/BFT等系列的共识算法都在各自的应用场景发挥了不同作用.在本体的第 ...

  4. FUNMVP:几张图看懂区块链技术到底是什么?(转载)

    几张图看懂区块链技术到底是什么? 本文转载自:http://www.cnblogs.com/behindman/p/8873191.html “区块链”的概念可以说是异常火爆,好像互联网金融峰会上没人 ...

  5. HyperLedger Fabric 1.4 区块链技术发展(1.3)

    区块链技术发展经历区块链1.0(数字货币).区块链2.0(数字资产与智能合约)和区块链3.0(各种行业分布式应用落地)三个阶段.区块链在应用上分为公有链(PublicBlockChains).联盟链( ...

  6. 区块链技术(一):Truffle开发入门

    以太坊是区块链开发领域最好的编程平台,而truffle是以太坊(Ethereum)最受欢迎的一个开发框架,这是我们第一篇区块链技术文章介绍truffle的原因,实战是最重要的事情,这篇文章不讲原理,只 ...

  7. 如何从零开始学习区块链技术——推荐从以太坊开发DApp开始

    很多人迷惑于区块链和以太坊,不知如何学习,本文简单说了一下学习的一些方法和资源. 一. 以太坊和区块链的关系 从区块链历史上来说,先诞生了比特币,当时并没有区块链这个技术和名词,然后业界从比特币中提取 ...

  8. 区块链技术现状&前景

    炒作周期 Gartner 在 2017 年发布的新兴技术炒作曲线,这张图是去年 8 月发布的,当时估计它们也没料到随后能有那么火,当时区块链在这个位置,其实是已经过了炒作的巅峰期,正在往低谷走的这个阶 ...

  9. 未来-区块链-IBM:IBM 区块链技术开发社区

    ylbtech-未来-区块链-IBM:IBM 区块链技术开发社区 1.返回顶部 1. 开始学习 IBM Blockchain 101:开发人员快速入门指南 这篇快速入门指南适合不熟悉区块链技术,希望快 ...

  10. AngelToken:区块链技术的突破

    科技进步,直接捅破了政治.金融.军事领域所有的玩法,让工业革命以来形成的规则变得一钱不值. 而且,当下的最重要的技术趋势——区块链.Token.AngelToken,正在引导我们走向全面的失控和未知. ...

随机推荐

  1. opencv对图片画框写文字

    业务背景:对图片进行画框后调用排序方法按照"从上到下,从左到右"对已经画的框进行排序.排序方法当前有缺陷,修复后需要验证. 目前有如下信息: 原始图片地址 图片对应的每个框的坐标( ...

  2. 其他2-while+read按行读取文件

    一.三种方法 1.exec读取文件 exec <file sum=0 while read line do cmd done 2. cat读取文件 cat file|while read lin ...

  3. google api 后端打点上报

    https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type ...

  4. NX 二次开发,线性移动uf5943

    #include <uf.h> #include <uf_modl.h> #include <uf_part.h> #include <uf_modl_pri ...

  5. 计算机网络复习小结(3)-IPv4

    IPv4分组 一个IP分组由首部和数据两部分组成,首部前一部分的长度固定,共20B,是所有IP分组必须具有的.在IP数据报首部中有三个关于长度的标记,一个是首部长度,一个是总长度,一个是片偏移,基本单 ...

  6. NGINX+Lua模块编译安装

    NGINX+Lua 环境配置 目录 NGINX+Lua 环境配置 一.环境装备 二.解压安装相应的软件 测试Lua环境 上面都是经过安装的一些坑之后安装完成的,下面是安装过程中出现的坑 一.环境装备 ...

  7. linux基础知识面试题

    Linux 开机启动过程 主机加电自检,加载 BIOS 硬件信息. 读取 MBR 的引导文件(GRUB.LILO). 引导 Linux 内核. 运行第一个进程 init (进程号永远为 1 ). 进入 ...

  8. JS笔记(二):数据类型

    镇楼图 Pixiv:torino 三.数据类型 原始类型 原始类型像是string.symbol.number之类的都只能存储原子值,而不能像对象一样随意扩展.但是为了提供额外功能,采取了轻量的对象包 ...

  9. 微信端手机跨域上传图片偶尔跑进error

    如题.我这两天被这个问题搞得焦头烂额.其他端都没问题,就微信端的有问题,就是因为通过ajax上传图片的时候,设置了 async: false,然后客户用了测试总是跑进error,客户问什么情况,我也找 ...

  10. 常用功能系列---【JWT生成Token实现接口登录认证方案思路】

    JWT生成Token实现接口登录认证方案思路 方案一(双token实现无感刷新) 在token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录,跳转至登录页面. 但是 ...