密码学基础和比特币中的密码学

在比特币系统中,密码学是不可或缺的内容。在公钥、私钥、钱包地址的产生以及交易的签名和验证等环节都有密码学知识的应用。本文先从密码学的基本原理开始介绍让大家对密码学有一个基本的认识,然后再介绍一下在比特币中都具体运用了哪些密码学知识。

一、密码学基础

密码(cryptography)是一种信息处理体系,涉及信息的机密性完整性认证性不可否认性等许多方面

密码的体制由五个部分组成:明文(M)、密文(C)、密钥(K)、加密算法(E)和解密算法(D)。对于一个确定的密钥,加密算法将确定出一个具体的加密变换,解密算法将确定出一个具体的解密变换,解密变换就是加密变换的逆变换。

现代密码体制的分类

1、分类依据:加密钥 = 解密钥 ?

对称密码(Symmetric cipher):加密密钥和解密密钥相同,或者虽然不相同,但由其中的任意—个可以很容易地导出另外一个。对称密码算法主要包括:DES(Data Encryption Standard)三重DESAES,目前主要使用的是AES,因为它安全、快速、而且能够在各种平台上工作。

非对称密码(Asymmetric cipher):加密算法和解密算法分别用两个不同的密钥实现,并且由加密密钥不能推导出解密密钥。采用非对称密钥密码体制的每个用户都有一对选定的密钥。其中一个是可以公开的,称为公开密钥(Public key),简称公钥;另一个由用户自己秘密保存,称为私有密钥(Private key),简称私钥。非对称加密解决了对称加密密钥传输的问题。

非对称密码算法主要有RSAEIGamal方式Rabin方式椭圆曲线密码

非对称算法的在应用的过程如下,假设发送方向接收方发送消息(明文):
1.接收方生成公钥和私钥,公钥公开,私钥保留;
2.发送方将要发送的消息采用公钥加密,得到密文,然后将密文发送给接收方;
3.接收方收到密文后,用自己的私钥进行解密,获得明文。

2、分类依据:密钥的使用方式

1)序列密码

也称为流密码(Stream Cipher),它是对称密码的一种。序列密码可以随时间变化,具有转换速度快、低错误传播的优点,硬件实现电路更简单;其缺点是:低扩散(意味着混乱不够)、插入及修改的不敏感性。

序列密码涉及到大量的理论知识,提出了众多的设计原理,也得到了广泛的分析,但许多研究成果并没有完全公开,这也许是因为序列密码目前主要应用于军事和外交等机密部门的缘故。目前,公开的序列密码算法主要有RC4、SEAL等。

2)分组密码

是一个不随时间变化的固定变换,具有扩散性好、插入敏感等优点;其缺点是:加解密处理速度慢、存在错误传播。

DES和AES都属于分组密码,它们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码的迭代方法就称为分组密码的模式。

费斯托密码(Feistel cipher):用于构造分组密码的对称结构,大部分分组密码使用该方案,包括DES。由于它是对称的密码结构,所以对信息的加密和解密的过程就极为相似,甚至完全一样。这就使得在实施的过程中,对编码量和线路传输的要求就减少了几乎一半。

简单理解就是:首先对明文进行分组(L,R),然后使用轮函数F对明文的右半部分R进行加密作为新的R,然后用新的R与左半部分进行异或处理,得到的结果作为新的L,最后重新组合构成密文。

3、新型密码

演化密码:借鉴生物进化的思想,密码学与演化计算的结合,实现密码设计自动化,密码算法不断演化加强的方法。

量子密码:量子密码术是基于单个光子的应用和它们固有的量子属性开发的不可破解的密码系统,因为在不干扰系统的情况下无法测定该系统的量子状态。这种密码并不是基于数学而是物理学理论。

DNA密码:DNA密码是新生的密码技术,是传统密码技术的潜在替代途径之一,其特点是以DNA为信息载体,以现代生物学技术为实现工具,挖掘DNA固有的高存储密度、高并行性等优点,实现加密、认证、签名等密码学功能。

DNA 密码基于生物学中的某种困难问题。由于 DNA 密码的安全不依赖于计算困难问题,所以不管未来的电子计算机、量子计算机和 DNA 计算机具有多么强大的计算能力, DNA 密码对于它们的计算攻击都是免疫的 。

密码编制与密码分析

1、密码编制

