区块链-02-BTC-密码学原理

2023-10-27

区块链与密码学

以比特币为例子,比特币作为区块链的经典应用,其本质是一种加密货币, 但实际上,比特币是不加密的,区块链上的所有信息都是公开的,包括账户的地址、交易记录、金额等等。比特币主要用到了密码学中的2个功能,一个是哈希,另一个是签名;这也是区块链中涉及到密码学部分的主要功能。

一、哈希(散列)函数

哈希函数是可以用来将任意大小的数据映射到固定大小值的任何函数。哈希函数返回的值称为哈希值、哈希码、摘要或简单的哈希。这些值用于索引一个固定大小的表,称为哈希表。使用哈希函数为哈希表建立索引称为哈希或分散存储寻址。

二、密码散列函数(Cryptographic hash function)

密码散列函数(英语:Cryptographic hash function),又译为加密散列函数、密码散列函数、加密散列函数,是散列函数的一种。它被认为是一种单向函数,也就是说极其难以由散列函数输出的结果,回推输入的资料是什么。这样的单向函数被称为“现代密码学的驮马”


那么区块链中的哈希函数主要是密码散列函数,它有几个重要的性质:

  1. Collision resistance(抗碰撞性)
  2. Hiding(不可逆)
  3. puzzle friendly (仅比特币需满足)

Collision resistance

抗碰撞性的意思就是对于一个哈希函数H,2个输入a,b,你很难找到两个不同的输入使得哈希后的输出值相同
H ( a ) = H ( b ) , w h e r e a ≠ b H(a)=H(b),where a≠b H(a)=H(b),wherea=b
两个不同的输入输出的值是相同的,一般来说,哈希碰撞是无可避免的,因为你的输入空间其实远远大于输出空间,假如我们的哈希函数输出值控制在256个bit位,那么它的输出空间有2256种情况,理论上,如果进行2256+1次计算,则能达到哈希碰撞,也就是能找到两个不同的输入使得哈希值相同。但是这样的计算太庞大,很难实现。

利用抗碰撞性,我们可以拿来检测数据是否被篡改,假如我们有一个数据m,它的哈希值H(m),也把它叫做’message digest’,如果有人改了m,那么哈希值一定会发生变化。因为抗碰撞性,意为着你无法篡改内容而又不被发现。
Collision resistance在数学上无法被证明,只能靠实际经验获得,但有一些哈希函数如MD5已经被找到一种方法能够人为的构造哈希碰撞。

Hiding

hiding的意思是哈希过程是不可逆的,你知道哈希值,并不能反推出哈希函数的输入值具体是多少。但这个条件成立的前提是
输入空间足够大:如果只有几个输入,那就很没意思了
输入空间均匀分布:即使有很大的输入空间,但如果某几个输入值被选中的概率很大,那就意味着有很大的概率反推输入值

digital commitment

用前面两个性质可以实现digital commitment,这也叫digital equivalent of a sealed envelop。
举一个现实生活的例子。如一个人说自己能预测股票涨停,那么如何证明呢?如果让他提前公布自己的“预测”——明天股票的涨停,然后明天再去看股市,那么他公布的信息本身就会影响到股票涨停。如果在股票涨停之后再公布,那么大家会怀疑他有没有篡改自己的“预测”。而这里sealed envelop也就是解决这个问题的办法,让这个人先把预测结果写在纸上,放进信封里封好,然后交给第三方的公证机构保管。第二天股市收盘后,再让公证机构检查信封完好、打开信封、查看纸上的预测结果和实际涨停是不是一致即可。
而使用digital commitment在这个问题上的做法是把预测结果计算出一个哈希值,然后把哈希值公布出去,因为有hiding的性质,所以大家没法通过哈希值知道预测结果。第二天收盘后公布预测结果,因为有collision resistance的性质,所以预测结果是没有篡改过的,否则和公布的哈希值就对不上了。在这个问题里,例如预测的是“涨的股票的名字”,那么因为股票一共就那么多支,输入空间并不是足够大,这样就不满足hiding的性质(大家可以遍历所有的股票取哈希去知道预测的是哪支股票涨)。这时候的解决办法可以是在输入后面加上一个随机数nonce,增大输入空间和输入的概率随机性,使得分布足够的均匀:
H ( x ∣ ∣ n o n c e ) o r H ( x ∣ ∣ n o n c e ) H(x||nonce) or H(x∣∣nonce) H(x∣∣nonce)orH(x∣∣nonce)
在挖矿的时候,经常也是去算这个nonce。

