本文分为6个部分,第1部分介绍密码学的基本概念,第2部分讲解常见的对称加密算法,第3部分讲解常见的非对称加密算法,第4部分讲解PKI(Public Key Infrastructure),第5部分讲解哈希函数加密,最后一部分讲解密码学在区块链里的应用。
Part 1 密码学基本概念
1.1 密码学提供的4个基本安全服务
Confidentiality(机密性):
对于需要保护的机密信息,避免被没有权限的人获取。Data Integrity(数据完整性):
保证数据从被创造开始,经过传输,直到接收者收到数据,数据的完整性和被创造时候是完全一致的。Authentication(发送者的身份认证):
保证接收者所接收到的数据的确是从经过认证的发送者发送的,确保了数据的真实来源。-
Non-repudiation(不可抵赖性):
证实数据的确是从某人或者某方创造且发送的,当接收者对数据有争议时,创造者以及发送者无法抵赖。
1.2 密码学基本概念
Plaintext(明文):
在传输过程中需要被保护的数据。Encryption Algorithm(加密算法):
给予明文以及加密密钥,通过数学处理(这里的数学处理就是加密算法)产生密文。Ciphertext(密文):
给予明文以及加密密钥,通过加密算法加密从而产生密文。Decryption Algorithm(解密算法):
给予密文以及解密密钥,通过数学处理(这里的数学处理就是解密算法)还原明文。Encryption Key(加密密钥):
发送者拥有的一个值,结合加密算法以及明文来产生密文。Decryption Key(解密密钥):
接收者拥有的一个值,结合解密算法以及密文来还原明文。
1.3 两种不同的密码系统
- Symmetric Key Encryption(对称加密):
加密与解密过程都使用同样的密钥。
比较常见的对称加密算法有: Digital Encryption Standard(DES), Triple-DES, IDEA, BLOWFISH。
对称加密的挑战:
- 密钥的产生: 由于加解密的过程使用相同的密钥,因此双方需要事先对产生密钥的机制达成共识。
- 信任问题: 双方都要确保密钥只有发送者以及接收者知道,没有泄漏。一旦有第三方知道了密钥,数据的安全性就失效了。
- Asymmetric Key Encryption(非对称加密):
加密与解密过程使用不同的密钥,使用公钥加密,使用私钥解密。
非对称加密的挑战:
- 公钥的真实性: 确保公钥的确是真实的拥有人所有的那个公钥。
比较常见的非对称加密算法有: RSA, ElGamal, ECC。
1.4 Block Ciphers & Stream Ciphers(分组密码以及流密码)
Block Ciphers(分组密码):
明文是通过一块一块的二进制文档执行加密过程形成的密文。Stream Ciphers(流密码):
明文是一个个bit执行加密过程形成的密文。
1.5 Feistel Block Cipher(菲斯特尔结构的块加密算法):
菲斯特尔结构的块加密算法是著名的一个分组密码加密的设计模型。
Part 2 常见的对称加密算法
1.1 Data EncryptionStandard(DES):
-
DES是Feistel密码的一个实现。 使用16轮Feistel结构。 块大小是64位。 虽然密钥长度为64位,但DES的有效密钥长度为56位,因为64位密钥中的8位未被加密算法使用(仅用作校验位):
-
初始排列和最终排列是彼此相反的直排列排列(P-box):
-
圆函数
DES加密函数的核心。 DES加密函数将48位密钥应用于最右边的32位,以产生32位输出。
-
密钥生成
循环密钥生成器从56位密码密钥中创建16个48位密钥。
1.2 Triple DES:
1990年后对DES进行彻底的密钥搜索的速度开始引起DES用户的不适。 然而,用户并不想取代DES,因为它需要花费大量的时间和金钱来改变广泛采用并嵌入到大型安全架构中的加密算法。
务实的做法不是完全放弃DES,而是改变DES的使用方式。 这导致了三重DES(3DES)的修改方案。
三重DES
在使用3TDES之前,用户首先生成并分配一个3TDES密钥K,它由三个不同的DES密钥K1,K2和K3组成。
详细可以看 Triple-DES
1.3 Advanced Encryption Standard(AES):
高级加密标准(Advanced Encryption Standard,AES)是目前比较流行和广泛采用的对称加密算法。 发现至少比三重DES快6倍。
AES的功能如下:
对称密钥对称分组密码
128位数据,128/192/256位密钥
比Triple-DES更强更快
提供完整的规格和设计细节
详细可以看 AES
Part 3 常见的非对称加密算法
1.1 RSA Crytosystem:
这个密码系统是最初的系统之一。 即使在今天,它仍然是最多被使用的密码系统。 该系统由三位学者Ron Rivest,Adi Shamir和Len Adleman发明,因此被称为RSA密码系统。
1. RSA 密钥对生成过程
1.1 生成 RSA 模数 (n)
选择两个很大的质数, p 和 q。
计算 n = p*q。 为了没那么容易被破解,n 至少要是512bits。
1.2 找出导数(e)
数字 e 必须大于1,同时要小于(p - 1)(q - 1)。
数字 e 与 (p - 1)(q - 1)互质。
1.3 形成公钥
(n, e)这一对数字形成RSA的公钥并且公开。
尽管 n 是公钥的一部分,但是由于要在有限时间内把 n 做因式分解是很难做到的,这就是RSA的强大地方。
1.4 形成私钥
私钥d 是通过 计算 p, q 和 e 形成的。
`ed = 1 mod (p - 1)(q - 1)`
下面给出生成RSA密钥对的一个例子(为了便于理解,这里采用的素数p&q值很小,实际上这些值非常高)。
设两个素数为p = 7且q = 13。因此,模数n = pq = 7×13 = 91。
选择 e = 5,这是一个有效的选择,因为没有数字是公因子5和(p - 1)(q - 1)= 6×12 = 72,除了1。
这对数字(n,e) = (91, 5)形成公钥,可以让任何我们希望能够向我们发送加密消息的人使用。
向扩展欧几里德算法输入p = 7,q = 13和e = 5。 输出将是d = 29。
因此,公钥是(91, 5),私钥是(91, 29)。
2. RSA 加密与解密算法
1. RSA加密过程
假设发送者希望发送一些文本消息给公钥为(n,e)的人。然后发件人将明文表示为一系列小于n的数字。
为了加密第一个明文P,它是一个模n的数字。 加密过程是简单的数学步骤:
C = Pe mod n
换句话说,密文C等于明文P乘以自己e次,然后减去模n。 这意味着C也是一个小于n的数字。
回到我们的密钥生成例子,明文P = 10,我们得到密文C:
C = 105 mod 91
- RSA 解密过程
RSA的解密过程也非常简单。 假设公钥对(n,e)的接收者已经收到一个密文C。
Plaintext = Cd(C的d次方) mod n
Plaintext = 8229 mod 91 = 10
1.2 ElGamal Crytosystem:
属于ECC的一种变化。加密的核心理念与RSA相似,也是利用离散对数很难求解。
但与RSA不同的是 公钥的组成部分,EIGamal的公钥有三部分组成, 质模数 p, 生成元素 g, 以及 公共的 Y = gx(g的x次方) mod p。
详细可以看 ElGamal Crytosystem
1.2 Elliptic Curve Cryptography(ECC):
椭圆曲线密码术(ECC)是用来描述一套密码工具和协议的术语,其安全性基于特殊版本的离散对数问题。它不使用数字模p。ECC基于与称为椭圆曲线的数学对象相关联的数字集合。有这些数字的加法和计算倍数的规则,就像数字模p一样。
ECC包含许多最初为模块化数字设计的密码方案的变体,如ElGamal加密和数字签名算法。
相信当应用于椭圆曲线上的点时,离散对数问题更加困难。这会提示从数字模p切换到椭圆曲线上的点。如果我们使用基于椭圆曲线的变体,也可以用较短的密钥获得等效的安全级别。
较短的密钥有两个好处:
易于管理
高效的计算
这些优点使基于椭圆曲线的加密方案变体对计算资源受到限制的应用程序非常有吸引力。
详细可以看 Elliptic Curve Cryptography
Part 4 Public Key Infrastructure(PKI):
因为公钥是公开的,很容易被破坏或者篡改,因此需要建立和维持一种可信的基础机制来管理公钥。
PKI由5部分组成:
1.1 Digital Certificate(数字证书):
作为比喻,证书可以被视为发给该人的身份证。人们使用驾照,护照等身份证来证明自己的身份。数字证书在电子世界中具有相同的基本功能。
但有一点不同,数字证书不仅发给人,还可以发给电脑,软件包或任何其他需要证明电子世界身份的东西。
数字证书基于ITU标准X.509,该标准定义了公钥证书和认证验证的标准证书格式。因此数字证书有时也被称为X.509证书。
与用户客户端相关的公钥与证书颁发机构(CA)一起存储在数字证书中,以及其他相关信息,例如客户信息,到期日期,使用情况,发行者等。
CA对此整个信息进行数字签名并在证书中包含数字签名。
任何需要对客户的公共密钥和相关信息进行保证的人,他都会使用CA的公钥进行签名验证过程。成功的验证可确保证书中给出的公钥属于在证书中给出详细信息的人员。
下图了展示了个人/实体获取数字证书的过程:
如图所示,CA接受来自客户端的申请以证明其公钥。 CA在适当验证客户身份后,向该客户发出数字证书。
1.2 Certifying Authority(CA):
如上所述,CA向客户颁发证书并协助其他用户验证证书。 CA负责正确识别要求颁发证书的客户的身份,并确保证书中包含的信息是正确的并对其进行数字签名。
CA的关键功能:
生成密钥对 - CA可以独立或与客户端共同生成密钥对。
颁发数字证书 - CA在客户提供证书以确认其身份后颁发证书。 CA随后签署证书以防止修改证书中包含的详细信息。
发布证书 - CA需要发布证书,以便用户可以找到证书。有两种方法可以实现这一点。一种是发布相当于电子电话号码簿的证书。另一种是通过某种方式将证书发送给你认为可能需要的人。
验证证书 - CA在环境中提供公钥,以协助验证其在客户数字证书上的签名。
撤销证书 - 有时,由于某些原因(例如用户违反私钥或在客户端失去信任),CA撤销颁发的证书。撤销后,CA会维护环境可用的所有已撤销证书的列表。
证书类别
有四种典型的证书类别:
第1类 - 通过提供电子邮件地址可轻松获取这些证书。
第2类 - 这些证书要求提供额外的个人信息。
第3类 - 这些证书只有在对请求者的身份进行检查后才能购买。
第4类 - 它们被需要高度信任的政府和金融机构使用。
1.3 Registration Authority(RA):
CA可以使用第三方注册机构(RA)对要求证书确认其身份的人或公司进行必要的检查。 RA可能在客户端看起来像一个CA,但它们实际上并不签署发布的证书。
1.4 Certificate Management System(CMS):
这是发布证书的管理系统,暂时或永久暂停,续订或撤销证书。 证书管理系统通常不会删除证书,因为可能有必要在某个时间点证明其身份,这是出于法律原因。 CA和相关RA运行证书管理系统,以便能够跟踪他们的责任。
1.5 Private Key Tokens
虽然客户端的公钥存储在证书中,但关联的私钥可以存储在密钥所有者的计算机上。 这种方法一般不采用。 如果攻击者能够访问计算机,他可以轻松访问私钥。 出于这个原因,私钥存储在通过密码保护的安全可移动存储令牌上。
不同的供应商经常使用不同的专有的存储格式来存储密钥。 例如,Entrust使用专有的.epf格式,而Verisign,GlobalSign和Baltimore使用标准的.p12格式。
1.6 Hierarchy of CA:
由于拥有庞大的网络和全球通信的要求,所有用户从唯一一个可信的CA获得证书是不切实际的。其次,只有一个CA的可用性可能会导致大的阻碍,如果CA受到影响。
在这种情况下,层次认证模型很受关注,因为它允许在两个通信方与相同CA没有信任关系的环境中使用公钥证书。
根CA位于CA层次结构的顶部,根CA的证书是自签名证书。
直接隶属于根CA(例如,CA1和CA2)的CA具有由根CA签名的CA证书。
层次结构中下级CA(例如,CA5和CA6)下的CA具有由上级下级CA签名的CA证书。
证书颁发机构(CA)层次体现在证书链中。证书链跟踪从层次结构中的分支到层次结构根的证书路径。
下图显示了具有从实体证书到两个从属CA证书(CA6和CA3)到根证书颁发机构CA证书的证书链的CA层次结构:
验证证书链是确保特定证书链有效,正确签署和可信的过程。 以下过程验证证书链,从提供验证的证书开始 -
一个正在验证其真实性的客户端提供他的证书,通常连同证书链一直到根CA.
验证者获取证书并使用发行者的公钥进行验证。 发行人的公钥在发行人的证书中找到,该证书位于客户证书旁边的链中。
现在,如果已签署发行人证书的较高的CA由验证方信任,则验证成功并在此停止。
否则,发行人证书的验证方式与客户在上述步骤中完成的相似。 此过程将继续进行,直到在其中找到可信的CA,否则它将持续到根CA。
Part 5 哈希加密函数(哈希=散列)
1.1 哈希函数基本概念
哈希函数非常有用,并且出现在几乎所有信息安全应用程序中。
哈希函数是将数字输入值转换为另一个压缩数值的 数学函数。 哈希函数的输入具有任意长度,但输出始终为固定长度。
哈希函数返回的值称为消息摘要或简单的散列值。 下面的图片说明了哈希函数:
1.2 散列函数的典型特征:
固定长度输出(散列值)
哈希函数将任意长度的数据转换为固定长度。 这个过程通常被称为散列数据。
散列比输入数据小得多,因此哈希函数有时称为压缩函数。
由于散列是较大数据的较小表示,因此它也被称为摘要。
具有n位输出的哈希函数被称为n位哈希函数。 流行的哈希函数生成160到512位之间的值。
通常对于输入x的任何哈希函数h,h(x)的计算是一个快速操作。
计算哈希函数比对称加密快得多。
1.3 哈希函数的属性
为了成为一个有效的加密工具,哈希函数具有以下属性:
Preimage Resistant(抗原像攻击):
已知 x in X(数据摘要集合),要找出 y in Y(数据报文集合), 使得 h(y) = x 是困难的,也称为单向性(One-way)。Second Preimage Resistant(第二抗原像攻击):
已知y in Y, 找出另一个 y' in Y, 使得 h(y') = h(y) 是困难的(计算不可行)。同时也称为弱抗碰撞性(Weak Collision Resistant)。Collision-Resistant(抗碰撞性)
找出任意两个不同的 x, x' in X, 使得 h(x) = h(x') 是困难的(计算不可行)。同时也称为强抗碰撞性(Strong Collision-Resistant)
1.4 哈希算法的设计
散列的核心是一个数学函数,该函数在两个固定大小的数据块上运行以创建散列码。 这个哈希函数构成哈希算法的一部分。
每个数据块的大小因算法而异。 通常块大小从128位到512位。 下图演示了哈希函数:
哈希算法涉及上述哈希函数,如分组密码。 每一轮都会输入一个固定的大小,通常是最近消息块和最后一轮输出的组合。
这个过程重复进行多次,以散列整个消息。 哈希算法的示意图如下图所示:
因为第一消息块的散列值变成第二散列操作的输入,其输出改变第三操作的结果,等等。 这种效应被称为散列的雪崩效应。雪崩效应对两个即使是单个数据位也不相同的消息产生明显不同的散列值。理解哈希函数和算法之间的区别。 哈希函数通过对两个固定长度的二进制数据块进行操作来生成哈希码。哈希算法是一个使用哈希函数的过程,指定如何分解消息以及如何将先前消息块的结果链接在一起。
1.5 常见的哈希函数
消息摘要(MD)
很多年来,MD5是最流行和广泛使用的哈希函数。MD系列由哈希函数MD2,MD4,MD5和MD6组成。它被采用为Internet标准RFC 1321。它是一个128位散列函数。MD5摘要已被广泛用于软件世界,以保证传输文件的完整性。例如,文件服务器通常会为文件提供预先计算的MD5校验和,以便用户可以将下载的文件的校验和与其进行比较。2004年,MD5发现了碰撞。据报道,使用计算机集群只能在一个小时内成功进行分析攻击。这种碰撞攻击导致MD5受损,因此不再推荐使用。安全哈希函数(SHA)
SHA系列由四种SHA算法组成: SHA-0,SHA-1,SHA-2和SHA-3。虽然来自同一个家庭,但结构不同。原始版本是1993年由美国国家标准与技术研究院(NIST)发布的SHA-0,一种160位散列函数,它几乎没有缺点,并没有变得非常流行。
后来在1995年,SHA-1被设计用于纠正SHA-0的所谓弱点。SHA-1是现有SHA哈希函数中使用最广泛的。它被用于几个广泛使用的应用程序和协议,包括安全套接字层(SSL)安全。
2005年,发现了一种在实际时间框架内发现SHA-1冲突的方法,使SHA-1的长期可用性受到怀疑。
SHA-2系列具有四个更进一步的SHA变体,SHA-224,SHA-256,SHA-384和SHA-512,取决于其散列值中的位数。还没有成功的攻击报道过SHA-2哈希函数。
虽然SHA-2是一个强大的哈希函数。虽然有很大的不同,但其基本设计仍然遵循SHA-1的设计。因此,NIST要求提供新的竞争性散列函数设计。
2012年10月,NIST选择Keccak算法作为新的SHA-3标准。 Keccak提供了许多好处,例如高效的表现和良好的攻击抵抗力。
- RIPEMD
RIPEND是RACE完整性基元评估消息摘要的缩写。这组哈希函数是由开放研究团体设计的,通常称为欧洲哈希函数族。
该集包括RIPEND,RIPEMD-128和RIPEMD-160。此算法还有256位和320位版本。
原始的RIPEMD(128位)基于MD4中使用的设计原则,并且发现提供可疑的安全性。 RIPEMD 128位版本是解决原始RIPEMD漏洞的快速修复替代品。
RIPEMD-160是一个改进版本,是使用最广泛的版本。与RIPEMD-128和RIPEMD-160相比,256和320位版本分别减少了意外冲突的可能性,但没有更高的安全等级。
1.6 哈希函数的常见应用
Merkle Tree 默克尔树
哈希算法的一个重要应用是默克尔树(Merkle tree),默克尔树是一种数据结构,通常是一个二叉树,也有可能是多叉树,它以特定的方式逐层向上计算,直到顶部,最顶层叫做默克尔根(Merkle Root),默克尔树最为常见和最简单的是二叉默克尔树。
- 非叶子节点储存了最底层数据块的哈希值
- 中间节点储存的哈希值是下面两个非叶子节点的共同的哈希值
- Root节点存储的是两个中间节点共同的哈希值
Part 6 区块链里的密码学应用
哈希算法
比特币区块链使用的两个哈希函数分别是:1.双重SHA-256,用于完成PoW(工作量证明)。2. RIPEMD160,用于生成比特币地址。
以太坊区块链的PoW使用SHA3的keccak256。Merkle Tree 默克尔树
基于哈希值的二叉树或多叉树,在计算机领域,Merkle Tree用来进行完整性验证处理,在分布式环境下,其进行完整性验证能大量减少数据传输和计算的复杂程度。椭圆曲线算法
比特币中使用基于secp256k1椭圆曲线数学的公钥密码学算法进行签名与验证签名,一方面可以保证用户的账户不被冒名顶替,另一方面保证用户不能否认其所签名的交易。用私钥对交易信息签名,矿工用用户的公钥验证签名,验证通过,则交易信息记账,完成交易。对称加密算法
比特币官方客户端使用AES(对称分组密码算法)加密钱包文件,用户设置密码后,采用用户设置密码通过AES对钱包私钥进行加密,确保客户端私钥的安全。