DES加解密原理

简介:

1.   简介

       DES是Data Encryption Standard(数据加密标准)的缩写。它是由IBM公司研制的一种对称密码算法,美国国家标准局于1977年公布把它作为非机要部门使用的数据加密标准。

       DES加密算法是一种典型的对称加密,分组算法,以64位为分组,对数据加密,它的密钥长度是56位(密钥可以是任意的56位的数,而且可以任意时候改变),加密解密用同一算法。

2.   DES加密算法流程概要(可配合下文的详细流程进行理解):

       首先要生成一套加密密钥,从用户处取得一个64位长的密码口令(密钥中每个第8 位都用作奇偶校验,故有效密钥长度是56位),然后通过等分、移位、选取和迭代(下文有等分、移位、选取和迭代的详细过程)形成一套16个加密密钥,分别供每一轮运算中使用。

       DES对64位(bit)的明文分组M进行操作,M经过一个初始置换表IP,置换成m0。将m0明文分成左半部分和右半部分m0 = (L0,R0),各32位长。然后进行16轮完全相同的运算(迭代),这些运算被称为函数f,在每一轮运算过程中数据与相应的密钥结合。

       在每一轮中,密钥位移位,然后再从密钥的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的48位数据,再将其压缩置换成32位。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次。

       经过16轮迭代后,左,右半部分合在一起经过一个末置换(数据整理),这样就完成了加密过程。

加密流程如图所示:

f85a7be7d1437cc62f0987814ea745051a1da683

3.   DES加密算法详细过程:

3.1.  A密钥生成

3.1.1.   第A-1步 取得密钥

从用户处取得一个64位(本文均指二进制位))长的密码口令key,

265effd33e2144793fc419ecbba42b46b61432a7

       去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥。

3.1.2.   第A-2步 等分密钥

表1:
输入密钥位序/ A位序对照表

ed934b5df730123039b79ac2ab9d57869cf028ee

表1:密钥A位序对照表

注:表中每个单元格的数字是输入密钥位序,每个单元格的位置排序就是A位序,从左向右排,排完一行接着排下一行(下同)。

表2:
输入密钥位序/ B位序对照表

4c09615795e291e66371a8b4812cb617df18eb0d

表2: 密钥B位序对照表

  通过以上两个表,把第A-1步中生成56位输入密钥分成均等的A、B两部分,每部分为28位(注意:以上两个表中没有8、16、24、32、40、48、56、64位,是因为这些位都是上文A-1步中提到的奇偶校验位)。而且,等分为两部分的过程也不是简单地前后一分为二,而是参照表1和表2把输入密钥的位值填入相应的位置。 按对照表1所示,A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,……,依此类推,A的最后一位第28位是64位密钥的第36位。这样,形成了A、B两部分:

61d95d845365f7109301faecff8202130103763a

  3.1.3.   第A-3 步 密钥移位

表3:
每次迭代时密钥循环
左移的位数

a9e095e4d82bbdc6cd6dc7c9a15b2b3748b730e4

表3:密钥移位

  DES算法的密钥是经过16次迭代(循环左移)得到一组密钥的,把在第A-2步中生成的A、B视为迭代的起始密钥,表3显示每一次迭代时密钥循环左移的位数。 比如在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位。第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位。

第一次迭代:c05e95ee235d29b177119586baec8b193c099a7b,第i次迭代:0912b2aa95a0c5d399b23cf6eff9e4f58646777a

3.1.4.      第A-4步 密钥选取

在第A-3步中第i次迭代生成的两个28位长的密钥为ce77ef5a5151c900fc74873b56edae3f613a3ec3,

909ff53f366301efe3775e8c5fb6f825b86c186c,把ce77ef5a5151c900fc74873b56edae3f613a3ec3合并,得

aa7a42861a96db72ab6963463c4142974c464ae1

 

表4:
56
位密钥C的位序与加密密钥K的位序对照表

77e5c8ed7caed40e01a910e607be25432e6cb767

表4: 密钥C位序对照表

按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,。。。,依此类推,k的最后一位第48位是56位密钥的第32位。 这样,就生成了一个48位使用密钥:

6af9ed6b2b90694a8e1322b9124a5a9587b68c92

 这个密钥在后面的加密运算中将与进行第i次迭代加密的数据进行按位异或。

