ARTICLE DETAIL

资讯详情

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

DES算法详解:Feistel网络、CBC模式与Python实战

DES算法详解:Feistel网络、CBC模式与Python实战 半个世纪过去了DESData Encryption Standard依然是个绕不开的话题。别误会我不主张你在新项目里用它加密业务数据但你只要在金融、门禁、智能卡、旧系统维护这些领域待过就一定见过它的影子——磁条卡里的PIN加密、部分IC卡内部认证、还有一堆十几年前的老接口至今还在跑DES。更别提面试的时候讲讲DES的流程几乎是密码学方向的必考题。这篇文章我想系统性地把DES拆开讲透从Feistel网络的核心思想、16轮迭代到底在做什么、子密钥怎么生成到CBC模式下IV和密钥到底怎么配、填充为什么要按PKCS7来最后附上可复制的Python加解密Demo和一堆我在实际对接中踩过的坑。不管你是刚接触密码学的学生还是被老系统接口折磨的开发这篇都能当一份实践笔记来用。1. 从一个反直觉的现象说起为什么破解掉的算法还在大量使用如果你去查DES的历史维基百科会告诉你它早在1998年就被电子前沿基金会用25万美元的专用机器在56小时内暴力破解专家的结论是DES不再安全。但你要是真的去翻银行核心系统、POS机终端规范、社保卡应用文档会发现DES和3DES依然坚挺地活着。这不是大家不懂安全而是密码学的世界里算法替代的成本远比你想象的高。DES的密钥长度是56位这在1977年发布时是很强悍的但到了90年代末分布式计算和专用硬件的算力已经能对56位密钥做穷举搜索。问题在于DES不只是一个算法它是一整套已经嵌入到硬件安全模块HSM、金融交易报文比如ISO 8583里的PIN Block、IC卡命令协议里的基础设施。你换算法意味着所有发卡行、所有收单机构、所有终端厂商都得同步升级这是几十亿美元级别的改造成本。所以在很长一段时间里业界的选择是在DES外面套一层——也就是后来的3DES——先用加大密钥长度的方式续命。这给了我们一个很重要的视角学DES不能只把它当过时的加密算法来学它是理解对称密码学逻辑的最小完整样本。AES虽然现在是主流但AES的字节代换、行移位、列混合这些操作反而没有DES的Feistel结构那么直观、那么好讲清楚。你把DES的轮函数搞明白了再看AES、SM4、甚至Blowfish都会有种原来如此的通透感。另外一个实际原因是很多老系统的接口文档里写的DES加密其实指的不是裸的DES算法而是一个复合流程DES/CBC/PKCS5Padding或者NoPadding甚至还要叠加MAC报文校验码计算。你在对接这类接口时如果只懂用密钥加密这一个环节不知道IV怎么生成、不知道数据怎么填充、不知道密文要不要转Base64那在线工具和代码库都救不了你。所以这篇文章我打算用实战的视角重新组织DES的知识结构原理讲清楚参数讲明白代码能跑通坑点全列出来。适合读这篇文章的人有三类一是刚入门密码学、想找一条理解对称加密主线的学生二是工作中被迫对接老系统、需要在代码里实现DES加解密的开发三是做协议分析或安全评估需要搞懂算法细节的测试人员。我会尽量把每个概念都掰开揉碎不装高深。2. Feistel网络DES设计里最优雅的那个一半一半的思想这一节是DES算法的地基。如果你只记住了DES的一个概念那应该是Feistel网络。它不是为了DES专门发明的但它被DES用到了极致后来还被很多算法继承包括Blowfish、RC5、以及我们国家的SM4。理解Feistel网络相当于拿到了一把理解半个对称密码家族的钥匙。2.1 加密流程的总览64位进来64位出去先看整体框架。DES处理的数据块长度固定是64位8字节密钥名义上也是64位但实际参与运算的只有56位剩下8位是奇偶校验位。如果你用一个8字节的字符串当密钥程序会取这8字节的所有位其中每个字节的最低位会被当成校验位这就是为什么很多语言里DES类库要求密钥必须恰好是8字节。加密过程大致分四步初始置换IP把64位明文按一张固定的置换表重新排列。这一步不涉及密钥纯粹是洗牌。分成左右两半洗牌后分成L0和R0各32位。16轮Feistel迭代每一轮用子密钥对右半部分进行处理然后和左半部分异或再交换左右。这是整个算法的灵魂。逆初始置换IP⁻¹16轮之后左右再交换一次然后按另一张表重新排列输出64位密文。每次迭代你不需要记住复杂公式只需要理解一个核心操作L(i) R(i-1) R(i) L(i-1) ⊕ f(R(i-1), K(i))什么意思呢每一轮里新的左半部分直接拿上一轮的右半部分来当新的右半部分是上一轮的左半部分和某个函数处理过的上一轮右半部分做异或。这个f函数就是整个算法里唯一需要密钥参与的非线性部分。为什么这个结构好因为解密和加密可以用完全一样的逻辑只需要把子密钥的使用顺序反过来。这在硬件实现上是巨大的优势——你不需要设计两套电路同一套电路换个密钥顺序就是解密。2.2 轮函数f的内部构造E扩展、S盒和P置换轮函数f是整个DES中非线性的来源也是最考验设计功力的地方。它的输入是32位的右半部分和48位的子密钥输出是32位。内部按顺序做四件事E扩展置换把32位扩展到48位。怎么扩不是简单补零而是按一张E盒表把某些位复制一遍。这样做的目的有两个一是让输入长度和48位子密钥对齐能做异或二是让一个位的改变能更快地扩散到更多位置这就是密码学里的雪崩效应的来源。与子密钥异或48位的扩展结果和48位的子密钥K(i)逐位异或。S盒代换这是整个DES最有争议也最核心的部分。48位数据被分成8组每组6位分别进入8个不同的S盒S1到S8。每个S盒是一张4行16列的查找表输入6位中第1位和第6位拼起来决定行号中间4位决定列号查表得到的4位二进制就是输出。6位进4位出8组总共32位输出。P置换32位输出再按P盒表做一次置换得到这一轮f函数的最终结果。这里你可以明显感觉到S盒是唯一的非线性环节它决定了DES抵抗差分密码分析和线性密码分析的能力。历史上有个著名的八卦IBM团队在设计S盒时已经发现了差分密码分析这类攻击方法但在当时属于机密没有公开直到1990年Biham和Shamir重新发现这种攻击后IBM才承认他们在S盒设计里已经做了针对性优化。这也是为什么S盒的查表值看起来随机但又不是完全随机——它背后是有严格设计准则的。2.3 子密钥生成从56位主密钥到16个48位轮密钥DES总共有16轮每轮用的子密钥K(i)各不相同都是48位。它们全部从56位的有效密钥里派生出来。生成过程值得单独拎出来讲因为你在对接某些硬件加密机的时候可能会遇到要分别传入16轮子密钥的接口不懂这个流程根本没法下手。第一步把64位密钥的第8、16、24、32、40、48、56、64位也就是每个字节的最低位去掉剩56位。然后做一个PC-1置换把56位打乱分成C0和D0两半各28位。第二步循环左移。每一轮迭代前C和D各自向左循环移动一位或两位移动的位数由一张移位表决定第1、2、9、16轮移1位其余轮次移2位。移位之后得到C(i)和D(i)拼成56位。第三步把56位拼好的数据做PC-2压缩置换丢掉8位得到48位的子密钥K(i)。这个流程每轮重复一次共得到16个不同的子密钥。需要注意由于有循环左移、且某些轮移动位数相同所以16个子密钥之间是各不相同但又有周期关联的这正是DES密钥编排的设计特色。解密的时候只需要把子密钥的使用顺序倒过来第一轮用K(16)第二轮用K(15)以此类推。这一点我们在代码里会再验证。3. 实际使用DES前必须搞懂的三个参数密钥、IV、填充模式很多人在DES上栽跟头不是算法本身不理解而是使用DES时涉及的各种参数没搞对。我接过的老接口项目里最常见的联调失败原因就是参数不一致客户端用CBC模式、服务端用ECB模式客户端做了PKCS5填充、服务端期望的是ZeroPadding客户端把密文转成了Base64、文档里却写的是HEX。这些坑单独看都很小连在一起就能让人怀疑人生。所以我单独用一节把参数讲透尽量覆盖各种常见场景。3.1 ECB与CBC模式对比为什么CBC是默认选项分组加密算法一次只能处理一个固定长度的数据块DES就是一个块64位。如果你的明文超过64位就得把数据切成多个块然后确定块与块之间的关联方式这就是分组模式。ECBElectronic Codebook电子密码本是最原始的模式每个明文块用同一把密钥独立加密块与块之间没有任何关联。它的优点是并行性好、实现简单缺点是同样的明文块会生成同样的密文块。如果你加密的是一张图片用ECB模式加密后图片的轮廓信息在密文里依然清晰可见这是它最大的安全隐患。所以ECB模式一般只用于加密单个固定长度的小数据块比如PIN Block不适合加密长文本。CBCCipher Block Chaining密文分组链接模式则给每个明文块加了一点上下文加密第一个块之前先把明文块和一个初始化向量IV异或再加密加密第二个块时把明文块和第一个块的密文异或再加密以此类推。这样即使两个明文块完全相同加密出来的密文块也不同因为前一个块的结果被引入了当前块的加密过程。下表是两种模式的直观对比项目ECBCBC块间关联无各自独立有前一块密文参与当前块异或并行加密支持不支持解密可并行相同明文块产生相同密文块产生不同密文块取决于前块IV需求不需要需要且长度等于块大小8字节适用场景单块数据、PIN加密多块数据、文件加密、通用推荐可以看到CBC模式在多数据量场景下明显优于ECB所以绝大多数接口文档要求的都是CBC加密。但要注意CBC模式的安全性高度依赖IV的随机性和保密策略——IV本身不要求保密但每次加密都应该使用不同的随机IV否则同一个密钥加密同一份明文时你会得到完全一样的密文等于变相泄露了明文的初始状态信息。3.2 填充方式详解PKCS5、PKCS7、ZeroPadding到底什么区别分组加密要求明文长度必须是块大小的整数倍。DES的块大小是8字节如果你的明文是13个字节就得先填充到16个字节才能加密。可选择的填充方式很多但实际接口里最常出现的是这几种PKCS5Padding / PKCS7Padding这两个名称在DES场景下经常混用。严格来说PKCS5是8字节块的标准PKCS7是支持1到255字节块的通用水准但大多数语言的实现里PKCS5Padding在DES上就是PKCS7Padding。它们的原则是需要填充n个字节就填充n个值为n的字节。比如明文长度13块大小8需要填充3个字节填充的就是0x03 0x03 0x03。如果明文长度恰好是8的倍数呢还是要填充一个完整的块填8个0x08。这样设计的目的是解密时可以通过最后一个字节的值准确地判断出填充了多少从而精确去除。ZeroPadding不足的部分全部填0x00。注意如果明文本身以0x00结尾解密后去除填充时会有歧义无法确定哪些零是填充、哪些是原始数据。所以除非你能保证明文决不会以零结尾比如固定长度的数字字符串否则不建议使用。NoPadding不填充要求明文长度严格等于块大小的整数倍。常见于加密固定长度的数据比如8字节的PIN Block或者你已经手动处理过对齐的场景。选择填充方式时要严格跟随接口文档绝不能凭感觉。如果文档写了PKCS5Padding你代码里用的却是NoPadding加密大量短数据时会直接抛参数异常就算没抛异常解密端也无法解析。另外很多在线加解密工具默认用ZeroPadding你本地用PKCS7两边算出来的密文对不上这也是常见的工具和代码不一致问题来源。3.3 IV偏移量的角色为什么CBC模式不能把IV写成死值IV在CBC模式中的地位和密钥几乎一样重要。它的大小必须等于块大小DES下就是8字节。IV机械地看是第一个明文块在加密前用来异或的数据从安全性角度看它保证了即使使用同一把密钥加密同一段明文只要IV不同密文就不同。这样攻击者就无法通过分析多组密文来推断明文中是否存在重复片段。我看过不少老项目代码里IV写死为12345678或者干脆全零。这在联调阶段问题不大因为加密和解密两端只要用同一个IV就能跑通但如果这个系统要长期使用固定IV会带来一个非常现实的问题被加密的明文一旦存在规律性比如报文里前几个字节是固定头攻击者可以通过大量采样找出明文模式。更严重的场景是如果某条消息被重放固定的IV会让重放攻击变得容易得手。所以规范的CBC加密做法是每次加密都生成一个随机IV把IV放在密文前面一起传给对方解密时从密文中取前8字节当IV再用密钥解密剩余部分。IV不保密但必须唯一。4. 从零跑通一个DES加解密DemoPython pycryptodome实战理论讲了这么多接下来上代码。我在实际项目里最常用的DES加解密工具库是Python的pycryptodome它比老旧的pycrypto维护得更及时、接口也更友好。下面的示例包含密钥设定、IV生成、CBC模式加解密、PKCS7填充处理以及Base64编码输出基本覆盖了老接口对接时90%的需求。4.1 环境准备与示例代码先安装依赖pip install pycryptodome然后看完整示例。这段代码我每行注释都写了方便直接抄作业。from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad import os import base64 def des_cbc_encrypt(plaintext: str, key: bytes) - tuple[str, bytes]: DES/CBC/PKCS7加密 :param plaintext: 明文字符串 :param key: 8字节密钥 :return: (base64编码的密文, 本次使用的IV) # 随机生成8字节IV iv os.urandom(8) # 创建CBC模式的DES密码对象 cipher DES.new(key, DES.MODE_CBC, iv) # 先对明文做UTF-8编码再按8字节块大小做PKCS7填充 padded_data pad(plaintext.encode(utf-8), DES.block_size) # 执行加密 ciphertext cipher.encrypt(padded_data) # 返回base64格式的密文和原始ivbytes return base64.b64encode(ciphertext).decode(utf-8), iv def des_cbc_decrypt(ciphertext_b64: str, key: bytes, iv: bytes) - str: DES/CBC/PKCS7解密 :param ciphertext_b64: base64编码的密文 :param key: 8字节密钥 :param iv: 8字节IV :return: 明文字符串 # 解码base64密文 ciphertext base64.b64decode(ciphertext_b64) # 创建CBC模式密码对象 cipher DES.new(key, DES.MODE_CBC, iv) # 解密并去除PKCS7填充 padded_data cipher.decrypt(ciphertext) return unpad(padded_data, DES.block_size).decode(utf-8) if __name__ __main__: # 密钥必须是8字节64位 key b8BytesKey # 占位示例实际使用务必随机生成 plaintext DES算法实战演示CBC模式PKCS7填充 ciphertext_b64, iv des_cbc_encrypt(plaintext, key) print(f密文(Base64): {ciphertext_b64}) print(fIV(Hex): {iv.hex()}) decrypted des_cbc_decrypt(ciphertext_b64, key, iv) print(f解密结果: {decrypted})运行这段代码你会看到密文每次执行都不一样但解密结果始终能还原出原始明文。这就是CBC模式加随机IV的直观体现。4.2 代码逐段拆解为什么填充必须在加密方法内部完成上面代码里最容易忽略的一个细节是我先plaintext.encode(utf-8)再pad(...)而不是先手动补齐空格再编码。这两者有什么区别如果你在明文后面手动补空格再整体UTF-8编码除非你能保证原始明文末尾本来就带空格否则解密还原时会多出空格或丢失原有空格。PKCS7的pad/unpad机制是标准化的填充的字节值就是填充的字节数解密端能精确认出并删除不会影响原始数据。这也是为什么我反复强调填充这种脏活交给库函数做不要自己拼手写逻辑。另一个值得注意的点是加密函数内每次调用os.urandom(8)生成新IV但解密函数需要外部传入IV。实际系统里的做法有两种把IV拼在密文前面比如iv ciphertext解密时取前8字节当IV接口文档单独要求一个IV字段由双方约定比如固定值或由某个派生规则生成。第一种是更健壮的做法避免双方各自维护一份约定导致参数漂移第二种在老系统里更常见因为报文格式早就定死了。不管哪种加密端都必须把IV直接或间接地传达给解密端否则没人解得开。如果你是C开发者可能会用到OpenSSL的命令行或者libcrypto接口JAVA则是javax.crypto.Cipher配合SecretKeySpec。思路完全一致只是具体API不同上面的Python示例足够你理解整体逻辑。4.3 在线工具联调对照为什么在线加解密工具和你算的结果不一样热搜词里有个des使用iv及密钥在线加解密可见不少人拿到在线工具去验证算法结果。在线工具有个好处能快速确认你的实现思路是否正确。但用在线工具验证DES时有几个非常容易踩的坑模式不一致很多在线工具默认是ECB模式不会在界面上主动提醒。你用CBC模式的代码结果去和ECB工具比对密文自然对不上。IV处理方式不同有的工具要求你输入IV的ASCII字符串有的是十六进制格式有的甚至不提供IV输入框默认全零。你得看清楚界面提示换算成一致的格式。输出编码不同同样的密文有的工具显示HEX十六进制有的显示Base64。比对之前要先统一成一种编码。字符编码不同工具在加密中文时有的用UTF-8有的用GBK同一个你好编码出来的字节不同加密结果完全不同。在线工具大多默认UTF-8但也不是全部。我自己的经验是先用全ASCII、长度恰好为8字节的明文比如12345678做一次最小化验证排除填充、编码的干扰确认基本流程跑通后再换真实的中文长文本测试。这样一旦对不上能快速缩小问题范围。5. 从DES到3DES为什么是加密-解密-加密而不是加密-加密-加密好多人在接触3DES时有一个天然疑问既然要加长密钥为什么不让DES跑三遍加密非要在中间插一遍解密其实这个设计非常巧妙我第一次看懂的时候有种拍大腿的感觉。5.1 3DES的两种密钥选项与有效位数3DESTriple DES就是用DES算法处理同一个数据块三次。根据密钥数量的不同有两种标准选项双密钥3DES2TDEA使用两个密钥K1和K2执行加密-解密-加密先用K1加密再用K2解密最后再用K1加密。有效密钥长度是112位。三密钥3DES3TDEA使用三个独立密钥K1、K2、K3有效密钥长度是168位。那为什么中间要解密一次关键在于兼容性。如果K1等于K2那么加密-解密-加密的过程就变成了加密-解密-加密——中间的解密会把第一次加密的结果还原成原始明文再加密一次等于只加了一次密。也就是说3DES在K1K2时自动退化成单DES。这让旧系统可以平滑地从DES迁移到3DES算法识别和密钥管理都不用大幅改动。如果中间还是加密那K1K2时就不是退化而是一个全新的、和DES完全不兼容的算法了。3DES虽然没有像DES那样被彻底攻破过但它有个结构性的缺陷因为还是基于DES块大小仍然是64位适合加密的明文长度受限而且它的运算速度比AES慢很多软件实现大概只有AES的几分之一。2017年的时候学术界发布了一个针对3DES的中间相遇攻击虽然数据复杂度很高、现实影响不大但也促使NIST在2023年正式将3DES移出了推荐算法列表。今天的新系统都应该转向AES但存量系统里的3DES还会有很长的生命周期遇到也算正常。5.2 为什么说56位密钥已经不安全了算力演进的历史线理解DES的安全性不能只看56位能不能被暴力破解这个单一结论还要看破解成本。1998年EFF的Deep Crack专用机耗费约25万美元56小时破解了一个DES密钥到了2006年商业化的FPGA阵列已经可以把破解成本降到1万美元以下现在如果你有云GPU资源穷举56位密钥的时间成本更是大幅缩短虽然不是按分钟算但在高强度对抗场景下这个密钥空间已经完全不够用了。除了暴力破解密码分析学上也对DES做过长期研究。差分密码分析1990年和线性密码分析1993年都提出了理论上的攻击复杂度虽然实际计算量仍然巨大但它们证明了DES的安全性余量并不像大家以为的那么宽裕。这也是为什么所有人都在强调不要用DES处理高价值数据但当单纯讨论历史知识和接口兼容时DES依然值得学习。6. 我在对接DES接口时踩过最深的几个坑理论讲完代码跑通我把自己这几年对接DES相关接口的真实踩坑记录整理了一下。这些问题很多都不是高深的理论问题而是知道就知道、不知道就折腾一晚上的细节列在这里给各位排雷。6.1 坑一密钥长度写成16字节程序直接抛异常早期接手一个门禁系统项目对方文档写的是DES加密但给的密钥示例是16个字符。我当时没细想直接当成DES密钥传入Java的DESKeySpec结果抛了InvalidKeyException。后来才搞明白对方用的其实是最外层套了3DES的处理流程密钥16字节对应的是3DES的双密钥模式。这是一类非常典型的信息不对称问题文档只写了DES三个字母但具体实现可能是DES、3DES、甚至DESede。遇到这种情况第一步永远是确认密钥长度和算法全名而不是先写代码。6.2 坑二CBC模式时固定IV在联调环境没问题一到生产就出幺蛾子之前有个支付类接口两边约定了IV固定为全零。联调环境里数据量小、报文结构固定一直没发现问题。上线后安全扫描提示CBC模式IV重复当时还没太当回事。后来一个安全测试同事演示了在固定IV下针对已知明文的字典攻击可以推断出部分报文内容我们才重视起来。把IV改成随机生成并拼接在密文前面后问题才彻底解决。这个教训让我长记性了接口文档没写IV策略时要主动提出随机IV方案这属于参数设计而不是实现细节。6.3 坑三按键值Key不按编码Key长度对得上结果还是对不上有一次对接物流系统的报文加密接口对方给的密钥是一串32位的十六进制字符比如E2F34A9B...。理解错了用途我直接把每个字符当成ASCII字符传入虽然凑够了8字节长度但加密结果始终对不上。后来才知道这种HEX字符串表示的其实是16字节二进制密钥的十六进制展示形式需要先bytes.fromhex(key_hex)解码成真正的字节再参与加密。密钥的展示形式和实际字节不是一回事这个坑在遇到老系统文档时尤其常见。6.4 坑四解密端报填充错误不一定是填充格式问题如果你确定使用PKCS5/PKCS7且两边代码都没改过但解密时报ValueError: Padding is incorrect.先别急着怀疑填充逻辑。根据我的经验这个报错最常见的原因是密钥或IV不正确——因为解密出来的数据中最后一个字节不对unpad才会失败。尤其当密钥长度没错、格式也没错只是某个字符输错时单靠肉眼很难发现。我当时调试时先把key和iv都转成HEX打出来和对方给的文档逐一比对最后发现是复制时多了一个空格这种低级错误最坑人。6.5 坑五在线工具导出的结果在C语言端无法还原还有一个不太起眼但很常见的坑在线工具生成的Base64密文可能包含换行符因为有些工具为了展示美观会自动换行。你直接把带换行的密文复制进C代码的数组解密时大概率出错。处理方式是先String.replaceAll(\\s, )去掉所有空白字符再解码。同理从C代码里输出的HEX字符串到了别人手里也可能因为大小写问题被解析成不同的值所以规范做法是统一用小写解析时统一用大写规则匹配。7. 如果你要继续往前走DES之后学什么DES不是终点。把DES和3DES搞明白之后我建议你按三条线继续往下走它们之间是递进关系。第一条线AESAdvanced Encryption Standard。AES是现在的对称加密主流块大小128位密钥支持128/192/256位。和DES的Feistel结构不同AES是SPN结构代换-置换网络每一轮包括字节代换、行移位、列混合、轮密钥加。学习AES时你可以对照着DES看DES的S盒对应AES的S盒DES的P置换对应AES的行移位和列混合DES的子密钥编排对应AES的密钥扩展。有DES打底AES会好学很多。第二条线分组模式。CBC和ECB只是两种基础模式你接下来肯定会遇到CTR、GCM、CFB、OFB这些模式。CTR和GCM的特别之处在于它们把分组密码变成了流密码GCM还内建认证能力。现代接口里GCM用得越来越多它同时解决机密性、完整性、真实性三个问题这是CBC做不到的。理解CBC里IV的作用后再去看GCM里Nonce的设计会非常顺畅。第三条线消息认证码MAC与哈希。很多DES老接口不只是加解密还会算MAC比如IBM制定的IBM 3624 PIN加密算法、CUP的MAC算法。MAC的底层往往就是DES/3DES的CBC模式把最后一组密文截取一部分作为校验码。理解MAC之后你再看HMAC、SHA系列密码学的知识版图才算完整。学习路线切忌贪快。我见过不少朋友一上来就啃AES-GCM的数学原理结果被伽罗华域乘法劝退。更好走的路是先掌握DES的Feistel迭代思想再学AES的SPN结构最后才研究认证加密。每一层都有上一层的概念做铺垫整个体系就会牢固得多。8. 一段实践感言算法学习最后拼的是场景判断力写了这么多我想收个尾。密码学算法看起来都是数学公式但真正让我觉得懂了一点的时刻不是背下S盒的位置不是跑通一段加解密代码而是在面对一个具体场景时能迅速判断出该用什么方案。举个最简单的例子有人问我想把用户手机号加密存数据库如果你张口就说用DES那说明你对这个算法还有滤镜正确思路是先问一句——加密后要不要模糊查询要不要保证唯一性数据量多大密钥怎么管……这些问题的答案才会指向AES、HSM、还是Token化。这恰恰是DES留给我的最大一笔财富一个算法的价值从来不只在于它本身是否强壮而在于你能不能在恰当的时机把它安放在恰当的位置。了解DES不是为了让它重出江湖而是为了理解算法设计的基本矛盾——效率、安全、兼容性——以及所有对称密码算法共享的那套思维框架。希望这篇笔记能让你少走弯路至于代码嘛直接抄但记得把密钥换掉。
返回列表