理论基础:计算复杂性理论
1)密码的安全性以计算复杂度来度量;
2)现代密码往往建立在一个数学难题之上,而“难”是计算复杂度的概念;
3)计算复杂度只能为密码提供一个必要条件;

设计方法:混淆与扩散、迭代与乘积
1)混淆与扩散
(a)混淆:是一种使密钥与密文孩子间的关系尽可能模糊的加密操作。如今实现混淆常用的一个元素就是替换;这个元素在DES和AES中都有使用。
(b)扩散:是一种为了隐藏铭文的统计属性而将一个明文符号的影响扩散到多个密文符号的加密操作。最简单的扩散元素就是位置换,它常用语DES中;而AES则使用更高级的Mixcolumn操作。

2)迭代与乘积
(a)迭代:设计一个轮函数,然后迭代;
(b)乘积:将几种密码联合应用。

2、密码分析

穷举攻击:采用试遍所有可能的密钥对密文进行解密,这是基于足够资源的方案;
统计分析攻击:通过分析密文和明文的统计规律来破译密码;
数学分析攻击:对加密算法的数据依据通过数学 求解的方法来破译密码。

二、常见加密算法简介

1、DES算法

DES算法为对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥也是64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

由于DES的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在我们不应该使用DES了。

2、三重DES

是对每个数据块应用三次DES算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

尽管三重DES目前还被银行等机构使用,但其处理速度不高,除了特别重视向下兼容性的情况以外,很少被用于新的用途。

3、AES

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特。

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“状态(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1. AddRoundKey — 矩阵中的每一个字节都与该次轮秘钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
2. SubBytes — 通过非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
3. ShiftRows — 将矩阵中的每个横列进行循环式移位。
4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每列的四个字节。

最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

AES相比同类对称加密算法速度算是非常快,且即使是128位也足够复杂无法被暴力破解。现在112位密码还在商业应用,而128位是112位的几万倍,所以在实务中用128位比较划算(稍节约资源)。

算法 密钥长度 默认密钥长度 分组密码模式 填充方式
DES 56 56 ECB, CBC, PCBC, CTR, CFB, CFB8-CFB128, OFB, OFB8-OFB128 NoPadding, PKCS5Padding, ISO10126Padding
3DES 112、168 168 ECB, CBC, PCBC, CTR, CFB, CFB8-CFB128, OFB, OFB8-OFB128 NoPadding, PKCS5Padding, ISO10126Padding
AES 128、192、256 128 ECB, CBC, PCBC, CTR, CFB, CFB8-CFB128, OFB, OFB8-OFB128 NoPadding, PKCS5Padding, ISO10126Padding

4、RSA

RSA加密算法是一种非对称加密算法。RSA是1977年由Ron Rivest、Adi Shamir和Leonard Adleman一起提出的。RSA就是他们三人姓氏开头字母拼在一起组成的。

RSA加密算法的数学基础只涉及到质数、互质数、欧拉函数、模运算等简单的数学知识,其可靠性是基于对极大整数做因数分解的难度。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。

密钥生成的步骤如下:

  1. 随机选择两个不相等的质数p和q;
  2. 计算p和q的乘积n(将n转换为二进制后,二进制的长度就是密钥的长度,实际应用中一般选择1024位、2048位);
  3. 计算n的欧拉函数φ(n);
  4. 随机选择一个整数e,其中φ(n)>e>1,且e与φ(n)互质(实际应用中e一般选为65537);
  5. 计算e对于φ(n)的模反元素d;
  6. 将n和e封装成公钥,n和d封装成私钥。

RSA的加密是求“E次方的 mod N”,而解密则是求“D次方的 mod N”

密文 = 明文^E mod N
明文 = 密文^D mod N

注:EIGamal方式和Rabin方式也利用了类似的数学知识,但RSA利用的是质因数分解的困难度,而EIGamal方式则利用了mod N下求离散对数的困难度,Rabin方式是利用了mod N下求平方根的困难度。

5、椭圆曲线密码

椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为ECC),一种非对称加密算法,基于椭圆曲线数学,其可靠性依赖于被广泛承认的解决椭圆曲线离散对数问题的困难。

椭圆曲线密码体制(ECC)采用的数学难题则是求椭圆曲线加法群的离散对数问题,具体描述如下:
                                                                    Q = kG
其中Q为椭圆曲线上的点, G为椭圆曲线上的基点,k 为小于n的整数,n为G的阶,即 nG = O;
在椭圆曲线上使用“纯量乘法”运算,可知k, G不难求出Q, 但是给定Q, G求k就相对困难了,这就叫椭圆曲线加法群上的离散对数问题。
上述整数k,就是ECC私钥, Q为公钥, 可以利用此密钥对进行加密,解密,签名,验证等公私钥运算。