3.1.5.   第A-5步 密钥迭代

  DES算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行第A-3步和第A-4步,最终形成16套加密密钥:key[0],key[1],key[2],…key[14],key[15]。

 

3.2.       B数据的加密操作

3.2.1.   第B-1步 取得数据

  把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足(java中有好几种填充方式,这将在以后的java实现源码分析相关的文章中介绍):

9b023853a941e3f04a5d0313dc39e8e5861fcb06

3.2.2.   第B-2步 初始换位置换

表5:初始置换表

6126483c6cec099441e22ecdc78c1346943364ac

表5:数据初始置换表

注:表中每个单元格的位置排序是新数据的位序。下同。
  按照表5所示把输入的64位数据的原第58位换到第一位,原第50位换到第二位,依此类推,。。。,原第7位换到第64位。最后的得到新的64位数据。

置换前(oldData)与置换后(oldData)的数据如下:

66eee1dcbdd9c98d575151b47ef85f7967bf430d

3.2.3.    第B-3步 数据扩展

表6: 数据扩展对照表(输入数据位序/生成新数据位序)

3f1f236f7b4f2bdbdd575c6089bbcb4b9648fc59


表6: 数据扩展对照表

第一次迭代以第B-2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,先把64位数据按位置等分成左右两部分:

7ba4f7aa730abe2fca3966b9a82bde12dc2b5021

       保持left不变,根据表6把right由32位扩展置换成48位。在数据扩展操作中,有些输入数据位(如第1、4、5、17、28、29、32……等数位)用了两次,因此数据得到了扩展。这样得到扩展后的48位右半部分为: 

e91851a64f722632596e2f52cf082bf57ea8b79c

把扩展后的48位right与上文A-5步第i次迭代生成的48位加密密钥进行按位异或操作

f8472906c628c808aed2708ddfd6c55e462f9403

形成一个新的48位的right。

ac2a7b87eb7a2aef14974bf10d9a3d6b17bd0783

3.2.4.   第B-4步 数据压缩

先介绍8个压缩置换表:

表7.1:数据压缩置换表(灰色栏内是置换前的十进制数字,白色栏内是置换后的16进制数字)

d69bd9f3571c87d8130a363fe632a22f30d28008

表7.1:数据压缩置换表1

表7.2

ebcd7fcb23c0a90bf3f85628ef5543ab10c9c687

表7.2:数据压缩置换表2

表7.3 至表7.8与上表形式完全相同,仅数值不同,为节省篇幅从略不表。 

 在B-3步中形成了48位的right值,

ac2a7b87eb7a2aef14974bf10d9a3d6b17bd0783

需要把48位的right值转换成32位的right值。置换的方法如下:
第一步,先把right视为由8个6位二进制块组成, 即

c769a3b993d7dbe32bb9911725a529b9af5d6b38

a,b…. h都是6位二进制数,转换成10进制整数的值应当都不大于64。

       二步,a,b…h转换成10进制整数后,在对应的表中根据转换后整数值取得对应位置的替代值。这些替代值都是一个16进制的个位数,因此,每个替代值只占有二进制数4位。
  转换时各查各表:
  a对应表7.1;b对应表7.2;c对应表7.3;d对应表7.4;e对应表7.5;f对应表7.6;g对应表7.7;h对应表7.8。
  比如:
  a = 32 ,则到表7.1中找到32的位置,把对应的替代值16进制的8赋给a ;
  b = 53 ,则到表7.2中找到的位置,把对应的替代值16进制的c赋给b ;
  g = 16, 则到表7.7中找到16的位置,把对应的替代值16进制的a赋给g ;
  这样,每6位用一个4位替换,就完成了从48位向32位数据的压缩置换。

49522850add1cf1864dc469982ca7388a024898a

 有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的目的是相同的。

3.2.5.   第B-5步 数据换位置换

表8

bbc3cfd076d022feffc0e0dc7ab01cec9881b33c

表8:数据换位置换

把第B-4步形成的32位right

0f4f94fd1924d9e63f5ea59e52089afbb96d100e

根据表8进行转换:
  数据的原第16位换到第一位,原第7位换到第二位,……,依此类推,最后得到新的32位数据。

56b619a8180e83ef4c6154d19ef7600e02f62653

3.2.6.   第B-6步 交换数据

       把right 和left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left。

