1、:第三章第三章 密码学技术密码学技术哈希算法Merkle树公钥密码算法Contents3.13.23.31密码学技术u 密码算法:密码算法:密码算法是区块链构筑安全、可信的存储与交易网络的核心。u 区块链系统中,使用哈希函数和公钥密码技术等密码学技术。u 哈希函数是实现区块链完整性保护的主要工具,区块链系统中至少包含2个层级的完整性保护。u 公钥密码算法的提出有效地解决了密钥分发传输的问题,私钥加密-公钥解密的应用模式有效解决签名问题。23.1 3.1 哈希算法哈希算法哈希函数u定义:定义:哈希(Hash)函数又称散列函数,它是一种单向密码体制,即一个从明文到密文的不可逆映射,能够将任意长度的
2、输入映射成固定长度的输出,即散列值。常用于实现数据完整性和实体认证等。u 数学表述:数学表述:h=H(m),其中H指哈希函数,m是指任意长度的明文,h是固定长度的哈希值。哈希函数对于不同的输入可以获得不同的哈希值,如果出现对于不同的输入获得了相同的哈希值则称为哈希碰撞。3哈希算法u特点特点u 单向性:单向性:对于给定的哈希值h,要找到m使得h=H(m)计算上是不可行的。u 易压缩:易压缩:对于任意大小的输入m,哈希值h的长度都很小且固定长度。u 高灵敏:高灵敏:每一位输入的变化输出都会引起输出值发生巨大的变化。u 抗碰撞:抗碰撞:哈希函数的抗碰撞性是寻找两个不同的、能够产生碰撞的消息在计算上是
3、不可行的。4哈希函数u 哈希函数:哈希函数:主要用于数据加密、区块生成及链接、共识计算的工作量证明等。u 哈希指针:哈希指针:是一种数据结构,用来链接区块,与指针不同的是,通过哈希指针不仅能确定数据的存储位置,还能确定该数据的哈希值。5哈希指针u哈希指针的链接结构如下图。区块链中的每一区块头中都包含该区块的哈希值,后一个区块通过哈希指针与前一个区块相连,并提供前一区块的哈希值。若前一区块的数据发生变化,导致区块哈希值变化,则可以通过哈希指针及时发现数据被篡改。u以比特币系统为例,使用了两个密码学哈希函数:SHA-256和RIPEMD-160。SHA-256哈希函数主要用于加密交易区块的构造,R
4、IPEMD-160哈希函数主要应用于生成比特币地址。6哈希指针链接结构SHA-256算法uSHA-256函数属于美国标准与技术局(NIST)发布的安全哈希算法SHA-2系列函数之一。区块链技术使用的是双SHA-256哈希函数将任意长度的原始数据经过两次SHA-256哈希运算后转换为32字节的二进制数字统一存储和识别。uSHA-256算法的输入为长度小于264位的消息,输出是256位的消息摘要,输入消息以512位的分组为单位进行处理。其算法描述如下:u 1.1.消息填充:消息填充:填充一个最高位为1其余位为0的比特串,报文的长度 n(448 mod 512)。然后在消息后附加64位的长度块,其值
5、为填充前消息的长度,从而生成长度为512整数倍的消息分组,填充后消息的长度最多为264位。7SHA-256算法u 2.2.初始化缓存:初始化缓存:SHA-256算法会使用一个256bit的缓存来存放该哈希函数的中间值及最终结果。缓冲区一般用8个32位的寄存器A、B、C、D、E、F、H表示,首先要对初始链接变量存储于这8个寄存器中:A=0 x6A09E667 B=0 xBB67AE85 C=0 x3C6EF372 D=0 xA54FF53A E=0 x510E527F F=0 x9B05688C G=0 x1F83D9AB H=0 x5BE0CD19 这些初始化变量是取自前8个素数2、3、5、7
6、、11、13、17、19的平方根的小数部分二进制表示的前32位。8SHA-256算法u 3.3.主循环:主循环:消息块是以512位(16个字)为单位进行报文的处理。该算法使用了六种基本逻辑函数,由64步迭代运算组成。每步都以256位缓存值ABCDEFGH为输入,然后更新缓存内容。每步使用一个32位常数值Kt和一个32位的Wt。Kt是常数值,Wt是分组之后的报文。9SHA-256算法u 4.4.生成摘要:生成摘要:所有的512-bit分组处理完毕后,对于SHA-256算法最后一个分组产生的输出便是256-bit的报文摘要。u SHA-256算法将原始输入填补分块后,通过数据计算,将细微变化反映在
7、摘要中,保证数据被篡改后可被及时发现;同时在数据计算中,通过不断的运算保证结果唯一及不可逆,从而保证数据的保密性。10RIPEMD-160算法uRIPEMDRIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校验消息摘要)使用MD4的设计原理,并针对MD4的算法缺陷进行改进。u在比特币系统中,RIPEMD-160哈希函数用来生成比特币地址。uRIPEMD-160 同样是使用缓存来存放算法的中间结果和最终的摘要。这个缓冲区由5个32位的寄存器A、B、C、D、E构成,其初始值如下:A=67452301 B=efcd
8、ab89 C=98badcfe D=10325476 E=c3d2e1f0。11RIPEMD-160算法uRIPEMD处理算法的核心是一个包含10个循环的压缩函数模块,其中每个循环由16个处理步骤组成,在每个循环中使用不同的原始逻辑函数,算法的处理分为两种不同的情况,在这两种情况下,分别以相反的顺序使用5个原始逻辑函数。每一个循环都以当前分组的消息字和160位的缓存值A、B、C、D、E为输入得到新的值。每个循环使用一个额外的常数,在最后一个循环结束后,两种情况的计算结果A、B、C、D、E和A、B、C、D、E及链接变量的初始值经过一次相加运算产生最终的输出。对所有的512位的分组处理完成之后,最
9、终产生的160位输出即为消息摘要。123.2 Merkle3.2 Merkle树树Merkle树u定义定义:Merkle哈希树是一类基于哈希值的二叉树或多叉树,其中叶子节点存储数据块的哈希值,非叶子节点则存储该节点对应的所有子节点计算所得的哈希值。u如下图为一个Merkle哈希二叉树。叶子节点“Hash 1”存储数据块“交易1”的哈希值,非叶子节点“Hash 12”存储其子节点“Hash 1”和“Hash 2”组合的哈希值。13Merkle树示意图Merkle树14uMerkleMerkle树特点树特点uMerkle树中,节点的哈希值都存储在上一级节点里直至根节点。一旦数据被攻击篡改,将导致上
10、级节点哈希指针中的哈希值与本节点不匹配,即使攻击者继续修改上级节点,也不能修改指向根节点的哈希指针,因此数据篡改很容易被发现。uMerkle树使用户可以通过区块头里的Merkle根及哈希值列表来验证某一数据块是否存在于这一Merkle树中。3.3 3.3 公钥密码算法公钥密码算法公钥密码算法u 公钥密码算法,又称为双密钥密码算法或非对称密码算法。公钥密码系统使用两个不同的密钥,包括公钥和私钥两种,公钥是指公开的密钥,私钥是指非公开、私有的密钥。通常情况下,发送者通过公钥对信息进行加密,接收方通过私钥对接收到的加密信息进行解密。u 用户还可以使用私钥对自己的交易信息进行数字签名,保证消息传输的完
11、整性,其他用户可使用公钥对消息的签名进行验证。区块链中使用的公钥密码算法是椭圆曲线密码算法。15椭圆曲线密码算法u定义:定义:椭圆曲线密码(Elliptic Curve Cryptography,ECC)算法是基于椭圆曲线的一种公钥密码算法。u 1.椭圆曲线的基本概念:椭圆曲线的基本概念:设p为大于3的素数,在有限域Zp上的椭圆曲线 由一个基于同余式 的解集和 一个称为无穷远点的特定点O组成,a,b 是满足 的常数。通过定义适当运算,椭圆曲线E上的点构成Abel群。记运算为+,设 ,。对于所有的 定义 。如果 且 ,则 。否则 ,其中 可证明E中的点在该运算下构成了Abel群,其单位元为O。对
12、于E中 的元素 ,其逆元为 。1623yxaxb23modyxaxbp,ppx yZZpZ324270modabp11=,Px yE22=,QxyEPE=+OP OPP12=xx12yy +=P Q O33+=(,)xyP Q2312xxx3131()yxxy2121211,=3,2yyPQxxxaPQy,x y,x yxy椭圆曲线密码算法u 椭圆曲线及其解点的运算的几何意义如下图所示。设 和 是椭圆曲线的两个点,则连接 和 的直线与椭圆曲线的另一个焦点关于横轴的对称点即为 点。1711,P x y22,Q xy11,P x y22,Q xy1122+,P x yQ xy椭圆曲线密码算法u 2
13、.椭圆曲线密码:椭圆曲线密码:椭圆曲线密码建立在椭圆曲线解点群的离散对数问题的困难性上,椭圆曲线离散对数问题描述如下:给定群中的点P与点Q,在等式 kP=Q中,已知k和点P求点Q较为容易,而已知点Q和点P求k却十分困难。椭圆曲线密码算法正是基于离散对数问题,例如:使用Q为公钥,k为私钥。18椭圆曲线签名与验证签名u 定义:定义:数字签名也称电子签名,是指附加在某一电子文档中的一组特定符号,用于标识签发者的身份以及签发者对文档的认可,并能被接受者用来验证信息在传输过程中是否被篡改。u 数字签名包括密钥生成、签名及验证签名等。其中签名是指签名者对签名消息进行摘要提取,接着利用私钥对其进行签名的过程
14、,验证签名是指验证者获取签名者的公钥,并验证签名是否正确,消息是否被篡改的过程。19椭圆曲线签名与验证签名u椭圆曲线签名与验证签名的简要步骤如下:(设Fq为有限域,E为Fq上的椭圆曲线,P是E上的一个有理点,称为基点,P的阶为素数n。)u 1)密钥生成(1)用户A随机选择一个整数a,1an,计算 ;(2)将a作为用户A的私钥,作为用户A的公钥。(3)同理用户B产生的密钥对为 。20APaPAP(,)Bb P椭圆曲线签名与验证签名u 2)椭圆曲线数字签名(假设用户A对信息m进行签名,系统有一个哈希函数H。)(1)A随机选择一个整数k,1kn,计算 ;(2)计算 ,如果r=0,则重新选择随机整数。
15、(3)计算 ;(4)计算 ,如果s=0,则重新选择随机整数;则A对m的签名为(s,r)。21(,)kPx ymodrxn()eH m1()modskearn椭圆曲线签名与验证签名u 3)验证签名(1)验证是否满足:1rn,1sn,如不满足,则拒绝签名。(2)计算 ;(3)计算 ;(4)计算 ,计算 ;(5)如果 则接受签名。221mod,()wsn eH m1112(,)Ax yu Pu P11modrxn1rr12mod,moduewn urwn SECP256K1椭圆曲线u椭圆曲线的加密性能随着椭圆曲线参数a,b,G的不同而不同,比特币和以太坊中使用的椭圆曲线是SECP256K1。uSEC
16、P256K1椭圆曲线曲线方程为 ,由六元组定义:u(1)素数 ;u(2)a=0;u(3)b=7;23baxxy32256329876422222221p SECP256K1椭圆曲线u(4)非压缩形式的基点G为:G=0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8;u(5)n为G的阶,n=FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D06364141;u(6)协因子h=1。uSECP256K1因为其特定的参数,与其他曲线性能相比可以提高30%,同时可以有效避免后门出现的可能。24谢谢!谢谢!