赞
踩
目录
今天,我们大部分时间都生活在互联网上。无论是存储我们的个人信息、娱乐、购物还是处理我们的工作,我们的社会都越来越依赖于互联网。
对互联网的依赖意味着信息安全比以往任何时候都更加重要。一旦信息被恶意窃取,将会产生严重的后果,可以具体到个人,也可能危及一个国家。用户需要知道他们的敏感数据是受到保密的、未修改的,并且被授权者可以随时访问。
数据加密只是网络安全武器库中的一种武器,但它是最古老和最常用的武器之一。本文讨论了最经典的DES加密算法,让我们开始吧!
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
DES算法是一种分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位) 对64比特的数据分组(二进制数据) 加密,产生64位密文数据;DES也是一种对称密码体制,在加密和解密的过程中使用相同的密钥,解密和加密使用同一算法(在硬件与软件设计时有利于加密单元的重用)。在将明文分块为64位后,DES算法就是一个把64位的明文输入块变为64位密文输出块的算法,它所使用的密钥也是64位(其实只使用到了56位,其余8位为奇偶校验位),按替代或交换的方式形成密文组。
DES算法的入口参数有三个: Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥: Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密
DES 基于 Feistel 块密码,称为 LUCIFER,由 IBM 密码学研究员 Horst Feistel 于 1971 年开发。DES 使用 16 轮 Feistel 结构,每轮使用不同的密钥。
1973年,美国国家标准计算研究所(NIST)征求对称加密算法方案,IBM提交了自己的算法;
1977年,IBM的算法(Luciffer算法)被正式采用,成为数据加密标准:Data Encryption Standard即DES算法;
DES公布后,就被质疑算法密钥比较短,只有56位,迭代次数少,很容易受到密码分析手段和暴力破解的攻击,同时,也有人被怀疑DES内部存在NSA(美国国家安全局)安置的后门,他们担心DES中的几个结构(S 盒)可能有一些秘密后门,使国家安全局 (NSA) 能够解密密钥要求之外的消息。后来 IBM 的设计者解释了这些内部机制是为了避免差分密码分析而设计的;
1998年,出现DES算法破译机,DES算法被攻破,宣告不安全;
1999年,NIST公布新标准3DES,3DES取代DES,DES作为遗留系统的加密手段被废弃;
DES 的统治地位在 2002 年结束,当时高级加密标准 (AES) 取代 DES 加密算法成为公认的标准,随后公开竞争寻找替代品。NIST 于 2005 年 5 月正式撤回了 FIPS 46-3(1999 年的重申),尽管 Triple DES (3DES) 在 2030 年之前仍被批准用于敏感的政府信息。
虽然DES被取代了,但是DES的CBC工作模式是基础性的算法和工作模型,有很强的意义,在遗留系统中也有一些使用的。
DES加密解密首先要准备好由64位密钥(8位为校验位)转换得到16组子密钥,每个密钥长32位。
16个子密钥生成
64位的初始密钥,密钥只包括56位,剩余的位在硬件中用作奇偶校验,在软件中可直接忽略,初始密钥通过长为56的PC1置换矩阵进行置换(丢弃了8位):
[
57, 49, 41, 33, 25, 17, 9,
1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27,
19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15,
7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29,
21, 13, 5, 28, 20, 12, 4,
]
将置换后的56位的密钥分为两个28位的组。然后,针对每个子密钥,根据子密钥的序列值(也就是16个子密钥中的第i个)旋转这两组值,旋转的位数在左移表中查找:
KEY_MOVE = [1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1]
然后重新合并为56位。之后再按照PC2置换矩阵对重组后的密钥进行置换,使56位的子密钥缩小为48位(丢弃了8位),这个排列过程就称为置换选择。
[
14, 17, 11, 24, 1, 5, 3, 28,
15, 6, 21, 10, 23, 19, 12, 4,
26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40,
51, 45, 33, 48, 44, 49, 39, 56,
34, 53, 46, 42, 50, 36, 29, 32
]
针对16个子密钥,每个子密钥重复一次该过程。这里的目的是保证将初始密钥中的不同位在每一轮排列后应用于加密的数据上。最终得到16个子密钥K
准备好子密钥后,再进行明文的加密解密:将明文分组,每组56位,最后一组不足56位的向前补零;对一组明文进行初始置换,即通过位置的替换,将56位文组转换位64位分组,并将64位分组分成左右两个组L0和R0各32位,一次对两组进行16轮的F运算,其中会使用到之前准备的16个子密钥,最后将两组合并得到64位的组,在经过最后一次逆置换将其转换位56位的密文组。按顺序将密文分组拼接即可得到密文。
在初始变换中,使用到的变换矩阵M如下:
[
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
]
其从左到右,从上到下依次数共64个,表中第i个数据1<=M[i]<=64,M[i]表示原始数据中第M[i]个数置换到第i位。逆置换的矩阵为
[
40, 8, 48, 16, 56, 24, 64, 32,
39, 7, 47, 15, 55, 23, 63, 31,
38, 6, 46, 14, 54, 22, 62, 30,
37, 5, 45, 13, 53, 21, 61, 29,
36, 4, 44, 12, 52, 20, 60, 28,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25
]
每一轮以Li-1和Ri-1开始,在前15轮中有:
最后一轮为:
在F运算中,ki为第i个子密钥,F运算分为四个阶段:
[
32, 1, 2, 3, 4, 5,
4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13,
12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21,
20, 21, 22, 23, 24, 25,
24, 25, 26, 27, 28, 29,
28, 29, 30, 31, 32, 1
]
该置换的主要目的是在加密数据的过程中制造一些雪崩效应,使用数据块中的1位将在下一步操作中影响更多位,从而产生扩散效果。
[
[
[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7],
[0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8],
[4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0],
[15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13]
],
[
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10],
[3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5],
[0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15],
[13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9]
],
[
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8],
[13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1],
[13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7],
[1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12]
],
[
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15],
[13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9],
[10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4],
[3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14]
],
[
[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9],
[14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6],
[4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14],
[11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3]
],
[
[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11],
[10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8],
[9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6],
[4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13]
],
[
[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1],
[13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6],
[1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2],
[6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12]
],
[
[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7],
[1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2],
[7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8],
[2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]
]
]
第j(j=1...8)个S盒从Rint的6(j-1) 到 6(j-1)+6 的位置取出6位,并为其在S[j]表中查出1个4位的值,该值为取出这6位压缩后的结果。通过前面取出的6位值,根据第1位和最后1位组成的2位值找到S[j]中的行号,而根据中间剩下的4位来确定S[j]中的列号。例如,若Rint中的第3个6位组是101011。因此对应S[3]表中,行号等于11 = 3,列号等于0101= 5 得到结果为8,转换为二进制位0100。S盒压缩为数据增加了不确定性,除了给DES带来安全性外,没什么特别的。
[
16, 7, 20, 21, 29, 12, 28, 17,
1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9,
19, 13, 30, 6, 22, 11, 4, 25
]
如果 bj 代表Rint中的第j个6位组,Sj 代表第j个S盒,而P代表P盒置换,则3、4阶段可以用函数f表示:
注意,解密过程同加密过程相同,只需要将子密钥按照逆向的顺序(16-1)对密文进行处理
从本质上来说,DES的安全性依赖于虚假表象,从密码学的术语来讲就是依赖于“混淆和扩散”的原则。混乱的目的是为隐藏任何明文同密文、或者密钥之间的关系,而扩散的目的是使明文中的有效位和密钥一起组成尽可能多的密文。两者结合到一起就使得安全性变得相对较高。
扩散就是指使明文的统计特征消散在密文中,这可以通过让每个明文数字尽可能地影响多个密文数字获得,等价于说每个密文数字被许多明文数字影响。混淆则是尽可能使密文和加密密钥间的统计关系更加复杂,以阻止攻击者发现密钥,从而导致明文的统计结构消失,密文中各字母的出现频率趋于一致,无法通过统计方法来破解密文。注意简单的线性代替函数几乎增加不了混淆,而需要尝试复杂代替算法。
DES算法具体通过对明文进行一系列的排列和替换操作来将其加密。过程的关键就是从给定的初始密钥中得到16个子密钥的函数。要加密一组明文,每个子密钥按照顺序(1-16)以一系列的位操作施加于数据上,每个子密钥一次,一共重复16次。每一次迭代称之为一轮。要对密文进行解密可以采用同样的步骤,只是子密钥是按照逆向的顺序(16-1)对密文进行处理。
S-boxes 和 P-boxes 用于增加数学的复杂性,连同一个密钥使得确定一些输入位和每个输出位之间发生的实际映射变得非常困难。真正触及问题核心的是 S-box 的设计原理/标准。
在密码学中,雪崩效应是密码算法的理想属性,通常是块密码和密码哈希函数,其中如果输入略有变化(例如,翻转一位),输出会显着变化(例如,一半输出位翻转)。在高质量分组密码的情况下,密钥或明文的如此小的变化应该会导致密文发生剧烈变化。
仅执行扩散或混淆的密码都不是安全的,比如移位密码或第二次世界大战使用的密码机 Enigma。这两个密码都是仅执行扩散的密码。然而,将扩散操作串联起来就可以建立一个更强壮的密码。将若干加密操作串联起来的思想也是 Shannon 提出的,这样的密码也叫乘积密码(Product cipher)。目前,所有的分组密码都是乘积密码,因为它们都是由对数据重复操作的轮组成的。迭代轮数越多,密码分析就越困难。迭代轮数的选择标准是使密码分析的难度大于简单穷举攻击的难度。有学者观察到,对于16轮选代的DES,差分密码分析比穷举攻击的效率要差一点;差分密码分析需要 2^55.1次操作,而穷举攻击平均则需要 2^55次操作。如果 DES 只有15 层选代或更少,差分密码分析比穷举攻击效率就要高一些。
Feistel密码的核心是函数 F。函数F给 Feistel密码注入了混淆的成分,F 的明显标准是非线性,任何形式的分析就会越困难,越难将F近似表示为某些线性等式,F的非线性度就越高。
设计F时还应考虑其他几个标准。我们希望算法有较好的雪崩效应,即输入的一位变化应该引起输出的很多位变化。一个更严格的定义是严格雪崩效应准则SAC(Strict Avalanche Criterion),参见文献[WEBS86],即对于所有的i和,它要求若S 盒的输入的任意一位i发生变化,输出的任意位i发生变化的可能性为 1/2(参见附录S 中关于S 盒的讨论)尽管 SAC是对S盒而言的,作为个标准它同样适用于整个F函数。当F中不含S盒时,这条准则是很重要的。文献[WEBS86]中建议的另一项标准是 BIC标准(BitIndependent Criterion),即对任意的,jk,当输入中的一位i发生变换时,输出中的位j和位k的变化应是彼此无关的。SAC 和 BIC 明显是为了加强混淆的有效性。
在密钥扩展算法中,通过左移的方式加大了推导子密钥及密钥种子的难度。
在DES算法中,S-box运算是非线性的,而其他运算都是线性的,这对于增加数学复杂性有着决定性的作用,为加密算法提供了更好的安全性。S-box的设计准则如下:
如果没有非线性构造元件,攻击者很容易就可以使用一个线性等式系统来表示 DES 的输入和输出;其中该系统的密钥位是已知的。这样的系统很容易被破解。然而,人们通常会精心设计 S - 盒,以便可以抵御各种高级的数学攻击,尤其是差分密码分析。
DES是不安全的,其主要原因在于其密钥的长度太短,56位的密钥,其密钥空间大小有限,无法抵挡暴力破解。
在DES刚提出时,非政府密码学家就提出 DES 的 56 位密钥太短,而这起初并没有被美国政府接受。
在一项研究密钥长度的论文中提出,至少75 位才能认为现有密码是安全的,而至少 90 位才能用于新密码。
如今,基于专用硬件能够再几天时间内破解DES,1998年初,电子前沿基金会建造了一 台DES破解机。平均几天的搜索就能找到一个DES密钥,并且随着电子技术的发展,这样的硬件成本只会越来越低。
还有一种 DES 的变体三重 DES(3DES),它比普通的 DES 好得多,使用三个不同的密钥应用三次 DES。密钥空间也十分庞大,无法被轻易的暴力破解。我们的代码默认使用3DES。虽然3DES 的速度大约是 DES 的 1/3,但随着CPU的发展,已足够允许3DES在代码中运行。
在DES之后又出现了许多优化之后的加密算法,他们选择密钥的长度至少为128位
[1]William Stallings.密码编码学与网络安全第七版[M]. 北京:电子工业出版社2017.2。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。