3.2.7.   第B-7步 迭代

  DES算法需要进行16次迭代,在完成16次迭代前,把第i-1次得到的的left和right的值作为第i次的输入数据,重复第B-3步到第B-6步的步骤。但是有一点要记住:在步骤第B-3中第i次迭代要选择第i次迭代生成的密钥与数据进行按位异或。

第B-8步 数据整理

表9

36e6da8c7959e831940d540b167061887c877c1e

表9:数据整理

为保证加密和解密的对称性,DES算法的前15次迭代每完成一次迭代都要交换left和right的值,第16次迭代不交换两者的数值。
  到此,把32位的left和right合并成64位的Data:

 

b55c35011e9446c44fa42a7df1a091c1524d8e0f

 根据表9重新调整Data的位值,数据的原第40位换到第一位,原第8位换到第二位,。。。,依此类推,最后得到新的64位。 

47e033447f4549814343522921cd1d9d80f4f517

 好了,经过了这么多次的数学运算,我们最终得到的Data即为密文。

4.   数据的解密操作

  数据解密的算法与加密算法相同,区别在于第B-3步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或。

5.   JAVA实现DES加解密

考虑到DES加解密过程的复杂性,jdk提供了相关api(在jce.jar中),后文将会详细介绍。

想了解更多信息请用微信扫描以下二维码关注本人原创公众号,多谢

7c87ecf7cc6461a5515c22afd6afd8f7da5ff01b



目录
相关文章
|
算法 搜索推荐 Java
DES - 对称加密算法简要介绍与JAVA实现
DES - 对称加密算法简要介绍与JAVA实现
996 2
|
8月前
|
弹性计算 安全 Linux
建站教程:使用阿里云服务器安装Z-Blog博客网站流程,新手一键部署指南
本教程详解如何在阿里云99元服务器上通过宝塔面板快速搭建ZBlog博客。基于CentOS 7.9系统,先安装宝塔面板,开放安全组端口,再一键部署Z-BlogPHP,全程图文指导,简单易懂,新手也能轻松完成博客搭建。
1231 2
|
6月前
|
人工智能 API 数据处理
【最新】OpenClaw阿里云/本地部署保姆级教程+Skills集成+百炼API配置+常见问题解答
2026年3月,OpenClaw(小龙虾AI)的Skills生态已突破1.3万个,涵盖办公自动化、数据处理、联网搜索、AI绘画、定时任务等全场景,成为OpenClaw从“单纯对话”升级为“全能工具”的核心支撑。很多用户部署完OpenClaw后,发现本体只能简单聊天,无法实现自动化办公、数据处理等实用功能,核心原因就是没有正确集成Skills——就像智能手机只装了系统,没装任何应用,无法发挥真正价值。
1896 15
|
8月前
|
存储 弹性计算 人工智能
2026年阿里云服务器(CPU / 内存 / 带宽)(年付 / 月付 / 按量付费)价格表收费标准说明
阿里云服务器2026年新版收费体系围绕“轻量应用服务器、ECS云服务器、GPU服务器”三大品类设计,核心遵循“场景适配定价、计费匹配周期”原则,同时通过秒杀、续费同价、老用户折扣等政策降低使用成本。不同机型的价格差异源于配置组合(CPU/内存/带宽)、计费模式(年付/月付/按量付费)及用户身份,覆盖从个人开发到企业级高性能计算的全场景需求。以下结合最新报价与优惠规则,详细拆解各类服务器的收费标准、适配场景及实操注意事项,帮用户精准核算成本。
2193 1
|
Android开发 数据安全/隐私保护 Python
微信抢红包脚本安卓插件,微信xposed抢红包模块, magisk微信抢红包模块
这个代码实现了一个完整的微信抢红包自动化工具,包含红包检测、自动点击、日志记录等功能
|
算法 安全 搜索推荐
深入理解密码学技术
深入理解密码学技术
657 1
|
IDE 开发工具
【CAN总线】手把手教你学习CAN总线(一)
【CAN总线】手把手教你学习CAN总线(一)
|
监控 安全 计算机视觉
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测
|
Cloud Native Java 开发者
Spring Boot 3.0-未来企业应用开发的基石
Spring Boot 3.0还支持其他云原生技术,如服务网格、配置中心等。这些技术的集成进一步提升了应用程序的可观测性、可配置性和可维护性,使得企业能够更好地管理和监控应用程序的运行状态。
473 0

热门文章

最新文章