区块链学习笔记(三)——第一章 密码学及加密货币概念

2023-11-07

加密数字货币与法定货币不同在于,其安全规则需要完全通过技术手段实现,而非依赖中央机构

1.1. 哈希函数

哈希函数三个特性:
1. 任意大小字符串均可作为输入;
2. 产生固定大小输出;
3. 能进行有效计算,即对应n位字符串,其哈希值计算复杂度为 O(n) O ( n )

为使得哈希函数达到密码安全,要求其具有以下三个附加特性:
1. 碰撞阻力(collision-resistance)
2. 隐秘性(hiding)
3. 谜题友好(puzzle-friendliness)

碰撞阻力:

如果无法找到两个值, x x yy xy x ≠ y ,而 H(x)=H(y) H ( x ) = H ( y ) ,则称哈希函数 H H 具有碰撞阻力。

这里写图片描述

P.s:根据鸽巢原理可知,必然有大量可能输入被映射到任意特定输出。因此,碰撞必然存在,但我们只需要保证其在概率上是难以实现的即可
* 应用:信息摘要——哈希有助于确认事物未被更改。


隐秘性:

哈希函数HH具有隐秘性,如果:当其输入 r r 选自一个高阶最小熵(high min-entroy)的概率分布,在给定HrxHrx条件下来确定 x x 是不可行的。

P.s:在信息论中,最小熵 是用于测试结果可预测性的手段,而高阶最小熵这个概念比较 直观描述了分布(如随机变量)的分散程度。具体来说,在从这样分布中取样时,我们将 无法判定取样的倾向。

简而言之,隐秘性保证:如果我们仅仅知道哈希函数的输出y=H(x)y=H(x),我们没有可行的办法算出输入值x。

  • 应用:承诺——类似于签名:
    承诺协议一个承诺协议方案由两个算法构成:
    • com:=commit(msg,nonce) c o m := c o m m i t ( m s g , n o n c e ) ,承诺函数将信息 msg ( m s g ) 和一个临时随机数 nonce ( n o n c e ) 作为输入,输出就是一个“承诺”。
    • verify(com,msg,nonce) v e r i f y ( c o m , m s g , n o n c e ) ,验证函数将某个承诺输出 com ( c o m ) 、临时随机数 nonce ( n o n c e ) 及信息 msg ( m s g ) 作为输入,如果 com==commit(msg,nonce) c o m == c o m m i t ( m s g , n o n c e ) ,则返 回“真” true ( t r u e ) ;反之则返回“假” false ( f a l s e )

谜题友好:

直觉上,谜题友好可以这样解释,如果有一个人想找到y值所对应的输入,假定在输 入集合中,有一部分是非常随机的,那么他将非常难以求得y值对应的输入。


安全哈希算法

SHA-256是一个主要被比特币世界采用,并且效果还很不错的哈希函数。

MD变换:只要我们能建立一 个用于固定长度输入的哈希函数,然后通过一般方法,就可以将接受固定长度的哈希函数 转化为可接受任意长度输入的哈希函数。

压缩函数:这种基础型,可用于固定长度,具备碰撞阻力的哈希函数被称为是压缩函数 (compression function)。经过验证,如果基本压缩函数具有碰撞阻力的特性,那么经过转换而生成的 哈希函数也具有碰撞阻力


1.2 哈希指针及数据结构

哈希指针:哈希指针是一个指向数据存储位 置及其位置数据的哈希值的指针。一个普通的指针可以告诉你数据存储的位置,哈希指针 不但可以告诉你数据存储的位置,并且还可以给你一种方式,让你验证数据没有被篡改过

哈希指针

区块链

我们通过哈希指针构建一个链表,我们将这个数据结构称为区块链 (block chain)

区块链

在区块链中,上一个区块指针被置换为哈希指针。因此,每个区块不仅能 告诉我们上一个区块的值在哪里,还包含了该值的摘要,使我们能够验证那个值没有改 变。我们存储链表头部(the head of list),即一个普通的哈希指针指向最近使用的数据区块。

