本文为个人整理笔记,知识点来源于北京大学肖臻老师的《区块链技术与应用》公开课视频: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. Software--电商平台系统--P1 需求分析

    2018-01-11  13:58:43 电商平台 需求 1. 网站的页面展示 页面的布局: Product Catalog (商品目录浏览功能): 首页显示"置顶" 商品:   ...

  2. Unity编辑器脚本

    1.给选中物体添加碰撞盒 这个是给子物体添加碰撞盒 (根据需求可以自己修改)  脚本放在Editor文件夹下   需要手动选择你需要添加碰撞盒的物体 using System.Collections; ...

  3. 20211306丁文博 python技能树、CSDN MarkDown编辑器

    测评内容: python技能树.CSDN MarkDown编辑器 指导老师:王志强 班级:2113 学号:20211306 姓名:丁文博 https://blog.csdn.net/weixin_62 ...

  4. libevent学习之入门--[02]从hello-world开始

    系列文章回顾 libevent学习之入门--[01]概述与安装 上一节介绍了libevent的下载和编译,从这节开始,我会从我学习的角度逐步探索libevent的源码,慢慢揭开它的神秘面纱. 面对几十 ...

  5. IDEA-mybatis逆向工程使用

    首先我们需要安装mybatis逆向工程插件mybatis Generator: 然后在pom.xml文件中添加逆向工程插件: <!--mybatis逆向工程插件--> <plugin ...

  6. Sharp7与S7NetPlus 性能测试

    介绍 ​ Sharp7和都S7NetPlus是纯C#实现的基于以太网与S7系列的西门子PLC通讯的开源库.都支持.net core 跨平台可以部署在linxu, docker,windwos 中. 测 ...

  7. java pta第三次阶段性总结

    一.前言 这是这学期最后一次总结,这三次的pta大作业也是最后一次,这几次大作业主要写了电信计费系统的主要功能,第一次大作业是座机计费功能,第二次大作业是手机计费功能,第三次大作业是短信计费的功能.这 ...

  8. 【python】第二模块 步骤一 第二课、数据库表的相关操作

    第二课.数据库表的相关操作 一.课程介绍 1.1 课程介绍 学习目标 管理逻辑库和数据表 创建.删除.修改逻辑库和数据表 了解常用的数据类型和约束 字符串.整数.浮点数.精确数字.日期.枚举.主要约束 ...

  9. MySql 错误:建表时出错1067 - Invalid default value for 'id'

    问题描述: 建表时报错无效的默认值: CREATE TABLE `product`( `id` INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ...

  10. 库已安装但找不到ttkbootstrap库

    cmd里装,弹提示Requirement already satisfied pip install --target=F:\Python37\lib ttkbootstrap https://blo ...