一、对称密码(共享钥匙密码)—用相同的密钥进行加密和解密
1.何为编码?
将现实世界的东西映射为比特序列的操作称为编码(encoding)。例如midnight这个词,我们就可以对其中每个字逐一进行编码,这种编码规则叫做ASCII。
2.XOR
0 XOR 0 = 0
0 XOR 1 = 0
1 XOR 0 = 1
1 XOR 1 = 0
也就是说相同则为0,不同则为1。
将结果与其中一项重新新异或(XOR),可以还原另外一项。
用于与铭文异或的随机比特序列就是密钥,与明文异或得到的结果就是密文,将密钥重新与密文异或可以得到明文。
3.一次性密码本
号称永远不会被破译的加密方式,事实上的确是这样。然而没卵用,就是将保护明文变成了保护与明文相同长度的密钥,没有根本性解决问题。
4.DES(Data Encryption Standard)
DES已经能够被暴力破解。所以不推荐使用哦。
DES是以64比特的明文为一个单位进行加密的,这个64比特的单位称为分组。
它的密钥长度是56比特,尽管从规格上说,DES密钥长度是64比特,但由于每隔7比特就会设置一个用于错误检查的比特,实质上是56比特。
DES的结构(Feistel网络)
Feistel网络中,加密的各个步骤称为轮(round),整个加密过程就是若干次轮的循环。
DES是一种16轮循环的Feistel网络。
DES一轮的具体计算步骤如下:
- 将输入的数据等分为左右两部分。
- 将输入的右侧直接发送到输出的右侧。
- 将输入的右侧发送到轮函数。
- 轮函数根据右侧数据和子密钥,计算出一串看上去随机的比特序列。
- 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。
通过上面的步骤来看,“右侧”根本就没有加密,因此需要每两轮处理只见将左侧和右侧数据对调。
用相同的子密钥重新运行一轮即可还原。
加密和解密使用完全相同的结构来实现。
5.三重DES
三重DES是为了增加DES的强度,将DES重复三次所得到的一种密码算法,也称为TDEA,通常缩写为3DES。
三重DES并不是进行三次DES加密(加密-加密-加密),而是(加密-解密-加密)。这是IBM公司设计出来的,目的是为了让三重DES能够兼容普通的DES(三次密钥相同即为普通的DES,但是浪费运算。)
三重DES的解密与加密完全相反,为(解密-加密-解密)。
6.AES
1997年,NIST开始公开募集AES。
AES的选拔,不仅考虑一种算法是否存在弱点,算法的强度,实现的容易性等也在考虑范围内。不仅加密本身的速度要快,密钥准备的速度也很重要。此外,还需要能够在各种平台上有效工作。
2000年,Rijindeal力压群雄,被NIST选定为AES标准。
在AES规格中,分组长度固定为128比特,密钥长度有128、192和256比特三种。
与DES一样,Rijindeal算法也是由多个轮构成,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共四个步骤。
AES没有使用Feistel网络作为基本结构,而是使用了SPN结构。
AES一轮的步骤如下:
- SubBytes 逐字节(1字节为8比特)替换,(在字节中对比特进行替换)4*4=16字节。
- ShiftRows处理,这一步是将以4字节为单位的row按照一定的规则向左平移,且每一行平移的字节数是不同的。
- MixColumns处理,这一步是对一个4字节的值进行比特运算,将其变为另外一个4字节的值。
- 最后需要将MixColumns的输出与轮密码进行XOR,即AddRoundKey处理。
AES需要重复进行10~14轮计算。
AES的解密就是将上述步骤反过来。
二、分组密码的模式 —分组密码是如何迭代的
DES和AES都属于分组密码,他们只能加密固定长度的明文。如果需要加密任意长度的明文,就需要对分组密码进行迭代,而分组密码迭代的方法就成为分组密码的“模式”。
分组密码有多种模式,如果模式选择不恰当,就无法充分保证机密性。
1.分组密码和流密码
分组密码是每次只能处理特定长度的一块数据的一类密码算法,这里的“一块”就称为分组。此外,一个分组的比特数就称为分组长度。
如DES和三重DES的分组长度都是64比特,AES将128比特明文转化为128比特密文。
DES将64比特明文转换为64比特密文,AES将128比特明文转化为128比特密文。
流密码是对数据进行连续处理的一类密码算法。流密码一般以1比特、8比特或32比特等为单位进行加密和解密。
分组密码处理完一个分组就结束了,因此不需要通过内部状态记录它加密的进度;相对的,流密码是对一串数据流进行连续处理,因此需要保持内部状态。
上面的介绍中,只有一次性密码本属于流密码,DES和AES都属于分组密码。
2.什么是模式?
明文长度超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密,而迭代的方法就称为分组密码的模式。
如果明文很长的话,将明文分割成若干个分组再进行逐个加密,这种方式就是ECB模式,ECB模式是很蠢的,千万不要用ECB模式!
3.明文分组和密文分组
明文分组是指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
密文分组是指使用分组密码算法将明文分组加密之后所生成的密文。
4.模式
1.ECB模式
ECB模式,将明文分组加密后的结果直接称为密文分组。可以将其看做一个巨大的“明文分组-密文分组”的对应表,因此ECB被称为电子密码本模式。
2.CBC模式
CBC模式叫做密文分组链接模式,之所以叫这个名字,是因为密文分组像链条一样互相连接在一起的。
在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。
当加密第一个明文时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组长的的比特序列来代替“前一个密文分组”。这个比特序列称为初始化向量(initalization Vector),通常缩写为IV。
一般来说,每次加密时都会随机生成一个不同的比特序列来作为初始化向量。
CBC模式如果有一个分组损坏了,最多之后有两个分组受到影响。如果有一些比特缺失了,缺失比特之后的密文分组都无法破解了。
3.CFB模式
CFB模式全称是密文反馈模式。
在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思。
与CBC模式不同的是,CBC先异或再加密,CFB先加密再异或。
4.OFB模式
OFB模式全称是输出反馈模式。
在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
就是将初始化向量一直加密,每加密一次就将加密结果与一组明文进行异或一次得到一组密文。
5.CTR模式
CTR模式全称是计数器模式。
CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
也就是将计数器CTR加密后与明文进行异或得到密文分组,然后下次将计数器CTR+1再加密后与下一组明文进行异或得到下一组密文分组。
6.模式对照表
模式 | 全称 | 优点 | 缺点 | 备注 |
---|---|---|---|---|
ECB模式 | 电子密码本模式 |
1.简单 2.快速 3.支持并行运算 |
1.明文中的重复排列会反映在密文中。 2.通过删除、替换密文分组可以对明文进行操作。 3.对包含某些比特的错误的密文进行解密时,对应的分组会出错。 4.不能抵御重放攻击。 |
不应使用 |
CBC模式 | 密文分组链式模式 |
1.明文的重复排列不会反映在密文中 2.支持并行运算(仅解密) 3.能够解密任意密文分组 |
1.对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错。 2.加密不支持并行计算 |
CRYPTREC推荐 实用密码学推荐 |
CFB模式 | 密文反馈模式 |
1.不需要填充 2.支持并行计算(仅解密) 3.能够解密任意密文分组 |
1.加密不支持并行计算 2.对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个相应比特会出错。 3.不能抵御重放攻击。 |
CRYPTREC推荐 |
OFB模式 | 输出反馈模式 |
1.不需要填充 2.可事先进行加密、解密的准备 3.加密、解密使用相同结构 4.对包含某些错误比特的密文进行解密时,只有明文中对应的比特会出错。 |
1.不支持并行计算 2.主动攻击反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 |
CRYPTREC推荐 |
CTR模式 | 计数器模式 |
1.不需要填充 2.可事先进行加密、解密的准备 3.加密、解密使用相同结构 4.对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错。 5.支持并行计算(加密、解密) |
1.主动攻击者反转密文中的某些比特时,明文分组中相对应的比特也会被反转。 |
CRYPTREC推荐 实用密码学推荐 |
三、公钥密码 —用公钥加密,用私钥解密
1.什么是公钥密码?
公钥密码中,密钥分为加密秘钥和解密秘钥两种。
1.发送者只需要加密密钥。
2.接收者只需要解密密钥。
3.解密密钥不可以被窃听者获取。
4.加密密钥被窃听者获取也没关系。
公钥密码也有不同的称谓,如非对称密码。
它的处理速度只有对称密码的几百分之一。
RSA利用大数质因数分解的难度。
EIGamal利用mod N下求离散对数的困难度。
Rabin利用mod N下求平方根的困难度。
椭圆曲线密码 利用了乘法运算的逆运算非常困难的这一特性。它的特点是所需的秘钥长度比RSA短。
四、混合密码系统 —用对称密码提高速度,用公钥密码保护会话密钥。
五、单向散列函数
1.什么是单向散列函数?
单向散列函数有一个输入和一个输出,其中输入称为消息,输出称为散列值。
单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性。
2.单向散列函数的性质
1.根据任意长度的消息计算出固定长度的散列值。
2.能够快速计算出散列值
3.消息不同散列值也不同
难以发现碰撞的性质称为抗碰撞性。单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的。这一性质称为弱抗碰撞性。和弱抗碰撞性相对的,还有强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质。密码技术中所使用的单向散列函数,不仅要具备弱抗碰撞性,还必须具备强抗碰撞性。
4.具备单向性
单向散列函数必须具备单向性。单向性指的是无法通过散列值反算出消息的性质。
3.关于术语
单向散列函数也称为消息摘要函数、哈希函数或者杂凑函数。
输入单向散列函数的消息也称为原像。
单向散列函数输出的散列值也称为消息摘要或者指纹。
完整性也称为一致性。
4.单向散列函数的实际应用
- 检测软件是否被篡改。
- 基于口令的加密
- 消息认证码
- 数字签名
- 伪随机数生成器(密码技术中所使用的随机数要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。)
- 一次性口令
5.单向散列函数的具体例子
1.MD4和MD5
MD是Message Digest(消息摘要)的缩写。
MD4和MD5的强抗碰撞性已经被攻破,因此已经不安全了。
2.SHA-1、SHA-256、SHA-384、SHA-512
SHA-1、SHA-256、SHA-384、SHA-512都是由NIST(National Institute of Standards and Technology 美国国家标准技术研究所)设计的。
SHA-1的强抗碰撞性已经被山东大学王小云于2005年攻破。
SHA-2还尚未被攻破。
3.RIPEMED-160
RIPEMED的强抗碰撞性已经于2004年被攻破,但RIPEMED-160还未被攻破,顺便一提,比特币中使用的就是RIPEMED-160。
4.SHA-3
即Keccak算法,是NIST采取公开竞争的方式向世界征集的。
Keccak的结构为海绵结构。
Keccak的海绵结构中,输入的数据在进行填充之后,要经过吸收阶段和挤出阶段,最终生成输出的散列值。
吸收阶段的流程如下:
- 将经过填充的输入消息按照每r个比特为一组分割成若干个输入分组。
- 首先,将“内部状态的r个比特”与“输入分组1”进行XOR,将其结果作为“函数f的输入值”。
- 然后,将“函数f的输出值r个比特”与“输入分组2”进行XOR,将其结果再次作为“函数f的输入值”。
- 反复执行上述步骤,直到到达最后一个输入分组。
- 待所有输入分组处理完成后,结束吸收阶段,进入挤出阶段。
函数f的作用是将输入的数据进行复杂的搅拌操作并输出结果(输入和输出的长度均为b=r+c个比特),每次被吸收的输入分组长度为r个比特,因此r被称为比特率。c个比特是不受输入分组内容直接影响的(但会通过函数f受到间接影响)。这里c被称为容量。
挤出阶段的流程如下:
- 首先,将“函数f的输出值中的r个比特”保存为“输出分组1”,并将整个输出值(r+c个比特)再次输入到函数f中。
- 然后,将“函数f的输出值中的r个比特”保存为“输出分组2”,并将整个输出值(r+c个比特)再次输入到函数f中。
- 反复执行上述步骤,直到获得所需长度的输出数据。
无论是吸收阶段还是挤出阶段,函数f的逻辑本身完全是相同的,每执行一次函数f,海绵结构的内部状态都会被搅拌一次。
c的意义在于放置将输入消息中的一些特征泄露出去。
双工结构,输入和输出是以相同的速率进行的。通过双工结构,Keccak不仅可以用于计算散列值,还可以覆盖密码学家的工具箱中的其他多种用途,如伪随机数生成器、流密码、认证加密、消息认证码等。
六、消息认证码 —消息被正确发送了吗
可用单向散列函数、AES之类的分组密码、流密码和公钥密码都可以实现消息认证码。
七、数字签名 —消息到底是谁写的?
数字签名和公钥密码的密钥使用方式对比:
私钥 | 公钥 | |
公钥密码 | 接收者解密时使用 | 发送者加密时使用 |
数字签名 | 签名者生成签名时使用 | 验证者验证签名时使用 |
谁持有密钥? | 个人持有 | 只要需要,任何人都可以持有 |
八、证书
1.什么是证书?
公钥证书其实和驾照很相似,里面有姓名,组织,邮箱地址等个人信息,以及属于此人的公钥,并由认证机构(CA)施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定该公钥的确属于此人。公钥证书也简称为证书。
2.证书的应用场景
认证机构必须是可信的第三方
- Bob生成密钥对。
- Bob在认证机构注册自己的公钥。
- 认证机构用自己的私钥对Bob的公钥施加数字签名并生成证书。
- Alice得到带有认证机构数字签名的Bob的公钥(证书)。
- Alice使用认证机构的公钥验证数字签名,确认Bob的公钥的合法性。
- Alice用Bob的公钥加密消息并发送给Bob。
3.公钥基础设施
1.什么是公钥基础设施?
公钥基础设施是为了能够更有效地运用公钥而指定的一系列规范和规格的总称PKI。
2.PKI的组成要素
1.用户 —-使用PKI的人
用户就是像Alice、Bob这样使用PKI的人,用户包括两种:一种是希望使用PKI注册自己公钥的人,另一种是希望使用已注册的公钥的人。
【注册公钥的用户所进行的操作】
- 生成密钥对(也可以由认证机构生成)
- 在认证机构注册公钥
- 向认证机构申请证书
- 根据需要申请作废已注册的公钥。
- 解密接收到的密文
- 对消息进行数字签名
【使用已注册公钥的用户所进行的操作】
- 将消息加密后发送给接收者
- 验证数字签名
2.认证机构 —-颁发证书的人
【认证机构所做的操作】
- 生成密钥对(也可以由用户生成)
- 在注册公钥时对本人身份进行验证
- 生成并颁发证书
- 作废证书
3.仓库 —-保存证书的数据库
仓库是一个保存证书的数据库,PKI用户在需要的时候可以从中获取证书,它的作用有点像打电话时用的电话本。仓库也叫作证书目录。