创世区块:我们可以搭建一个包含很多区块的区块链网络,链表头部的 哈希指针被称作创世区块 (genesis block)。

  • 应用:防篡改日志——只要我们将链表头部的哈希指针存储在对手无法改 动的地方,对手将不能做到在不被检测到的前提下,篡改任何区块(见图1.6)。

防篡改日志

梅克尔树:

我们可以用哈希指针建立的有用的数据结构是二叉树。使用哈希指针的二叉树 也叫作梅克尔树 (Merkle trees),以其发明者拉尔夫·梅克尔(Ralph Merkle)的名字命名。

梅克尔树

这里写图片描述

类似于区块链,同样地仅仅通过记住顶部的哈希指针,任何企图篡改任何数据的行为都会被检测到。

  • 应用
    1. 隶属证明:
      梅克尔树的一个特点是它可以实现简洁的隶属证明。我们只记住树根节点,然 后他需要展示给我们数据块信息,以及从该数据区块通向树根节点的那些区块,我们可以 忽略树的其余部分,这样做是因为这些区块已经足够让我们验证通往树根节点过程中所有 的哈希值。

隶属证明

2. 非隶属证明:一个排序梅克尔树是把底层的数据通过某些排序得到的梅克尔树,这里排序规则可以 是字母表排序、词典排序、数字化排序,或者其他约定的排序方式。有了排序梅克尔树,我们可以在一个对数复杂度的条件下验证某一个数据区块并非来 自某梅克尔树。也就是说,我们可以证明某个特定区块不属于梅克尔树,而我们只是简单 通过展示被验证区块之前的区块路径,以及被验证区块之后的区块路径,就可以达到目的。
  eg:如果之前、之后两个区块在树上是连续的,那么这说明了被验证区块与该梅克尔树之 间是非隶属关系。因为被验证区块确实隶属于梅克尔树,它需要在两个条目之间,而如果 两个条目是连续的话,二者之间则并没有空间。

1.3 数字签名

预期:
第一,只有你可以制作你自己的签名,但任何看到它的人都可以验证其有效性;
第二,我们希望签名只与某一特定文件发生联系,因此该签名不能用于表明你同意或 支持另一份不同的文件。

方案——由以下三个算法组成:
* (sk,pk):=generateKeys(keysize) ( s k , p k ) := g e n e r a t e K e y s ( k e y s i z e ) generateKeys g e n e r a t e K e y s 方法把 keysize k e y s i z e 作为输 入,来产生一对公钥和私钥。私钥 sk s k 被安全保存,并用来签名一段消息;公钥 pk p k 是人 人都可以找到的,拿到它,就可以用来验证你的签名。
* sig:=sign(sk,message) s i g := s i g n ( s k , m e s s a g e ) 签名过程是把一段消息和私钥作为一个输入,对于 消息输出是签名。
* isValid:=verify(pk,message,sig) i s V a l i d := v e r i f y ( p k , m e s s a g e , s i g ) 验证过程是通过把一段消息和签名消 息与公钥作为输入,如果返回的结果是真,证明签名属实;如果返回的结果为假,证 明签名消息为假。

要求两个性质有效:
* 有效签名可以通过验证,即:

verify(pk,message,sign(sk,message))==true v e r i f y ( p k , m e s s a g e , s i g n ( s k , m e s s a g e ) ) == t r u e

* 签名不可伪造。

实践考量
1. 随机性的良好来源很重要;
2. 可以对于哈希指针进行签署。如果你签署了哈希指 针,那么该签名覆盖(或者说保护)整个结构——这不仅仅是哈希指针本身,还包括哈希 指针指向的整个区块链。比如,如果签署了区块链末尾的哈希指针,其结果就是你有效地 数字签署了整条区块链。

椭圆曲线数字签名算法
比特币使用的数字签名方案叫作椭圆曲线数字签名 算法(ECDSA) 。ECDSA为美国政府的标准,是早前DSA算法利用了椭圆曲线的升 级版。这些算法经过了数年的细致密码分析,且被普遍认为是安全的。


