首先说一下,我为什么要写密码学的博客,由于hyperledger fabric中加密算法和哈希算贯穿整个项目,所以在分析加密那部分的代码之前,我将简单的介绍一下密码学的内容。密码学的内容我将写以下几篇博文
1.初入密码学世界
2.对称加密与公钥加密
3.混合加密
4.认证、**、随机数与技术应用
5.PGP
6.SSL/TLS
7.区块链与密码学
8.椭圆曲线加密
废话不多说,我们进入初入密码学世界的内容
一、概述
1、文中将会出现的几个名词
发送者:网络消息的发送人,现在假设发送者叫”小明”
接收者:网络中接收发送者发送过来的消息的人,假设接收者叫”阿猫”
窃听者:试图拦击消息并**消息的人,窃听者叫“阿狗”
他们三者的关系如下图
在网络中这样的关系是永远存在的。下面这张图将向你展示整个过程
由上图我们可以看出,小明将明文加密成密文再发送给阿猫,但在消息传送的过程中,总会存在阿狗这样牛逼人物,把消息拦击并**,当然,有可能只是把消息拦击啦,但是**需要的时间很长,所以阿狗中途放弃了也是可能的,这就要看加密算法的强度是不是够大啦。
2、对称密码与公钥密码
对称密码:同一把**进行加解密
公钥密码:私钥加密,公钥解密
一般 公钥加密 私钥解密, 私钥签名 公钥验签
3.单项散列函数
为了防止软件被篡改,发布软件的同时发布该软件的散列值,散列值有称哈希值、密码校验、指纹和消息摘要。散列值就是用单项散列函数计算出来的值。
单项散列函数并不是保证安机密性,而是完整性,使用它可以检测数据是否被篡改过。
4.消息认证码
保证完整性的同时提供认证机制
5.数字签名
确保完整性,提供认证并防止否认的密码技术
6.伪随机数生成器
担任**生成的重要职责
现在用一张图来清晰地表示他们之间的关系
我们把上面说到的6种技术统称为密码学家的工具箱,关于他们的细节内容我们将在接下来的博客将介绍。
接着上一篇初入密码学世界,这一篇博客我们将介绍以下内容,先来一个思维导图,看看这篇博客的内容
以上内容在这篇博客中我都会详细地讲解,当然,这只是个大体的架构图,很多细节的知识点没有包含进去。
对称密码
在开篇之前,先说几个名词
比特序列:对于这个词,学过任何一门编程语言的人都不陌生,其实它就是0和1排列而成的数字
编码:将现实世界中的东西映射为比特序列的过程称为编码
XOR:看到这三个英文字母,是不是一脸懵逼呢,它的中文名叫异或
DES,AES,Rijndael这里先不解释,到讲到它们的时候再做解释
1.异或
这里,我们就简单先说一下异或,因为对称加密中它很重要
1个比特的XOR运算规则如下
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 1 = 0
1 XOR 0 = 1
XOR用符号,这玩意儿不画图,我还不好操作,下面我们还是使用XOR吧
现在我们来看个例子
0 1 0 0 1 1 0 0 ——— A
XOR
1 0 1 0 1 0 1 0 ———-B
等于
1 1 1 0 0 1 1 0 —> A XOR B
—————————————————————————————————————–
1 1 1 0 0 1 1 0 —>A XOR B
XOR
1 0 1 0 1 0 1 0 ————-B
等于
0 1 0 0 1 1 0 0 ——–>变回了 A
——————————————————————————————————————-
上面这个例子干了什么事呢,大家应该看明白了吧
将明文 A 用** B
进行加密,得到密文A XOR B
将密文 A XOR B 用** B 进行解密,得到明文 A
对于密码技术来说,“是否可以预测”是非常重要的一点,能够产生不可预测的比特序列,对于密码学技术贡献是巨大的。这种不可预测的比特序列就称为随机数。关于这个问题以后的博文中再做介绍
2.一次性密码本(维纳密码)
原理就是将明文与一串随机比特序列进行XOR运算,与上面的算法一致,不多做解释。
特点:在理论上是无法**的
由于一次性密码本并没有什么卵用,故而不在这里不多讲,有兴趣的人自己去查资料。虽然一次性密码本是一种几乎没有实用性的密码,但是,一次性密码本的思路却孕育出了流密码。流密码使用的不是真正的随机比特序列,而是伪随机数生成器产生的比特序列。流密码虽然不是无法破译的,但是只要使用高性能的伪随机数生成器,就能够构建出强度较高的密码系统。关于流密码下面会详细介绍。关于伪随机数生成器估计要在后面的博文中才能介绍。
3、DES
DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的**长度是56比特。为什么**长度只有56比特呢,原因是每隔7个比特位会设置一个用于错误检查的比特,因而其**长度是56位。
DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组。DES其实就是分组密码中的一种。
DES每次只能加密64比特的数据,如果要加密的明文长度比较长,就需要对DES加密进行迭代,迭代的具体方式成为模式(mode)
4.DES的结构(Feistel网络)
在Feistel网络中,加密的各个步骤称为轮(round),整个加密过程就是进行若干次轮的循环
总结一下,一轮的具体步骤如下
(1) 将输入的数据等分为左右两部分
(2) 将输入的右侧直接发送到输出右侧
(3) 将输入的右侧发送到轮函数
(4) 轮函数根据右侧的数据和子**,计算出一串看上去是随机的比特序列
(5) 将上一侧得到的比特序列与左侧数据进行XOR运算,并将结果做为加密后的左侧
DES的加密和解密过程很相似,只要对调**就可以,这里不多说
特点
a.轮数可以任意增加
b.加密无论用任何函数作为轮函数都可以正确解密
c.加密和解密可以用完全相同的结构来实现
4.三重DES
将DES重复三次所得到的一种密码算法,也称为TDEA。出现3DES的原因很简单,DES已经可以在短时间内暴力**啦。
5.AES/Rijndael
Rijndael是新一代密码算法—->AES
和DES一样,Rijndael算法也是由多个轮组成,每一轮分为SubBytes,ShiftRows, MixColumns,AddRoundKey四个步骤;Rijndael使用SPN结构。Rijndael的输入分组为128比特,也就是16字节
在Rijndael加密过程中,每一轮的处理为
SubBytes—>ShiftRows—>MixColumns—>AddRoundKey
而在解密时,则反过来
AddRoundKey—>MixColumns—>ShiftRows—>SubBytes
分组密码
一、分组密码的模式
分组密码:是每次只能处理特定长度的一块数据的一类算法,这里的“一块”就称为分组。此外,一个分组的比特数就称为比特长度;DES和3DES分组长度都是64比特,AES的分组长度是128比特。
流密码:对数据流进行连续处理的一类密码算法。流密码中一般以1比特,8比特或32比特等为单位进行加密与解密。
模式:分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密。而迭代的方法就称为模式。
模式有很多种,分组密码的主要模式有以下5种
ECB模式:Electronic CodeBook mode(电子密码本模式)
CBC模式:Cipher Block Chaining Mode(密码分组链接模式)
CFB模式:Cipher FeeBack Mode(密文反馈模式)
OFB模式:Output FeeBack Mode(输出反馈模式)
CTR模式:CounTeR mode(计数器模式)
在详细介绍模式之前,我们先学习几个术语
明文分组:是指分组密码算法中做为加密对象的明文。明文分组的长度与分组密码的分组长度是相等的。
密文分组:是指使用分组密码算法将明文分组加密之后所生成的密文。
文章将会提到一个词Mallory,攻击者,也就是阿狗
二.ECB模式
在ECB模式中,将明文分组加密之后的结果直接成为密文分组
对ECB模式的攻击其实很简单Mallory只要将其中分组进行对调就会出现很大的问题。只要观察一下密文,就知道明文是什么样的组合,可以以此为线索来**密码,故而ECB模式存在较大的风险。
三.CBC模式
初始化向量:当加密第一个个明文分组时,由于不存在”前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替”前一个密文分组”,这个比特序列就是初始化向量IV。
如果有一个密文分组坏了,那么解密之后将会影响两个明文的内容;CBC模式中密文分组存在缺失比特时,之后所有的明文分组都会受到影响;初始化向量如果发生比特反转,会使第一个明文分组也会受到比特反转。
三.CFB模式
密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。
与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。
四.OFB模式
输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生**流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的**流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。
五.CTR模式
计数模式(CTR模式)加密是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。
六.比较
在本篇博文中,我将讲解公钥密码以及公钥密码与对称称密码的比较
一.公钥密码
1、什么是公钥密码
公钥密码这种,**分为两种,加***与解***,发送用加***对消息进行加密,接收者用解***对密文进行解密。一般情况下,加***是公开的,称为公钥,解***是非公开的,称为私钥。公钥与私钥是一一对应的。
这样,阿狗可能拥有阿猫的公钥,但公钥并不是解密的**,故而阿狗无法完成解密操作
2.公钥密码存在的问题
公钥密码解决了**配送问题,但并不意味着它能解决所有的问题,因为我们要判断所得到的公钥是否正确合法,这个问题被称为公钥认证问题。
此外,公钥密码还有一个问题就是,它的处理速度只有对称密码的几百分之一。
3.RSA
RSA是一种广泛使用的公钥密码,可以被用于公钥密码和数字签名
3.1.RSA加密
在RSA中,明文、**、密文,RSA可以用下面这个公式来加密
E和N是RSA的加***,也就是说,E和N组合就是公钥,一般会写成“公钥是(E, N)或者“公钥{(E, N}”
3.2.RSA的解密
RSA的解密和加密一样简单,也是一个公式
D和N的组合是私钥,只有知道D和N两个数组合起来才能够完成解密运算
3.3生成**对
E和N是公钥,D和N是私钥,因此求E、D和N这三个数就是生成**。RSA**生成步骤如下
(1).求N
(2).求L
(3).求E
(4).求D
(1).求N
a.准备两个很大的质数p和q (用伪随机数生成器生成)
b.N = p x q (p和q为质数)
(2).求L
L=lcm(p-1, q-1) (L是p-1和q-1的最小公倍数)
(3).求E
gcd(E, L) = 1(1 < E < L) E和L的最大公约数必须为1(E和L互质)
到目前为止我们已经求出E和N,也就是说我们已经生成**中的公钥
(4).求D
数D是由数E计算得到的。D、E和L必须具备以下关系
1 < D < L
E x D mod L = 1
到此为止我们也可以生成私钥啦。整个过程如下图
4.对RSA的攻击
咱们先来整理一下攻击者知道那些信息,不知道那些信息
【攻击者知道的信息】
密文:可以通过窃听来获取
数字E和N:公开的信息,因此破译者知道E和N
【密码破译者不知道的信息】
明文:需要破译的内容
数字D:私钥中至少D是不知道的东西
其他:p、q和L
**方式一
暴力**D:D的长度足够长的话,想找D的值难度很大,这种方法不现实。
**方式二
通过E和N求出D:E x D mod L = 1; L = lcm(p-1, q-1),p和q无法知道,N=p x q,可以对N做质因数分解,但是如果N是大整数,现在还没有很好的算法,这种方法不现实;但如果质因数分解求q和p,恭喜你,你已经**RSA啦
**方式三
通过推测p和q:这还是有可能的,如果推测出来,也恭喜你,你已经**RSA啦
5.中间人攻击
这种方法虽然不能**RSA,但却是一种针对机密性的有效攻击,看下图你就明白
6.选择密文攻击
选择密文攻击一般是通过提示信息去尝试解密,使用RSA-OAEP,RSA-OAEP会在加密明文前生成一些认证信息,包括明文的散列值和一定数量的0,然后再对填充后的明文用RSA加密。这样攻击者就无法得到解密提示的相关信息
7.其他公钥密码
(1)ElGamal方式
(2)Rabin方式
(3)椭圆曲线密码
我们都知道,对称密码和混合密码,各有各的优点,也各有缺点。而将他们组合到一起,的确是一种不错的选择。取对称密码之长补公钥密码之不足,取公钥密码之长补对称密码之不足,下面我们将开启混合加密之旅。
一、概述
用对称密码来加密明文,用公钥密码来加密对称密码中所使用的**。通过使用混合密码系统,就能够将在通信中对称密码与公有密码的优势结合起来。
二、加密
混合密码系统中会先用对称密码来对消息进行加密,这样消息就被转换为密文,从而保证消息的机密性,然后我们只要保证对称密码的机密性就可以啦。用公有密码对加密消息时使用的对称密码的**进行加密。由于**比较短,公钥密码速度慢的问题就得以解决啦。
混合密码系统组成机制
1.用对称密码加密消息
2.用伪随机数生成器生成对称密码加密中使用的会话**
3.用公钥密码加密会话**
4.从混合密码系统外部赋予公钥密码加密中使用的会话**
会话**:是指为本次通信而生成的临时**,它一般是由伪随机数生成器产生。伪随机数生成器所产生的**同时也会被传递给右半部分,做为对称加密的**使用
会话**的双重性:a.对称密码的**,b.公钥密码明文
三、解密
解密是加密的逆过程,不多说
四、高强度的混合密码系统具备的条件
1.良好的伪随机数生成器算法
2.高强度的对称密码算法,并确保**有足够的长度,选用合适的分组模式
3.高强度的公钥密码算法,并确保**有足够的长度
4。**长度要平衡公钥密码强度应该要高于对称密码,因为公钥被**,从过去到未来的通信都能够被**
下面图片是要讲的知识点。
一、单向散列函数
现在假设小明以前写来一个文件保存到硬盘,它的文件可能面临被攻击之后遭到篡改,那它怎么证明现在他手上的文件没有遭到篡改的呢?文件是真的,“是真的”的性质称为完整性,也称为一致性。
怎么保证文件一致性,也许我们会想到,把文件复制一份到硬盘,到要用文件的时候对比一下不就行了吗。那么如果文件很大的时候咋办,这样效率非常低。而我们这儿要介绍的单向散列函数就可以解决这个问题。
1.什么是单向散列函数
单向散列函数:有一个输入和输出,其中输入称为消息,输出称为散列值。单向散列函数可以根据消息的内容计算出散列值,而散列值可以用来检查消息的完整性。单向散列函数也称为消息摘要、哈希函数或者杂凑函数。输入单向散列函数的消息也称为原像。单向散列函数输出散列值也称为消息摘要或者指纹。完整性也称为一致性。
这里的消息不一定是人类能读懂的文字,也可能是声音和图片等。无论是任何消息,单向散列函数都会将它作为单纯的比特序列来来处理,即根据比特序列计算出散列值。散列值的长度总是固定的。
2.单向函数的性质
a.根据任意长度的消息计算出固定长度的散列值; b.能够快速计算出散列值; c.消息不同散列值也不同(这里有可能两个不同的消息会产生同一个散列值)
3.碰撞
两个不同的消息产生同一个散列值的情况称为碰撞。如果要将单向散列函数用于完整性的检查,则需要确保事实上不可能人为地发现碰撞。
难以发现碰撞的性质称为抗碰撞性,密码学中所使用的单向散列函数,都需要具备抗碰撞性。当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值得消息特别困难,这一性质称为弱抗碰撞性。单向散列函数必须具有弱抗碰撞性。
和弱抗碰撞性相对的,还有强抗碰撞性,所谓强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。在这里,散列值可以是任意值。
4.单向性
5.单向函数的具体实例
MD4:能够产生128比特的散列值,由于有人找出了MD4的散列碰撞方法,现在已经不安全。
MD5:能够产生128比特的散列值,MD5的强抗碰撞性已经被攻破,现在已经不安全。
SHA-1:能够产生160比特的散列值,强抗碰撞性在2005年已经被攻破,已经被列入”谨慎使用密码清单“
SHA-2:由SHA-224、SHA-256、SHA-512/224、SHA-512/256、SHA-384、SHA-512组成,还处于安全阶段
RIPEMD-160:包括RIPEMD-128、RIPEMD-256、RIPEMD-320等 ,60比特的散列函数,RIPEMD-160已经被列入”谨慎使用密码清单,RIPEMD强抗碰撞性在2006年已经被攻破。RIPEMD-160不知道被攻破了没有,比特币中使用的就是RIPEMD-160。
SHA-3:新一代的单向散列函数,目前最安全的,以太坊中使用的就是SHA-3算法。
6.Keccak算法被SHA-3的的理由
采用了与SHA-2完全不同的结构;结构清晰,易于分析;能够适用于各种设备,也适用于嵌入式应用;在硬件上的实现显示出了很高的性能;比其他入选算法安全性边界会更大。Keccak可以生成任意长度的散列值,但是为了配合SHA-2的散列长度,SHA-3标准中规定了SHA-3-224、SHA-3-256、SHA-3-384、SHA-3-512
四个版本。关于.Keccak算法这里不多说。
7.单向散列函数不能解决的问题
单向散列函数能够辨别”篡改”,但无法识别“伪装”。
二.消息认证
1.什么是消息认证码
消息认证码:是一种确认完整性认证的技术,英文缩写MAC。
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的**,它可以输出固定长度的数据,这个数据称为MAC值。计算MAC值必须持有共享**,没有共享**的人就无法计算出MAC值,消息认证码正是利用这一性质来完成认证的。哪怕是1比特的改变,都会使MAC发生变化。消息认证码是一种与**相关联的单向散列函数
2.消息认证码的使用步骤
a.发送银行事先与接收银行共享**
b.发送银行根据汇款请求消息计算MAC值(使用共享**)
c.发送银行将汇款请求消息和MAC值两者发送给接收银行
d.接收银行根据接收到的汇款请求消息计算MAC值(使用共享**)
e.接收银行将自己计算出来的MAC值和发送银行发送过来的MAC值进行对比
f.如果两个MAC值一致,则认证成功;如果不一致,则认证失败。
3.消息认证码的应用实例
Swift:环球银行金融电信协会,银行与银行之间通过swift来传递消息。SWIFT中就使用来消息认证码
IPsec:IP协议,对通信内容的认证和完整性校验都是采用消息认证码来完成。
SSL/TLS:对通信内容的认证和完整性校验采用消息认证码
4.消息认证码的实现方法
a.使用单向散列函数实现:使用SHA-2之类的单向散列函数可以实现消息认证码。
b.使用分组密码实现:使用AES之类的分组密码可以实现消息认证码。具体看分组密码博文。
5.认证加密
认证加密是一种将对称密码与消息认证码相结合,同时满足机密性、完整性和认证三大功能的机制
Encrypt-then-MAC:这种方式是先用对称加密将明文加密,然后计算密文的MAC值。在Encrypt-then-MAC方式中,消息认证码的输入消息是密文。通过MAC值就可以判断这段密文的确是由知道明文和**的人生成。
GCM:是一种认证加密方式,GCM使用AES等128比特分组密码的CTR模式,并且使用一个反复进行加密和乘法运算的散列函数来计算MAC值。专门用于消息认证码的GCM称为GMAC。
HMAC:是一种使用单向散列函数来构造消息认证码的方法(RFC2104),其中HMAC的H就是Hash的意思
HMAC使用的单向散列函数并不局限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出新的单向散列函数,也同样可以使用。
6.对消息认证码的攻击
重放攻击(看下图)
**推测攻击
对于消息认证码来说,应保证不能根据MAC值来推测出双方通信使用的**。
三.数字签名
通过数字签名可以识别伪装,,还可以防止否认。