ECC的主要优势是在某些情况下它比其他的方法(如RSA)使用更小的密钥,提供相当的或更高等级的安全。美国国家标准与技术局和ANSI X9已经设定了最小密钥长度的要求,RSA和DSA是1024位,ECC是160位,相应的对称分组密码的密钥长度是80位。

6、单向散列函数

单向散列函数,也就是hash函数,就是把任意长的输入消息串变化成固定长的输出串的一种函数。这个输出串称为该消息的HASH值,其长度通常在128~256位之间。

一个安全的Hash函数应该至少满足以下几个条件:
1) 输入长度是任意的;
2) 输出长度是固定的,根据目前的计算技术应至少取128bits长,以便抵抗生日攻击;
3) 对每一个给定的输入,计算输出即Hash值是很容易的;
4) 给定Hash函数的描述,找到两个不同的输入消息得到同一个值是计算上不可行的;
5) 给定输入的任意一点改变,都会导致Hash值完全的不同,无规律可循。

Hash函数应用广泛,比较常见的有MD5、CRC、SHA。一些网站提供软件下载的时候会提供MD5值,这样的一个值就是网站使用MD5算法对下载的目标数据进行计算得到的一个散列值。如果攻击者攻破这个网站,在给用户下载的数据包中插入一些恶意代码或病毒,那么使用MD5算法计算得到的MD5散列值肯定发生了变化。

CRC在如今的TCP/IP等通信协议中广泛应用,报文的发送方会在以太网消息的末尾加上一个CRC(Cyclic Redundancy Check,循环冗余校验)字段,用来给接收方验证该消息的完整性。消息发送方计算出消息的校验和并将其随消息一起发送。接收方根据收到的消息重新计算校验和,并将其与直接收到的校验和相比较。如果两者不同,接收方就认为消息在传送过程中受损(如电信号受干扰出错),要求发送方重新发送。

SHA家族

Secure Hash Algorithm,缩写为SHA,是一个密码散列函数家族,是FIPS所认证的安全散列算法。

SHA家族有多种算法,其中SHA-1曾在许多协议中使用(如TLS、SSL、SHH),但如今已经被攻破。SHA-224、SHA-256、SHA-384和SHA-512被并称为SHA-2,它们的散列值长度分别为224比特、256比特、384比特、和512比特,至今尚未出现有效的攻击。

Keccak是一种被选定为SHA-3标准的单向散列算法,它可以生产任意长度的散列值,但为了配合SHA-2的散列值长度,SHA-3标准中共规定了SHA3-224、SHA3-256、SHA3-384和SHA3-512这四个版本。

RIPEMD

RIPEMD(RACE原始完整性校验讯息摘要)是一种加密哈希函数,它是以MD4为基础原则所设计的 ,而且其表现与更有名的SHA-1类似。

RIPEMD-160是欧盟RIPE项目所设计的RIPEMD单向散列函数的修订版。RIPEMD的强抗碰撞性已经于2004年被攻破,但RIPEMD-160还尚未被攻破。比特币中使用的就是RIPEMD-160。

三、消息认证码、数字签名和证书

为什么要进行消息认证?在互联网中,消息常会受到攻击,比如:

  • 重放攻击:截获以前协议执行时传输的信息,然后在某个时候再次使用(对付这种攻击,可以通过在消息中包含非重复值,比如序列号、时间戳、随机数等);
  • 冒充攻击:攻击者冒充合法用户发布虚假消息。为避免这种攻击可采用身份认证技术。
  • 重组攻击:把以前协议执行时一次或多次传输的信息重新组合进行攻击。为了避免这类攻击,把协议运行中的所有消息都连接在一起。
  • 篡改攻击:修改、删除、 [1]  添加或替换真实的消息。为避免这种攻击可采用消息认证码MAC或hash函数等技术。

消息认证码与数字签名技术在消息认证方面有着重要的作用。

1、消息认证码

单向散列函数能够辨别消息或者文件是否被“篡改”,但无法辨别出“伪装”,这时就需要进行认证

消息认证码(Message Authentication Code,简称MAC)就是这样一种能够确认完整性并进行认证的技术。

通过MAC可以实现防止攻击者冒充合法用户发布虚假信息。