1.4 公钥即身份

  1. 将公钥视为身份的一个结果是,你可以随时制定新的身份——你可以简单通过数字签 名方案中的generateKeys程序,生成新的密钥对sk和pk。pk是你可以使用的新的公共身 份,sk是相应的密钥,只有你自己知道并可以让你代表身份为pk发声。在实践中,你可能 会使用pk的哈希作为你的身份,这是因为公钥很大。如果是这样的话,为了验证消息来自 你的身份,人们会需要验证:(1)你的身份确实是pk的哈希;(2)信息能经过公钥pk验 证。
  2. 比特币对待身份的方式:去中心化身份管理——这些身份在 比特币语言中被称为地址。你可以常常听到地址这个词,用于比特币或加密货币相关的内 容中,而地址其实就是公钥的哈希值。作为去中心化身份管理方案的一部分,它就是某人 凭空捏造的一个身份而已。

两种简单的加密货币

  • 高飞币:
    两条规则:

    1. 指定高飞可以随时创建新币,且这些 新创建的币都属于他。
    2. 拥有此币的人可以将其转给其他人。转移一只币不是简单地 将币数据结构发送给接受者,而是必须通过密码程序来完成。
      缺点:未解决双重支付问题
  • 财奴币:财奴币的工作原理是人们可以看见哪些币是 有效的。它防止双重支付,因为每个人都可以查看区块链,看到所有交易都是有效的,每 一只币确实都只被消耗了一次,但其问题是,财奴的权利太大了。

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

区块链学习笔记(三)——第一章 密码学及加密货币概念 的相关文章

  • 数据结构:数组模拟栈

    实现一个栈 栈初始为空 支持四种操作 push x 向栈顶插入一个数 x pop 从栈顶弹出一个数 empty 判断栈是否为空 query 查询栈顶元素 用数组模拟栈 栈 先进后出 include