puzzle friendly

除了前面两个性质,比特币中的哈希函数还要满足puzzle friendly这个性质。该性质要求哈希值计算事先不可预测,仅仅根据输入很难预测出输出。例如:我们需要一个哈希值,存在于某一个范围内,只能通过不停运算查找出来。比如说,我们想得到一个哈希值
这个哈希值前面K个位置都是0,总共是256位。
00000... X X X X X X 00000...XXXXXX 00000...XXXXXX
那么什么样的输入可以得到这样的输出?答案很难得到。
该性质保证了比特币系统中,只能通过“挖矿”获得比特币。也就是说,该性质保证了工作量证明(POW)机制可以运行下去【“挖矿难,但验证易”】。在比特币系统中采用SHA-256哈希函数。比特币挖矿的过程就是去找一个随机数nonce,这个nonce和区块的块头里的其它信息合并在一起作为输入,取哈希值,所得哈希值要小于等于某个指定的阈值:
H ( b l o c k , h e a d e r ) ≤ t a r g e t H(block,header)≤target H(block,header)target
注意,nonce不是区块块头以外的东西,它是其中的一个域,但是可以人为设置。挖矿的过程就是不停的去试nonce,使得整个块头部分取哈希小于等于target。有了puzzle friendly这个性质,使得比特币挖矿的过程没有捷径可言,只能不停的去试大量的nonce才能找到符合要求的解,所以才能用来用作工作量证明(proof of work,POW)。这个puzzle friendly和最前面的collision resistance有一定的联系,但不是完全一样。那个是无法去人为制造哈希碰撞,而这个是无法去人为构造符合特定特征的哈希值。
虽然找到一个符合要求的nonce很难,但一旦找到之后,将它发布出去以后,其他人要验证这个nonce是不是符合要求是很容易的,只要算一次哈希值再和target比较一下就可以了。

三、签名

比特币中账户管理

在第三方中心化系统中,账户开通依赖于第三方。但去中心化的比特币系统中,很明显不能进行“申请账户”。在比特币系统中,申请账户是用户自己来处理的,即自己创建一个公钥-私钥对。
公钥和私钥的应用保证了“签名”的应用。当在比特币网络中进行转账时,通过“签名”可以明确是由哪个账户转出的,从而防止不良分子对其他账户比特币的盗取。在发布交易时,通过自己私钥签名,其他人可以根据公钥进行验证,从而保证该交易由自己发起。也就是说,只有拥有私钥,才能将该账户中的比特币转走。在比特币系统中,很难通过生成大量公私钥对来获取他人私钥

两种加密体系

对称加密体系

最早的加密体系是对称的加密体系(symmetric encryption algorithm)。如两方进行通信,商量好一个密钥(encryption key),发送方使用密钥加密,接收方使用密钥解密。因为加密解密用的是用一个密钥,所以这是对称的加密体系。这种方式假设了存在某种安全的渠道,能够把密钥分发给通讯双方,这是对称加密体系的一个弱点。

非对称加密体系

非对称的加密体系(asymmetric encryption algorithm)不再像对称加密那样使用一个密钥,而是使用一对密钥,即公钥和私钥,加密用的是公钥,解密用的是私钥。例如A要发信息给B,那么使用B的公钥对信息进行加密,B收到信息后用B自己的私钥进行解密就能得到原来的信息。也就是说加密和解密用的都是接收方的公钥和私钥。这样做的好处是公钥是不用保密的,可以告诉所有人,有的人主页上就有PGP public key。只有私钥是要保密的,但是私钥只需要保存在本地就可以了,不用传递给任何人,这样就避免了传输密钥过程不安全的问题。要回复对方再用对方的公钥加密,始终都不需要知道其他人的私钥,这就解决了对称加密体系中密钥分发不安全(不方便)的问题。

