前言
本文章是对《图解密码技术》一书第一部分的一个总结。
密码分类
密码算法需要密钥,根据密钥的使用方法,可以将密码分为对称密码和公钥密码两种。
对称密码 是指在加密和解密时使用同一个密码的方式。
公钥密码 则是指在加密和解密时使用不同的密钥的方式。 公钥密码又称为非对称密码。
对称密码
常见的对称密码算法有DES、三重DES、AES等等。
DES
DES是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码,现在DES已经能够被暴力破解。
DES每次只能加密64比特的数据,如果加密的明文比较长,就需要对DES加密进行迭代,迭代的具体方式就称为模式。
DES的基本结构是Feistel网络,在Feistel网络中,加密的各个步骤称为轮(round),整个加密就是若干次轮的循环,DES是一种16轮循环的Feistel网络,下图展示的是Feistel网络中一轮的计算流程。
一轮的具体计算如下:
- 将输入的数据分为左右两部分;
- 将输入的右侧直接发送到输出的右侧;
- 将输入的右侧发送到轮函数;
- 轮函数根据右侧数据和子密钥,计算出错一串看上去随机的比特序列;
- 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。
这样一轮下来,“右侧”根本没有加密,因此需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将左侧和右侧的数据对调。下图是Feistel网络3轮的加密流程:
Feistel网络的揭秘操作按照相反的顺序来使用子密钥就可以完成了,如下是Feistel网络3轮的解密流程:
总结一下,Feistel网络的轮数可以任意增加,并且加密和解密可以用完全相同的结构来实现。
三重DES
三重DES是为了增加DES难度,将DES重复3次所得到的一种密码算法,也成TDES,通常缩写3DES,其加密流程如下:
其解密流程如下:
AES
AES是取代其前任标准(DES)而成为新标准的一种对称密码算法,2000年时,Rijndael对称密码算法确定为AES。
关于Rijndael对称密码算法,这里略。
密码选择
目前通过暴力破解法能够在现实时间内完成对DES的破译,所以在选择对称密码算法时,不推荐DES。同时我们也没有理由使用三重DES,现在应该选择使用的算法是AES。
公钥密码
用对称密码进行通信时,会出现密钥配送问题,及如何将密钥安全的发送给接收者。为解决密钥配送问题,我们需要公钥密码技术。
公钥密码中,密钥分为公钥和私钥,其中公钥用来加密数据,私钥用来解密数据。
在公钥通信的过程中,数据接收者首先生成一对公钥和私钥的密钥对,然后将公钥发送给数据发送者(公钥发送过程中,可能被窃听到,不过也没有关系),然后数据发送者以接受到的公钥为密码,对数据进行加密,然后将加密的数据发送给接收者(公钥加密数据后,无法用公钥进行解密),然后接收者可以用私钥进行解密。
目前使用最广泛的公钥密码算法是RSA。
RSA
RSA的加密算法如下:
密文 = 明文^E mod N
“明文^E” 表示明文的E次方,也就是说,RSA的密文就是对代表明文的数字的E次方求 mod N的结构。
其中,E和N的组合就是公钥。
RSA的解密和加密一样简单,其公式如下:
明文 = 密文^D mod N
也就是说,对表示密文的数字的D次方求mod N就可以得到明文。
其中,D和N的组合就是密钥。
生成密钥对
接下来介绍如何生成RSA密钥对,也就是求E、D和N这个三个数。RSA密钥对的生成步骤如下:
- 求N
- 求L(L是仅在生成密钥对的过程中使用的数)
- 求E
- 求D··
求N
用伪随机生成器求p和q,p和q都是质数,N等于两质数相乘: N = p * q。
求L
L为 p-1 和 q-1 的最小公倍数: L = lcm(p-1, q-1)。
求E
1 < E < L 并且 gcd(E, L) = 1; E和L的最大公约数为1(E和L互质)
求D
1 < D < L 并且 (E * D) mod L = 1; 也就是说 选一个数D,使E乘以D,然后模L必须等于1。
备注:
当D足够大时,就不太可能在现实时间内通过暴力破解找出数D。现在RSA中所使用的p和q长度都是在1024比特以上,N的长度为2048比特以上,所有暴力破解是很难的。
除了暴力破解,可以通过对N进行质数分解,但是目前没有对大整数进行质数分解的高效算法,所有通过对N进行质数分解的方法破解RS是很难的。
混合密码系统
公钥密码有个很大的问题,就是公钥密码的处理速度远远低于对称密码,为了解决这个问题,引入了混合密码系统。
混合密码系统是将对称密码和公钥密码的优势相结合的方法,将消息通过对称密码来加密,将加密消息时使用的密钥通过公钥来加密。其流程如下:
- 接收者将公钥密码传递给发送者;
- 发送者用公钥密码加密对称密码的会话密钥;
- 发送者用会话密钥加密消息;
- 发送者将用公钥密码加密的会话密钥和用对称密码加密的消息同时发送给接收者;
- 接收者用公钥密码中的私钥解密会话密钥,获得解密消息的会话密钥;
- 接收者用会话密钥解密消息。
分组密码模式
前面在介绍对称密码时,里面介绍的几种算法都只能对固定长度的分组进行加密,当需要加密的明文长度超过密码的分组长度是,就需要对分组密码算法进行迭代,迭代的方法就称为分组密码的模式。
分组密码的模式主要有以下5种:
- ECB模式
- CBC模式
- CFB模式
- OFB模式
- CTR模式
接下来,分别来介绍这5种模式。
ECB模式
ECB模式全称是Electronic CodeBook模式。在ECB模式中,将明文分组加密后的结果将直接称为密文分组。
加密:
解密:
ECB优缺点
优点:
简单,快速,支持并行计算
缺点:
- 明文中的重复排列会反映在密文中
- 通过删除、替换密文分组可以对明文进行操作
- 不能抵御重放攻击
备注:
不推荐使用。
CBC模式
CBC模式全称Cipher Block Chaining模式(密文分组链接模式)。在CBC模式中,首先将明文分组与前一个密文分组进行XOR运算,然后在进行加密。
加密:
解密:
其中,初始化向量IV是随机产生的一个比特序列。
CBC优缺点
优点:
- 明文的重复排列不会反映到密文中
- 支持并行计算(仅解密)
- 能够解密任意密文分组
缺点:
- 加密不支持并行运算
- 对包含某些错误比特的密文进行解密时,第一个分组的全部比特及后一个分组的相应比特会出错
备注:
推荐使用
CFB模式
CFB模式全称Cipher FeedBack(密文反馈模式)。在CFB模式中,前一个密文的分组会被送到密码算法的输入端。
加密:
解密:
CFB优缺点
优点:
- 不需要填充
- 支持并行计算(仅解密)
- 能够解密任意密文分组
缺点:
- 加密不支持并行运算
- 对包含某些错误比特的密文进行解密时,第一个分组的全部比特及后一个分组的全部比特会出错
- 不能低于重放攻击
备注:
推荐使用
OFB模式
OFB模式全称Output-Feedback模式(输出反馈模式),在OFB模式中,密码算法的输出会反馈到密码算法的输入中。
加密:
解密:
OFB优缺点
优点:
- 不需要填充
- 可事先进行加密、解密的混吧
- 加密、解密使用相同结构
- 对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错
缺点:
- 不支持并行运算
- 主动攻击者反转密文分值中的某些比特时,明文分组中相对应的比特位也会反转
备注:
推荐使用
CTR模式
CTR模式全称CounTeR模式(计数器模式),CTR模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。
加密:
解密:
OFB优缺点
优点:
- 不需要填充
- 可事先进行加密、解密的混吧
- 加密、解密使用相同结构
- 对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错
- 支持并行计算(加密、解密)
缺点:
- 主动攻击者反转密文分值中的某些比特时,明文分组中相对应的比特位也会反转
备注:
推荐使用
参考
- 《图解密码技术》[日] 结城浩 著