消息认证的实现方式是结合了单向散列函数和对称密码技术,大致原理如下:

普通:消息 —— 单向散列函数 ——> 散列值

MAC:消息+密钥 —— 单向散列函数 ——> 散列值

在两个或者一个团体内,在成员之中共享密钥,发送者发送消息以及计算出的MAC值,而接收者接到消息后也可以使用消息+密钥重新计算MAC值。如果两者一致,则证明消息没有“篡改”也没有“伪装”。如果不一致,则消息被拒绝。

2、数字签名

消息认证码有一个缺点:无法防止否认。啥叫“不可否认性”?

比如三个人在共享密钥,A发送消息给B后后悔了,说这个消息说C的,C无法证明自己没发这个消息,因为他也有密钥。这要怎么办呢?

数字签名就是这样一种能够对第三方进行消息认证,并且能够防止通信对象作出否认的技术。

数字签名结合了单向散列函数和非对称密码技术。这个过程中没有共享密钥,而是变为了消息发送者的私钥和公钥。发送者对消息的散列值进行私钥加密,而公钥对外公开。接收者或验证者使用公钥进行解密,由于私钥之可能是发送者所有,所以消息一经确认,就无法否认。单向散列函数的运用同时又保证了信息的完整性。

数字签名使用的算法有:RSA、EIGamal、ECDSA(椭圆曲线密码,在比特币中使用到)、Rabin。

3、证书

需要注意的是,虽然数字签名可以识别篡改、伪装、防止否认,但是如何确定公布的公钥确实是属于真正的消息发送者呢?我们需要一个机构来确定某个公钥是属于某个人的。如何实现?

其实就是认证机构用自己的私钥对每个人的公钥进行了签名,这样不论是消息发送者还是消息接受者都通过使用认证机构的公钥去验证这个签名,确认对方公钥的合法性。

也就是说,消息接收者就是要先用私钥解密得到发送者的消息,再用发送者的公钥解密,得到散列值去验证消息。

四、比特币系统中用到的密码学

通过上面的介绍,我们对现代密码学有了一个粗略对认识,脑海里应该勾勒出一副密码学知识点对地图。那么下面我们来看看,在比特币或者区块链中,运用了哪些密码学知识呢?

1、私钥、公钥和钱包地址

私钥、公钥、钱包地址这三者都是我们在区块链中的身份象征,相当于id。

在比特币中,公钥、钱包都是由私钥产生来的,私钥是由1~2^256之间的随机数组成的一个256 bit的字符串。

公钥由私钥产生,由于私钥必须私密而公钥是公开的,这就要保证别人无法通过公钥推断出私钥是什么。这依赖于上面说到的一种算法:椭圆曲线数字签名算法(ECDSA)。

再从公钥产生钱包地址:先对公钥进行一次SHA-256运算,得到256bit的值;再进行RIPEME-160运算,得到160bit的值;最后进行base58check变换,最终生成钱包地址。

2、交易签名与验证

与上面介绍的数字签名类似,在比特币系统中,一笔交易归属以及真伪的验证也是必要的。

实际上就是使用了数字签名的技术,由于公钥和私钥是由椭圆曲线密码方法产生的,结合SHA-256等哈希函数,在比特币系统中可以完成对交易信息对数字签名以及验证。

比特币的交易中,我们需要关注两个问题:
1、交易被公布后,如何验证该消息的有效性或不可否认性?
2、如何证明交易发起者有权使用该交易的输入(UTXO)?

交易发送者(owner)构建一笔完整的交易的过程:

1、引用UTXO交易:写明上一笔交易的txid、vout以及未经hash的公钥pubkey;
2、先构建一个缺少签名的不完整交易,包括:vin:{txid,vout} + vout{value,scriptPubKey( 接收方 )} + scriptPubkey ( owner ),生成待签名交易hex;
3、使用私钥(owner)对这个待签名交易hex进行处理,再加上scriptPubKey ( owner ),组成完整的签名,进而构建成了一笔完整的交易实例。

交易发送出去以后,就会进入交易池,等待其他矿工节点在启动挖矿前对这笔交易进行验证:

1、通过私钥对交易进行签名,矿工即可使用交易发起者对公钥对交易进行验证,证明交易消息的存在性和合法性;

2、通过验证交易发起者的公钥与前一笔交易UTXO中的公钥脚本是否匹配,验证交易发起者对UTXO的所有权。

猜你喜欢

转载自blog.csdn.net/lj900911/article/details/83279835