随机推荐

  • 基于Python的Streamlit框架数据可视化

    背景 性能测试和授权软件每周周会前都需要手工统计数据到excel文档形成周报 人工统计费时费力 excel文档也不美观 所以萌生了用数据可视化展示周报的想法 由于不太懂web开发 html css这些 网上浏览了一番 发现已经有大佬基于Py
  • 2022 年面向开发人员的七个优秀 Java IDE

    ava是最强大的编程语言之一 目前用于30亿台设备的开发 每天约有70万开发人员使用它 它一直是开发大量应用程序的重要组成部分 它提供了一些惊人的功能 例如易于学习和理解 高度安全 平台独立性 极其安全等等 Java IDE 集成开发环境
  • C#:通过字符串(文本)调用控件

    TextBox tb TextBox this GetType GetField tb Runtime System Reflection BindingFlags NonPublic System Reflection BindingFl
  • Scanner类在Java中的使用

    一 前言 在学习Java的过程中 我们很容易看得到诸如 从键盘中输入 这就需要我们新手 不针对大佬 大佬绕路即可 哈哈哈哈 学习其中的知识 今天就来给大家讲一下Scanner的使用方法 二 知识点 1 导包 import java util
  • 解决npm切换国内源-nrm ls 命令*不显示的问题

    解决npm切换国内源 nrm ls 命令 不显示的问题 解决方案 此时不显示 nrm ls 解决方案 进入本地全局包安装目录 例AppData Roaming npm node modules nrm nrm目录下打开cli js文件 找到
  • 攻防世界--WEB题之robots

    问题描述 难度系数 一颗星 题目来源 Cyberpeace n3k0 题目描述 X老师上课讲了Robots协议 小宁同学却上课打了瞌睡 赶紧来教教小宁Robots协议是什么吧 题目场景 点击获取在线场景 题目附件 暂无 题目分析 这个题由题
  • python基础练习题(一)

    参考 一 单选题 1 Python中 运算符比较两个对象的值 下列选项中哪一个是is比较对象的因素 4 0分 A id B sum C max D min id 命令查看变量的地址 2 在python中 字符串s abc 那么执行表达式s
  • vue2以ElementUI为例构建notify便捷精美提示

    我们先引入一个 第三方UI库 这里 我们以elementUI为例 先引入依赖 npm install element ui save 然后 在 main js 入口文件中 引入一下 import ElementUI from element
  • MSYS2 如何添加国内源

    用MSYS2 pacman S 安装包的速度让你怀疑人生 所以需要将源换成国内源 步骤 lt 1 gt 打开MSYS2软件内的 etc pacman d 其中有3个文件 mirrorlist mingw32 mirrorlist mingw
  • Nacos未授权访问漏洞(CVE-2021-29441)

    目录 漏洞描述 影响范围 环境搭建 漏洞复现 声明 本文仅供学习参考 其中涉及的一切资源均来源于网络 请勿用于任何非法行为 否则您将自行承担相应后果 本人不承担任何法律及连带责任 加粗样式 漏洞描述 Nacos 是阿里巴巴推出来的一个新开源
  • 百度Apollo(二):障碍物感知模块

    Apollo感知模块具有识别障碍物和交通灯的能力 其中 Apollo解决的障碍物感知问题 1 高精地图ROI过滤器 HDMap ROI Filter 2 基于卷积神经网络分割 CNN Segmentation 3 MinBox 障碍物边框构
  • jenkins构建前、构建、构建后操作

    因为使用docker部署的jenkins存在目录映射问题 所以直接部署jenkins 部署参考 构建前操作 思路 使用ssh到目标服务器下发命令 查询启动的node服务 分析不同的服务器启动的服务 备份服务对应代码 构建 思路 jenkin
  • linux 创建 svn 库

    cd data svn mkdir p itvalue chown R windmaker windmaker itvalue svnadmin create data svn itvalue cd itvalue cd conf vim
  • freeimage ubuntu安装

    sudo apt get install libfreeimage dev sudo apt get install libfreeimage 编译安装地址 https github com Kanma FreeImage This dis
  • es6 求两个数组的差集

    let arr 1 2 3 4 5 let arr01 1 2 3 4 5 6 7 8 9 let arr02 arr01 filter x gt arr every y gt y x console log arr02
  • 以太坊Dapp终极教程——如何构建一个完整的全栈去中心化应用(三)

    在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 一 中 我们已经完成了一切所需的设置 在以太坊Dapp终极教程 如何构建一个完整的全栈去中心化应用 二 中 让我们通过列出将在选举中运行的候选人来继续构建智能合约并完成客户端程序
  • 第四章文件管理

    0 初识文件管理 一个文件有哪些属性 文件名 由创建文件的用户决定文件名 主要是为了方便用户找到文件 同一目录下不允许有重名文件 标识符 一个系统内的各文件标识符唯一 对用户来说毫无可读性 因此标识符只是操作系统用于区分各个文件的一种内部名
  • WLS2 下解决nvidia-smi不可用方法

    WLS2系统 Ubuntu22 04 windows win11 wls2更新内核后 nvcc V 可用 但是 nvidia smi报错 NVIDIA SMI has failed because it couldn t communica
  • 安装开发软件的步骤以及后期开发会遇到的一系列问题

    这是我自己进行项目开发过程中遇到的一些问题 我将他们记录了下来 一 合理的安装开发软件的过程 1 安装jdk 1 1版本问题 不要安装最新的jdk 很容易出现bug 可以安装第三个版本左右的jdk 1 2配置环境变量 网上搜 2 安装Tom
  • 区块链学习笔记(三)——第一章 密码学及加密货币概念

    加密数字货币与法定货币不同在于 其安全规则需要完全通过技术手段实现 而非依赖中央机构 1 1 哈希函数 哈希函数三个特性 1 任意大小字符串均可作为输入 2 产生固定大小输出 3 能进行有效计算 即对应n位字符串 其哈希值计算复杂度为 O