密码学:分组密码.
分组加密(Block Cipher) 又称为分块加密或块密码,是一种对称密码算法,这类算法将明文分成多个等长的块 (Block) ,使用确定的算法和对称密钥对每组分别加密或解密。分组加密是极其重要的加密体制,如DES和AES曾作为美国政府核定的标准加密算法,应用领域从电子邮件加密到银行交易转账,非常广泛。
本质上,块加密可以理解为一种特殊的替代密码,只不过每次替代的是一大块。因为明文空间非常巨大,所以对于不同的密钥,无法制作一个对应明密文的密码表,只能用特定的解密算法来还原明文。
目录:
密码学:分组密码.
分组密码常见工作模式:
(1) ECB
(2) CBC
(3)OFB
(4)CFB
(5)CTR
费斯妥密码和DES:
(1)费斯妥密码
(2) DES
(2.1)初始置换 (Initial Permutation)
(2.2)subkeys 的生成
(2.3)轮函数
(3)AES:
(3.1)有限域
(3.2)Rijndael 密钥生成:
(3.3)AES步骤:
(3.4)常见攻击:
1.Byte-at-a-Time
2..CBC-IV-Detection
3.CBC-Bit-Flipping
分组密码常见工作模式:
密码学中,分组密码的工作模式允许使用同一个分组密码密钥对多于一块的数据进行加密,并保证其安全性。分组密码自身只能加密长度等于密码分组长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独的密码块。通常而言,最后一块数据需要使用合适填充方式将数据扩展到匹配密码块大小的长度。分组密码的工作模式描述了加密每个数据块的过程,并常常使用基于一个称为初始化向量 (lnitialization Vector,IV) 的附加输入值进行随机化,以保证安全。
对加密模式的研究曾经包含数据的完整性保护,即在某些数据被修改后的情况下密码的误差传播特性。后来的研究则将完整性保护作为另一个完全不同的,与加密无关的密码学目标。部分现代的工作模式用有效的方法将加密和认证结合起来,称为认证加密模式。
(1) ECB
ECB (Electronic Code Book,电子密码本) 是分组加密最简单的一种模式,即明文的每个块都独立地加密成密文的每个块。
如果明文的长度不是分组长度的倍数,则需要用一些特定的方法进行填充。设明文为P,密文为C,加密算法为E,解密算法为D,则ECB模式下的加密和解密过程可以表示为:
ECB模式的缺点在于同样的明文块会被加密成相同的密文块,因此不能很好地隐藏数据模式。在某些场合,这种方法不能提供严格的数据保密性,因此并不推荐用于密码协议。
(2) CBC
在CBC (Cipher Block Chaining),密码分组链接)模式中,每个明文块先与前一个密文块进行异或(XOR)后再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块;同时,为了保证每条消息的唯一性,在第1个块中需要使用初始化向量。
(3)OFB
OFB (Output FeedBack,输出反馈模式)可以将块密码变成同步的流密码,将之前一次的加密结果使用密钥再次进行加密(第1次对IV进行加密),产生的块作为密钥流,然后将其与明文块进行异或,得到密文。由于异或(XOR)操作的对称性,加密和解密操作是完全相同的。
OFB模式的公式表示为:
(4)CFB
CFB (Cipher FeedBack,密文反馈)类似OFB,只不过将上一组的密文作为下一组的输入来加密进行反馈,而OFB反馈的是每一组的输出再次经过加密算法后的输出。
CFB的加密与解密可以表示为:
(5)CTR
CTR模式 (Counter Mode,CM) 也被称为ICM模式 (Integer Counter Mode,整数计数模式)、SIC模式(Segmented nteger Counter) 。与OFB类似,CTR将块密码变为流密码,通过递增一个加密计数器来产生连续的密钥流。其中,计数器可以是任意保证长时间不产生重复输出的函数,但使用一个普通的计数器是最简单和最常见的做法。CTR模式的特征类似OFB,但允许在解密时进行随机存取。
图中的“Nonce”与其他图中的IV (初始化向量)相同。IV、随机数和计数器均可以通过连接,相加或异或使得相同明文产生不同的密文。
费斯妥密码和DES:
(1)费斯妥密码
在密码学中,费斯妥密码(Feistel Cipher)用于构造分组密码的对称结构,以德国出生的物理学家和密码学家Horst Feistel命名,通常称为Feistel网络。他在美国IBM工作期间完成了此项开拓性研究。多种知名的分组密码都使用该方案,包括DES、Twofish、XTEA、Blowfish等。Feistel密码的优点在于加密和解密操作非常相似,在某些情况下甚至是相同的,只需要逆转密钥编排即可。图是Feistel密码的加密、解密结构。
(2) DES
DES (Data Encryption Standard,数据加密标准)是一种典型的基于 Feistel 结构的加密算法,1976年被美国国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛应用。DES 是基于 56bit 密钥的对称算法,因为包含一些机密设计元素,密钥长度相对较短,并且被怀疑内含美国国家安全局(NSA)的后门,DES算法在刚推出时饱受争议,受到了严密的审查,并推动了现代的块密码及其密码分析的发展。
(2.1)初始置换 (Initial Permutation)
首先,DES会对用户的输入进行处理,称为初始置换 (nitial Permutation) ,用户的输入将会按照表的顺序进行置换。
按照表中的索引,用户输入M的第58位会成为这个过程的结果IP的第1位,M的第50位会成为IP的第2位,以此类推。下面是一个特定的输入M经过IP后的结果:
M=0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 11101111
IP 1100 1100 0000 0000 1100 1100 11111111 1111 0000 1010 1010 1111 0000 10101010
将IP分成等长的左右两部分,可以获得初始的L和R的值:
L0 1100 1100 0000 0000 1100 1100 1111 1111
R0 1111 0000 1010 1010 1111 0000 1010 1010
(2.2)subkeys 的生成
首先,传入的原始key会根据表7-3-2置换生成64位密钥。表中的第一个数为57,这意味着原始密钥key的第57位成为置换密钥key+的第1位;同理,原始密钥的第49位成为置换密钥的第2位。注意,这里的置换操作只从原始密钥取了56位,原始密钥中每字节的最高位是没有被使用的.
下面是一个输入的key被转换成置换密钥key+的一个例子:
key=00010011 00110100 01010111 01111001 10011011 10111100 11011111 11110001
key+=1111000 0110011 0010101 0101111 0101010 1011001 1001111 0001111
得到key+后,再将其分成两部分CO和DO:
C0=1111000 0110011 0010101 0101111
D0=0101010 1011001 1001111 0001111
得到C0和D0后,对CO和D0进行循环左移操作,即可得到C1 ~ C16和D1~D16的值,每一次循环移位的位数分别如下:
1122222212222221
例如,对于之前的CO和D0,第一轮对其进行循环左移一位操作,即可得到C1和D1,而在C1和D1的基础上继续循环左移一位,即可得到C2和D2。
C1=1110000110011001010101011111
D1 1010101011001100111100011110
C2=1100001100110010101010111111
D2=0101010110011001111000111101
接下来,将每组Cn和Dn进行组合,就得到了16组数据,每组数据有56位。最后将每组数据按照表的索引进行誉换,就可以得到K1~K16
比如,对于之前提到的C1D1,通过计算可以得到对应的K1:
C1D1=1110000 1100110 0101010 1011111 1010101 0110011 0011110 0011110
K1=000110 110000 001011 101111 111111 000111 000001 110010
(2.3)轮函数
DES中使用的轮函数F结构见图:
每轮的输入会进入E函数并扩展成48位,扩展的方法与前面所使用的索引替换是一样的,替换时直接按照表进行索引即可。
下面是一个输入被E函数扩展的例子:
R0=1111 0000 1010 1010 1111 0000 1010 1010
E(R0)=011110 100001 010101 010101 011110 100001 010101 010101
完成扩展后,这个输入会与对应的subkeys进行异或,得到48位的数据。这48位分为8组,每组6位,再分别去索引S1~S8数组中对应的元素。而S1~S8中元素的大小都在0~15范围,即4位。最后,这8个4位的数会被重新拼起来,成为一个32位的数据,再经过置换操作得到F函数的输出。这里的置换操作与前面没有区别,只不过是索引的表变了,所以不再赘述。
(3)AES:
AES(Advanced Encryption Standard) 又称为Rijndael加密法,是美国政府曾采用的一种分组加密标准,用来替代DES,已经被多方分析且广为全世界所使用。与DES不同,AES使用的并不是Feiste的结构,它在每轮都对全部的128位进行了加密。AES的加密过程是在一个4x4字节大小的矩阵上运作的,这个矩阵又称为“体(state) ”,其初值是一个明文区块(矩阵中的一个元素就是明文区块中的1 Byte)。
各轮AES加密循环 (除最后一轮外) 均包含4个步骤:
(1)AddRoundKey: 矩阵中的每字节都与该回合密钥 (round key) 做XOR运算,每个子密钥由密钥生成方案产生
(2) SubBytes: 透过一个非线性的替换函数,用查找表的方式把每字节替换成对应字节.
(3) ShiftRows: 将矩阵中的每个横列进行循环式移位
(4)MixColumns: 充分混合矩阵中各列的操作,使用线性转换混合每列的4字节。最后一个加密循环中省略本步骤,而以AddRoundKey取代。
因为AES的部分操作是在有限域上完成的,所以我们需要了解有限域的相关知识。
(3.1)有限域
(3.2)Rijndael 密钥生成:
AES的加密过程中用到的并不是输入的128~256位的短密钥,而是基于该短密钥生成的一系列子密钥,通过原密钥生成子密钥的算法称为Riindael密钥生成方案 (Riindael Key Schedule) 。每轮中,数据都需要与128位的子密钥异或,根据原始密钥生成各轮子密钥的过程是由Rindael密钥生成方案完成的。
(3.3)AES步骤:
(3.4)常见攻击:
1.Byte-at-a-Time
例如,对于pwnable.kr的crypto1,核心代码如下:
2..CBC-IV-Detection
3.CBC-Bit-Flipping
学习书籍:从0到1:CTFer成长之路...