ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

软考必备:DES与AES对称加密原理与对比解析

软考必备:DES与AES对称加密原理与对比解析 1. 为什么会把DES和AES放在一起考对称加密在软考里的真实地位如果你刷过软考中级软件设计师、网络工程师或者信息安全工程师的真题大概率会注意到一个规律上午的选择题里加密算法的出场率一直很高而在加密算法里DES和AES几乎总是成对出现。有些年份考DES的密钥长度和分组大小有些年份把AES的轮数和密钥扩展拉出来做文章还有些年份干脆在下午题里给你一段密文让你判断用的是哪种算法、补齐残缺的步骤。很多人备考的时候会陷入一个误区把DES和AES当成两个孤立的考点背一组参数、记几个结论就去考试了。结果一到上午题里那种以下关于DES和AES的描述正确的是的多选变体题立刻就懵了。因为软考根本不满足于你背书它要测试你是不是真的理解了两者的设计逻辑差异。先说清楚一件事DES和AES都属于对称加密算法。所谓对称就是加密和解密用的是同一把密钥。发送方用密钥K加密接收方用同一个密钥K解密。这跟RSA那种公开密钥加密、私钥解密的非对称体系是完全不同的思路。对称加密的优点是快适合加密大量数据缺点是密钥分发比较头疼你总不能直接把密钥写在邮件里发给对方那就等于把家门钥匙塞进了门缝里。软考把DES和AES放在一起本质上是在考察你对对称密码体制演进的理解。DES是20世纪70年代的产物AES是2001年才正式成为标准的。这中间二十多年密码学经历了从硬件友好、结构相对简单的Feistel网络到软件友好、数学理论基础更扎实的SPN结构的过渡。你要是能把这个演进逻辑梳理明白上午题的多数加密类题目基本就能拿到分了。顺着这个思路往下说我们先把对称加密的几个前置概念理顺再逐个拆解DES和AES最后做一轮软考视角下的对比和做题复盘。2. 对称加密的地基概念分组、密钥、填充一个都不能含糊2.1 分组密码和流密码的区别在接触DES和AES之前你得先分清分组密码和流密码。DES和AES都属于分组密码也就是说它们不是一位一位地加密数据而是把明文切成固定大小的块一块一块地加密。DES的分组大小是64位AES是128位。切成块之后如果最后一块不满就得做填充Padding这正是软考偶尔会出的擦边考点。流密码就不一样了它是用密钥流逐位或逐字节地跟明文做异或运算典型代表是RC4。流密码不需要填充适合数据长度不确定的场景。软考里这两种密码的对比偶尔出现但频率远低于DES和AES。理解分组这个概念非常重要。因为你在Java里写AES解密的时候如果碰上Given final block not properly padded这种异常根源往往就是加密时用了PKCS5Padding解密时却因为密钥或密文不匹配导致填充校验失败。考试虽然不考Java报错但理解填充机制对做题有帮助。DES和AES本身要求分组大小固定你有多少数据都得先切块再说。2.2 对称加密的安全性根本不在于算法保密还有一个容易被忽略的点对称加密的安全性完全取决于密钥的保密性算法本身是公开的。DES的算法细节早就被公开了AES更是全球密码学界公开评审出来的。就算攻击者知道你用的是DES还是AES知道你完整的加密流程只要他不知道密钥照样解不开密文。这一点对做软考题挺关键的。考试时不时会出关于DES算法以下哪个说法是错误的这种题其中总有一个干扰项大意是DES算法的安全性依赖于算法的保密。这个选项是错的因为DES的安全性只依赖于密钥。我当年第一次做这类题的时候就掉过坑觉得算法保密不也是安全的一部分吗不是。Kerckhoffs原则在密码学里是铁律算法应当公开安全应完全依赖于密钥。软考反复考这个点就是要你把这个观念焊死在脑子里。2.3 软考对这块的考查方式上午题喜欢考概念辨析比如CBC模式、ECB模式的区别。下午题偶尔会让你算一算比如给出一段用CBC模式加密的流程问你某个中间值是多少。这说明对称加密不是单纯的背诵题你得能动手推。ECB模式最简单把每个分组独立加密同样的明文块永远得到同样的密文块。CBC模式则把前一个密文块跟当前明文块异或后再加密这样同样的明文块在不同的位置会得到不同的密文块。这两种模式背后的密码学直觉也完全不同ECB从不掩盖明文的统计特征CBC则能把明文的规律打散。这些不是作为概念去背而是要理解为什么CBC更安全。地基打好之后我们就可以正式拆解DES了。3. DES核心原理拆解Feistel网络、S盒与16轮迭代3.1 从整体框架看DES对称结构的设计哲学DES是1977年被美国国家标准局采纳的数据加密标准分组长度64位密钥长度56位实际输入64位密钥其中8位是奇偶校验位。它的核心结构是Feistel网络这个名字在软考里出现频率极高。Feistel网络的设计很有意思。它把64位的输入块拆成左右两半各32位然后经历16轮迭代。每一轮做的事情可以总结为三步右半部分先进过一个轮函数F再跟左半部分做异或之后交换左右两半。16轮做完之后再做一次逆初始置换输出64位密文。为什么要这么设计关键点在于Feistel网络的最大优势是加密和解密的结构几乎一模一样。你不用专门写一套解密算法只需要把子密钥的使用顺序倒过来就行。这样一来硬件实现的时候可以共用一套电路这在70年代是很大的工程优势。软考如果考DES的解密过程为什么和加密过程相似答案就是Feistel网络的可逆性设计。你可能已经注意到我在上面提到初始置换但没有展开。DES在进入16轮迭代之前要先对64位输入做一个初始置换IP把数据的位按照一张置换表重新排列。最后再做逆初始置换IP⁻¹。这两步并不增加安全性纯粹是工程上的历史遗留设计。考试里这个点偶尔会作为冷门题出现问IP置换的作用——答案就是打乱输入顺序不参与加密强度。见到这种题别慌选为了让硬件实现更方便或者不增加安全性就对了。3.2 轮函数F的精髓扩展置换、异或、S盒、P置换DES每一轮的核心是轮函数F它接收32位的右半数据和48位的子密钥输出32位结果。F内部又分四步第一步是扩展置换E扩展把32位的数据扩展成48位。32位扩展成48位意味着有16位是重复出现的它的作用是让数据在运算过程中产生更多的扩散。扩散是什么意思简单说就是让明文或密钥中的任意一位变化影响到密文中的多位。如果扩散不充分明文和密文之间的规律性就太强容易被统计分析破解。第二步是把扩展后的48位跟48位的子密钥做异或运算。这一步相当于把密钥混入数据中也是子密钥唯一发挥作用的地方。第三步是把异或后的48位结果分成8组每组6位分别送入8个S盒S1到S8。每个S盒接收6位输入输出4位。注意6进4出数据量缩减了。S盒是DES安全性的灵魂它是整个算法中唯一的非线性部件。非线性的意思是S盒的输入和输出之间不存在直线映射关系。如果整个DES都是线性的那加密就变成了一道线性方程组用线性代数手段就能破解。S盒的存在让DES可以抵御线性攻击和差分攻击。第四步是P置换把S盒输出的32位数据再打乱一遍顺序。P置换的作用还是扩散确保一轮运算的输出位能尽可能均匀地影响下一轮的多个S盒。考试对S盒的考查频率不低但不会让你查表。常见考法是问S盒的作用是什么答案是提供非线性变换、增强算法的抗攻击能力。看到非线性这个关键词就基本锁定正确答案了。还有一个高频点DES的S盒输入是6位输出是4位这个数字考了很多年。3.3 密钥调度从64位密钥到16个48位子密钥DES的密钥调度流程也是软考爱考的地方。原始密钥是64位其中第8、16、24、32、40、48、56、64位是奇偶校验位不参与实际运算。所以参与加密的实际上只有56位。密钥调度的第一步是去掉校验位然后通过PC-1置换把56位密钥分成左右各28位。接下来进行循环左移每轮的左移位数不同第1、2、9、16轮左移1位其余轮次左移2位。左移之后再把56位合并经过PC-2置换选出48位作为该轮的子密钥。这样重复16次就得到了16个48位的子密钥分别用于16轮迭代。循环左移位数为什么是1和2交替因为它保证16个子密钥之间不会有明显的规律性避免攻击者从子密钥的规律性反向推导出主密钥。你要是手推过一轮密钥调度就会发现第9轮和第16轮的移位量设置是有意为之的它们让子密钥的分布更加均匀。软考里密钥调度的出题通常比较直白比如DES的子密钥长度是多少DES实际使用的密钥位数是多少。答案分别是48位和56位。这里有个常见混淆点需要特别提醒DES的密钥被称为56位密钥但输入的原始密钥是64位。如果你在考场上看到DES密钥长度是64位这种说法要看上下文——如果指的是原始输入密钥那没错如果指的是有效密钥长度那就是错的。严谨的表述应该是DES原始密钥64位有效密钥56位分组64位。3.4 3DES为什么是EDE而不是EEE软考对DES的考查不局限于经典DES本身还会延伸到3DES。3DES全称Triple DES它的思路非常务实既然DES的56位密钥在1990年代后期已经被暴力破解攻破1998年EFF的Deep Crack机器用不到三天就破解了DES那就用DES做三次加密把密钥长度扩展到112位或168位。3DES有三种模式DES-EEE3三次加密三个不同密钥、DES-EDE3加密-解密-加密三个不同密钥、DES-EDE2加密-解密-加密三个密钥中K1和K3相同。最常见的标准化模式是EDE也就是加密-解密-加密但解密这一步用的密钥是K2不是K1的逆操作。为什么要在这个中间位置插入一次解密操作理由很巧妙。如果K1等于K2等于K3那么3DES就退化成普通DES——因为第一次加密和第二次解密相互抵消第三次加密又等同于第一次加密。这样3DES可以完全兼容DES硬件上只需要做向后兼容处理。如果你用EEE模式当三个密钥相同时结果是DES做三次加密跟DES不兼容。所以EDE是一种讨巧的兼容性设计。软考如果问3DES为什么采用加密-解密-加密的顺序答案就是为了兼容DES。3DES虽然安全强度提升了但它的速度慢得让人抓狂因为它本质上要做三次完整的DES加密。这也是后来AES诞生的现实需求之一——算法不能只安全还得快得能跑在21世纪的软件和应用环境下。4. AES详解Rijndael算法为什么能接过DES的接力棒4.1 AES的诞生背景与State矩阵1997年NIST公开征集新的加密标准要求提交的算法分组长度128位密钥长度支持128、192、256位。最后胜出的是比利时密码学家Daemen和Rijmen设计的Rijndael算法2001年被正式采纳为AES标准。AES和DES最直观的区别在于结构。AES不是Feistel网络而是SPN结构Substitution-Permutation Network代换-置换网络。Feistel网络每一轮只处理数据的一半而SPN结构的每一轮都同时处理整个分组。这使得AES的扩散速度更快一轮的效果能覆盖整个数据块安全性收敛得更快。AES把128位的输入分成16个字节排列成一个4×4的矩阵这个矩阵叫State状态。所有运算都在State上进行。密钥长度不同轮数也不同128位密钥对应10轮192位对应12轮256位对应14轮。这三个数字是软考的常客建议直接记死。4.2 四步轮变换逐个拆解AES的每一轮除了最后一轮包含四个步骤字节代换、行移位、列混淆、轮密钥加。最后一轮不进行列混淆。这四个词在软考里几乎年年刷存在感。字节代换SubBytes是把State里的每个字节通过S盒替换成另一个字节。这个S盒是一个16×16的查找表表里面256个字节的排列不是随便填的它的构造基于有限域GF(2^8)上的乘法逆元和仿射变换。AES的S盒与DES的S盒有个重要区别DES的S盒是秘密设计后在公众质疑下才被公开的而AES的S盒从一开始就公开了完整构造方法。这一点考试偶尔会考问AES的S盒是否公开答案是不仅公开而且有明确的数学构造过程。行移位ShiftRows是对State矩阵的每一行做循环左移第0行不动第1行左移1个字节第2行左移2个字节第3行左移3个字节。这个操作的作用是让数据在不同列之间产生横向扩散。如果你把State矩阵想象成一个4×4的方阵行移位就是把行上的数据错开排列。列混淆MixColumns是对State的每一列做矩阵乘法每列4个字节被映射成另外4个字节。这个运算基于伽罗华域GF(2^8)上的多项式乘法属于AES中数学含量最高的部分。从考试角度你不需要会做GF(2^8)的手工乘法但需要知道列混淆是在GF(2^8)上进行的它的作用是实现列内扩散让某一列的输入变化能够影响到更多输出位。轮密钥加AddRoundKey最简单也最直观把State矩阵和该轮的轮密钥做逐字节异或。如果说前面三步都是在做混乱那轮密钥加这一步就是把密钥的随机性灌入状态中——没有密钥参与的加密不叫加密那只是数据的非线性变换。4.3 密钥扩展为什么AES没有单独的调度置换AES的密钥扩展和DES完全不是一个路数。DES的密钥调度用的是PC-1置换加循环左移AES则把密钥逐字扩展成一个密钥链长度与总轮数相关。128位密钥需要11个轮密钥初始轮密钥加10轮轮密钥每个轮密钥16字节192位密钥需要13个256位密钥需要15个。密钥扩展的具体做法是先把原始密钥排成4个字每个字4字节然后依次生成后续的字。每4个字中遇到新一组的第一个字时要做一次RotWord循环左移一个字节、SubWordS盒代换和Rcon轮常数异或三步操作。轮常数是一个预先定义好的字用于打破各组密钥之间的对称性。这个设计的巧妙之处在于AES的密钥扩展和加密结构共享同一个S盒。它不需要像DES那样单独设计一套复杂的PC置换表而是用一套统一的数学操作完成密钥衍生。软考对密钥扩展的考查通常停留在轮数密钥长度的对应关系很少要求手算密钥扩展。4.4 为什么AES是快且安全的代表AES相比DES最大的进步之一是它的S盒和列混淆操作全部基于GF(2^8)的代数结构这种结构在硬件和软件上都能高效实现。现代CPU甚至内置了AES指令集AES-NI一条指令就能完成一轮的核心运算。从安全性角度看AES最值得称道的地方在于直到今天针对完整AES的最有效攻击也就是旁路攻击侧信道攻击比如通过测量功耗曲线来推测密钥而不是在数学上攻破算法本身。DES的56位密钥在现代硬件下几小时就能暴力破解而AES-128的暴力破解需要2^128次尝试这个数字大到没有现实意义。软考里有一道经典题目AES的密钥长度可以是哪些答案是128、192、256位。如果你在选项里看到64位那是DES的密钥长度混进来当干扰项了。还有一个容易混淆的点是分组长度AES的分组始终是128位不管密钥多长分组长度不变。不少考生想当然地以为AES-256的分组也是256位这是错的。5. 软考视角的DES与AES终极对比从参数表到刷题陷阱5.1 核心参数与安全强度对照表先把两类算法最硬核的参数整理成一张对照表这张表建议备考时反复默写。项目DES3DESAES分组长度64位64位128位密钥长度实际56位输入64位含校验位112位或168位128/192/256位轮数16轮16轮×310/12/14轮对应三种密钥长度结构类型Feistel网络Feistel网络SPN结构轮函数核心S盒6进4出同DESS盒8进8出、列混淆加密解密结构结构对称、子密钥逆序EDE模式兼容DES解密是加密的逆变换当前安全性已不安全可暴力破解技术上安全但速度慢安全标准算法软件实现效率较慢很慢快支持AES-NI这张表里最容易被考到的三组数据是DES的密钥56位、AES的分组128位、3DES的EDE模式。每次上午题看到这三个数据点基本就知道出题人在考什么了。5.2 真题最爱的六个易混考点软考在加密算法这块的出题风格比较固定我统计下来以下六个点是反复出现的坑。第一DES的S盒输入输出位数。输入6位输出4位。这个细节在选项里经常跟AES的S盒输入输出都是8位混在一起出。两个S盒的数据维度完全不同一个是6→4一个是8→8弄混了这道题就没了。第二DES的Feistel结构特点。一轮只处理一半数据左右互换解密复用加密算法的倒序子密钥。与之相对AES每一轮处理整个128位分组这是SPN结构的特点。考试如果给你一张结构图问你这是DES还是AES的结构看是否分左右两半——分左右的是DES。第三AES轮数与密钥长度的对应关系。128位密钥→10轮192位→12轮256位→14轮。这里有个细节最后一轮不做列混淆。题干经常设置以下关于AES轮数描述错误的是把最后一轮豁免列混淆作为错误选项混进去。第四DES的有效密钥长度是56位而不是64位。虽然原始输入是64位但8位校验位不参与加密。软考出题时喜欢故意说DES密钥长度是64位来当错误项你得学会区分输入密钥和有效密钥两个概念。第五CBC模式与ECB模式的对比。虽然这是分组密码工作模式层面的考点但软考喜欢把DES和AES放进具体的模式里考。ECB模式每次加密独立分组CBC模式需要前一个密文块参与当前块的加密。前者并行度高、但泄露模式后者更安全但加密过程不能并行。如果你看到一道题问CBC模式在加密时是否需要上一次迭代的密文答案是必须的。第六非对称加密和对称加密的对比。题目可能是以下哪些算法属于对称加密备选项里混入RSA、ECC这类非对称算法。答案里只要出现RSA基本可以排除。对称加密的关键特征是加密解密用同一把密钥。5.3 案例分析一道典型上午题的推演过程我拿一道典型的软考风格题目做一次推演帮助你感受做题思路。题目关于AES算法以下描述正确的是哪个选项包括A. AES的密钥长度固定为128位B. AES的分组长度可以是128、192或256位C. AES最后一轮不需要进行列混淆D. AES采用的是Feistel网络结构。先说结论正确答案是C。我们逐个推演A选项错在固定这个词。AES的密钥长度支持128、192、256位三种不是固定128位。如果选项说最低密钥长度是128位那是对的。B选项是典型的混淆项。AES的分组长度固定是128位可变的是密钥长度。如果把B选项改成密钥长度可以是128、192或256位那就对了。C选项是对的。AES的前若干轮都包含字节代换、行移位、列混淆、轮密钥加四步但最后一轮省略列混淆。为什么因为列混淆本身是线性的省略它不会让解密变得复杂却能减少大约一轮的运算量。这是一个工程上的优化设计软考考这个点考了很多次。D选项错在AES采用Feistel结构。AES是SPN结构。Feistel结构的特点是每一轮只加密半个分组DES采用的就是这种结构AES每一轮处理整个分组这是两代算法最明显的结构性差异。这种题目你背结论也能做对但如果你理解了AES的密钥扩展机制和轮变换流程就不怕选项里出现跟你背过的结论长得不太一样的干扰项。软考越到后面的年份越喜欢用这种变体题干来筛掉纯背书的考生。5.4 从考试到实际应用AES在Java等开发场景里的常见坑软考的热搜词里有java aes解密说明很多考生同时也是开发者。这里简单提一句实际使用中容易踩的坑也算是给备考之余加一点实战佐料。Java里用AES解密最常见的异常是IllegalBlockSizeException和BadPaddingException。前者通常是密文长度不是16的倍数因为AES分组是16字节后者通常是密钥不对或填充方式不匹配。还有那个著名的JCE无限制权限问题老版本的JDK对AES-256有默认限制需要替换local_policy.jar和US_export_policy.jar文件或者升级到新版JDK否则128位以上密钥会直接报错。这些实际经验不会直接出现在软考卷面上但它帮你理解两件事第一AES的分组确实是16字节这是你在代码里填充时要记牢的数字第二对称加密不可能是单纯一行代码搞定的事情模式、填充、IV、密钥长度任何一个参数不匹配解密就会失败。软考考的是算法的设计逻辑实战考的是算法的工程落地两者是同一个理解深度的两个侧面。6. 备考冲刺一个月搞懂DES和AES的实操路径6.1 时间分配建议如果你离考试还有一个月这几块内容的优先级建议这样排第一优先级是密钥长度、分组长度、轮数这几组硬数字考频极高而且记住了就是送分第二优先级是Feistel和SPN的结构特征做图判断题要用第三优先级是S盒的作用、轮变换的步骤名称这类细节题最后才是3DES的EDE模式、密钥扩展这些偏门考点。6.2 用画笔推演一轮Feistel和SPN我备考时用过最有效的方法是在纸上画一遍DES的一轮迭代和AES的一轮轮变换不查资料纯凭记忆画。DES就画左半右半、画异或、画F函数AES就画一个4×4的矩阵标注SubBytes、ShiftRows、MixColumns、AddRoundKey四个步骤的位置。画完之后对照教材检查错的地方就是你记忆薄弱的环节。这个方法比反复刷题高效得多因为画图的过程强迫你建立结构化的理解。比如DES的Feistel结构你画完一遍就会记住右半数据经过F函数后与左半异或左右交换进入下一轮。画到第二轮的时候你自然会发现原来上一轮的右半轮到下一轮就变成了左半。这个动态过程一旦理解后面所有关于Feistel可逆性的题目就都不会错了。AES的SPN结构也建议自己画一遍。你画State矩阵的时候会发现字节代换和行移位都是在替换和挪动位置并不涉及别的列真正让数据发生混合的是列混淆。AES的扩散机制主要靠行移位加列混淆的组合——行移位负责横向铺开数据列混淆负责让列间数据互相影响。两张图画下来DES和AES的差异就是直观的了。6.3 错题整理的一个小技巧遇到错题不要只记答案要把为什么正确和为什么当年会选错都写上去。我整理加密算法错题时习惯用三栏式第一栏写题目考点比如AES最后一轮无列混淆第二栏写我当时的错误理解比如我一直以为每轮都有四步第三栏写正确推导比如列混淆在每轮都做但最后一轮不做。考前翻错题本重点看第二栏和第一栏比单纯刷十道新题提分更快。最后说点我自己的体会。DES和AES看起来是两套完全不同的算法但它们的底层逻辑是一致的那都是混乱和扩散的舞蹈。DES用Feistel网络把输入分成两半靠S盒制造混乱靠置换实现扩散AES用SPN结构让整个状态同时经历代换、移位、混淆和密钥注入。理解到这一层你再看软考真题里的那些加密题会发现它们考来考去其实都是同一件事你有没有真正理解一代加密标准如何被下一代取代以及取代背后基于怎样的安全性考量和工程实践。这就是备考里最值得花时间的地方。
返回列表