比特币中的签名

加密货币是不加密的,前面学的非对称加密的公钥和私钥在比特币系统中就是用来做签名的。
比如A要向B转账,即A在区块链上发起一个交易,所有交易是公开的,但大家怎么判断这个交易确实是A发起的,而不是别人冒名顶替的,这就需要A用户用自己的私钥对交易进行签名。其他用户拿到签名和交易信息后,可以用A的公钥去验证签名的正确性。签名用的是私钥,验证签名用的是公钥。都是同一个用户的公钥和私钥。生成公钥私钥的过程是随机的,但要求选取一个好的随机源,否则前面的分析就不成立了(就有不足够小的可能生成重复的公钥私钥对)。比特币中使用的签名算法不仅在生成公钥私钥对时有好的随机源,在之后每次签名的时候也要有好的随机源。如果签名时使用的随机源不好,就有可能泄露私钥。
比特币系统中的签名,一般是先对message取一个哈希,然后再对哈希值签名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

区块链-02-BTC-密码学原理 的相关文章

  • 国产免费虚拟化OVM与 OpenStack对比

    OpenStack作为一款全球化的开源软件 需要丰富而强大的技术团队进行深度开发与维护 OVM作为国产免费的虚拟化软件 有开箱即用的优势 不需要二次投入太多成本 下面对两个产品的深度对比 OVM是开箱即用的一站式解决方案 OpenStack
  • Gitee码云如何邀请合作者加入

    问题 在创建了项目之后 想邀请别人加入 始终找不到邀请的入口 解决方案 1 选中项目 2 点击管理 3 项目成员管理 开发者 添加项目成员 邀请用户 4 会有三种不同的邀请方式 随意邀请了
  • 蓝桥杯乘积尾0(分析)

    1 问题描述 如下的10行数据 每行有10个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3
  • Error:java: 错误: 不支持发行版本 5 解决方法(详细)

    使用配置 编译器 idea JDK jdk 13 注意 文章篇幅有点长 若省时间可直接看方法二或者方法三 Error java 错误 不支持发行版本 5 出现原因 本地配置jdk和idea默认的jdk不匹配 方法一 File gt Proj
  • vue脚手架vue-cli的卸载和安装

    若电脑之前已经安装过vue cli了 但是版本过低 比方说当前vue cli的版本为2 9 6 然后我想升级到vue cli的最新版本4 0 5 则需要将旧版本卸载 然后再重新安装 vue cli vue cli vue3 0之前版本使用此
  • PHP对接口执行效率慢的优化

    PHP对接口执行效率慢的优化 造成执行效率低的原因可以由很多方面找原因 从代码层面 代码质量低 执行效率也会有很大影响的 从硬件方面 服务器配置低 服务器配置是基础 这个跑不动肯定慢 从数据量方面 查询数据量过多 sql语句过于繁杂 执行缓
  • 安装yarn

    Install via npm It is recommended to install Yarn through the npm package manager which comes bundled with Node js when
  • c字符串函数sprintf()和snprintf()详解

    sprintf 是个变参函数 定义格式如下 int sprintf char buffer const char format argument 精华显然在于第二个字符串 格式化字符串 1 格式化数字字符串 sprintf最常见的应用之一莫
  • React中如何使用refs

    ref是React中的一种属性 当render函数返回某个组件的实例时 可以给render中的某个虚拟DOM节点添加一个ref属性 如下面的代码所示 html view plain copy print
  • Node学习1

    Node 加载模块 加载内置模块和第三方模块直接require 名字 自定义模块需要加路径 require 加载模块时候会自 动调用被加载模块代码 require永远以module export所指向的对象为准 模块作用域 和函数作用域类似
  • 解决VScode使用git报错:Git: Bad status code: 500

    VS CODE GIT 500 问题处理 pudn com相关错误的处理链接博客 作为记录
  • C++ STL各标准容器使用手册

    原文 http blog csdn net nohackcc article details 8900017 1 vector 内部实现 数组 就是没有固定大小的数组 vector直接翻译是向量的意思 支持操作 begin 取首个元素 返回
  • 第10课 微信小程序数据存储(同步缓存、异步缓存,本地读取缓存):

    第10课 微信小程序数据存储 同 异步缓存 本地读取缓存 同步缓存 wx setStorageSync key value 异步缓存 wx setStorage Object object 同步删除缓存 wx removeStorageSy
  • java开发:java多线程(三):lock方式实现线程同步机制

    java多线程系列文章 java多线程 一 synchronized 对象锁和类锁的区别 java多线程 二 wait sleep join 和yield 区别 这章博客讲解lock如何实现同步机制 比较和synchronized 的区别
  • unity项目过程中本菜新遇到的问题和解决方案

    试出了奇怪的效果 还挺好看 canvas background text 在unity中打开的vs编辑器中没有代码提示 流星曳尾 博客园 这里我一开始不知道为啥text显示不出来 调成screen size才发现 是canvas方向反了 调
  • C语言-01

    以下内容为个人笔记 无实际参考意义 取地址符 int a 9 int pa 9 定义了一个今天类型的变量a 给他的值为9 定义了一个int类型的指针pa 指向变量a的地址 指定a输出的结果为9 指定 a输出的结果为存放a变量的地址 指定pa
  • linux如何做到不丢日志,rsyslogd日志丢失的解决

    最近发现跑keepalived的几台机器的日志总是打印不完 还好给抛了一个报错 信息如下 root yw lvs2 backup etc tail n 1000000 var log messages 20130526 grep rate
  • c语言中如何实现生成随机数

    文章目录 一 rand 函数 二 rand srand 三 rand sranf time 一 rand 函数 c语言中自带的生成随机数的函数rand 只要引用头文件 include
  • Apache Kafka Connect JNDI注入漏洞 (CVE-2023-25194) 安全风险通告

    https mp weixin qq com s biz MzU5NDgxODU1MQ mid 2247497666 idx 1 sn b58717baf54fe52ec517b89fe370f589 chksm fe79d35ac90e5
  • 自动化测试用例要怎么写,据说这是最全的......

    前言 自动化测试是使用专门的软件工具来验证软件解决方案 这通常涉及自动化功能作为测试过程的一部分 测试自动化最常见的对象是 测试管理和缺陷管理 单元和单元集成测试 功能测试 回归测试 非功能测试 如性能和可扩展性 自动化测试用例的编写是实现

随机推荐

  • 学习日记——《MQTT-JX》例程讲解(完结版)

    头文件 include ets sys h include driver uart h include osapi h include mqtt h include wifi h include config h include debug
  • 程序员思维方式

    今天去设备部修电脑的时候 看到他们部门在讨论个商业题目 看他们的津津有味 如痴如醉 吊起了我的无限兴趣 临走时让那妹子给我发了份邮件 回去好好研究研究 现将题目共享出来 和大家一起讨论讨论 据说这是一道可以测出一个人有没有商业头脑的数学题
  • NetCore连接MySQL

    打开VS 工具 NuGet包管理器 管理解决方案的NuGet程序包 搜索MySql Data并安装 测试连接MySQL的代码 using System using System Collections Generic using Syste
  • vue使用qrcode

    借鉴 vue中使用qrcode 生成二维码 有蝉的博客 CSDN博客 qrcode vue一 安装qrcode jsnpm install save qrcode二 封装生成二维码的组件index vue
  • 如何理解递归

    基本思想 写好递归要掌握几个技巧 1 明确递归函数的作用 将递归函数看作一个黑盒 我自己把该技巧称为黑盒思想 我认为黑盒思想对于理解递归有很大的作用 递归函数就是隐藏了很多细节 我们没必要去一步一步地模拟递归函数的运行 那样大脑也受不了 比
  • python:如何删除符合条件的图片

    import os import Image fileName fp open fileName rb im Image open fp fp close x y im size if x lt 300 or y lt 300 os rem
  • 自主设计,模拟实现 RabbitMQ - 多虚拟主机管理

    目录 前言 一 多虚拟主机管理 1 1 需求分析 1 1 1 回顾 1 1 2 实现方案 1 2 具体实现 lt
  • 学习 stm32 FATFS文件系统基础知识与示例应用

    文件系统 负责管理和存储文件信息的软件机构称为文件管理系统 简称文件系统 即在磁盘上组织文件的方法 理解 包含了对介质存储器进行地址 内容 读取操作的一些封装的功能API方便应用层直接使用 常用的文件系统 FAT FATFS NTFS 基于
  • 三色标记清除法

    文章目录 1 三色标记算法的概述 2 三色标记的过程 3 存在问题 3 1 错标 3 2 漏标 4 解决错杀问题 4 1 CMS 写屏障 增量更新 Incremental Update 4 2 G1 写屏障 原始快照 STAB 1 三色标记
  • 链表的应用:单元多项式的加法、减法、乘法

    使用链表来实现单元多项式的加法 减法 乘法 一个单元多项式的节点结构无非是这样的 系数域 指数域 链域 如下图 我们使用链表来模拟单元多项式的常见运算 其中 加法是其它运算的基础 减法 poly1 poly2 poly1 poly2 乘法
  • 异常介绍。

    异常 1 了解异常的概念 编写的程序是来源或超脱于现实生活的 生活中 不符合你预期情况的场景 就是出现异常了 程序中的异常 Scanner in new Scanner System in System out print 请输入被除数 i
  • Unity 划线 - 使用Image实现划线

    unity使用Image实现划线功能 unity中划线的方式有很多 LineRender OpenGL 记录像素点等方式都可以实现划线的功能 如想了解其他划线方式 请看我的另一篇文章 gt Unity OpenGL 实现 阴阳师画符 划线功
  • Construct2 第一次制作的小游戏

    简单聊聊我是怎么制作出这款游戏 游戏介绍 先简单介绍一下游戏玩法 这款游戏中你可以操控女孩上下左右移动 用鼠标点击丘比 女孩会向丘比发射向日葵 如果丘比被向日葵打中三次 丘比就会死亡 并伴有爆炸效果 如果女孩不小心碰到了丘比 女孩也会死亡
  • 阿里云服务器vCPU和CPU有区别吗?

    阿里云服务器vCPU是什么 vCPU和CPU有什么区别 CPU是指云服务器的中央处理器 一个CPU可以包含若干个物理核 一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定 通过超线程HT Hyper Threading 技
  • Ubuntu开机进不去系统,出现/dev/sda4: clean

    目录 一 问题描述 二 解决方法 2 1查看ubuntu的内存 2 2解决方法 2 3额外清理 三 查看ubuntu内存 开机恢复后 一 问题描述 我是双系统 忙完后电脑关机 第二天再进入ubantu系统就进不去了 网上解决这个问题的有很多
  • java 方法中的形参传值

    今天看到一个String传值问题 才发现以前的认知都是错的 为防止以后忘记 写下来 先来看一个问题 public static void main String args String a abc String b bcd change a
  • mysql存储过程事务处理

    今天分享的内容是mysql内存储过程进行事务处理 多研究下mysql的存储过程会发现 存储过程的业务流程可以看作我们java里的service里的业务方法 在存储过程添加了事务 就能保证存储过程内的dml操作保持一致性 要么成功要么失败 是
  • 检查 QProcess 对象的状态的所有接口

    QProcess isOpen QProcess isOpen 是 QProcess 类中的一个成员函数 用于检查 QProcess 对象是否已打开 在 QProcess 对象打开和启动外部进程后 可以使用该函数来判断它的状态 函数签名如下
  • OD(1)之git更换远程仓库的url地址

    OD 1 之git更换远程仓库的url地址 Author OnceDay Date 2023年4月17日 1 更换远程仓库的url地址 使用下面命令即可 ubuntu gt tdata git remote help error Unkno
  • 区块链-02-BTC-密码学原理

    目录 区块链与密码学 一 哈希 散列 函数 二 密码散列函数 Cryptographic hash function Collision resistance Hiding digital commitment puzzle friendl