• 软考信息安全工程师必会--3000+字文章浅析DES加密算法


    目录

    前言

     什么是DES加密算法

    整体流程

    IP置换

    子密钥K

    压缩置换1

    循环左移

    拓展置换2

    拓展置换E

     S盒代替

    S1盒

    S2盒

    S3盒

    S4盒

    S5盒

    S6盒

    S7盒

    S8盒

    P盒置换

    末置换


    前言

    🍀作者简介:被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。

    🍁个人主页:红中

    🫒每日emo:行书如行云流水

    🍂我就不信我上不了热榜!!

     前几天背软考资料的时候,密码学那部分有个东西叫DES加密算法,书上讲得不太清楚,搜了很多博客也没看到完全讲解清楚的,今天我就出一篇,希望能让各位清楚明白

     什么是DES加密算法

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。---------------------------------------------------------------------------------------------引自百度百科

    那简单来叭叭两句,DES算法实际上就是

    把64位明文输入块进行加密,输出64位密文输出块的算法

    它使用的密钥也是64位的,其中56位为工作密钥,剩余8位为奇偶校验位。

    DES算法整体来说用到了三个东西

    分别是:

    1. Data
    2. Key
    3. Mode

    各自对应着啥玩意呢:

    1. 数据:即输入的明文/密文64位数据,再说简单点,就是你想加密/解密的数据。
    2. 密钥:为7个字节共56位,如果像我前头说“密钥为64位”,那也是剩余8位为奇偶校验位。分别是第8,16,24,32,40,48,56,64位
    3. 模式:就是工作模式,总共就两种--加密/解密

    至于DES加密算法的特点:

    分组较短、密钥太短、密码生命周期短、运算速度较慢。

    整体流程

     图片引自夏冰加密软件技术博客

    首先如果是不了解密码学的哥们姐们,可能都会一脸懵(比如我

     

    那么咱从上到下依次把每个步骤分析一下哈

    IP置换

    其实IP置换的原理很简单,只需要照着下面的表,把数填进去就行。

     没明白?那我举个栗子

    假设我们要加密abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+=

    就依次把数填进去

     全部填完之后,按照从左到右,从上到下的顺序整理即可

     那我们仔细看看这个表,发没发现点规律

     最右边那一列

    依次是

    2、4、6、8、1、3、5、7

    然后是

    10、12、14、16、9、11、13、15

    那是不是可以这样看

     其实不用太在意这个规律 

     置换之后的数据为

    5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph4WOGyqia6YQI(i)Askc80SKCume+2UMEwog

    在初始置换完成后,我们需要把数据一分为二

    分别叫做L0,R0

    L0 = “5XPHzrjb7ZRJBtld91TLDvnf=3VNFxph”

    R0 = “4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”

    再看看这个图,生成L0、R0之后,R0直接成为新一轮的L1,同时对R0通过函数f、子密钥K进行处理,而后将处理得到的数据与L0进行异或运算,结果即为新的R1

    接着往下走,就到了最复杂的地方

    子密钥K

     图片来自博客园

    从流程图我们要思考一下,这个K是怎么从64位到56位的呢?

    这就涉及到了压缩置换1。

    压缩置换1

    首先前面提过,有八位是奇偶校验位,按64位分成8个字节一组,共八组,取出每一组的最后一位,变成56位

    然后类似于初始置换,根据下面的子密钥交换规则表,将数据填到对应的位置即可

     填完之后

    将56位数据一分为二,分别称为C0、D0

    循环左移

    然后我们需要通过循环左移,但是左移的时候,位数还不能变,所以就要把左移出去的头部数据接回尾部,类似于一个闭环。

     但是左移的位数也不是不变的,需要根据循环的轮数相应移位

     左移之后C0、D0变为C1、D1

    然后将C1、C2合并回56位的数据

    当然,还没完,还有个压缩置换2

    拓展置换2

     由图表可知,这次要去除位数为9的倍数的数字,填进去输出来,得到K1

    拓展置换E

    拓展置换E主要用于在输入数据刚刚进行van♂初始置换后,将数据分为L0、R0后,对R0进行操作。

    按照下表先将数据填写完毕,然后聊聊这个红色字体该怎么处理

     

    对于红色字体的处理,即将对应标号的一整行拼接到相应位置,例如下图

     拿上面的R0 = “4WOGyqia6YQI(i)Askc80SKCume+2UMEwog”举例(别忘了R0是由64位的R分出来的,正好32位

    首先填写下面的这部分

    填完之后,在左右两侧补上,类似于下图

     

     稍微画一下,不然全画太乱了,相信你们会理解我的

     拓展后便得到了48位的R0

    然后进行K1与R0的异或运算

     S盒代替

    S盒的作用就是把上面的48位数据压缩为32位

    S1盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    14

    4

    13

    1

    2

    15

    11

    8

    3

    10

    6

    12

    5

    9

    0

    7

    1

    0

    15

    7

    4

    14

    2

    13

    1

    10

    6

    12

    11

    9

    5

    3

    8

    2

    4

    1

    14

    8

    13

    6

    2

    11

    15

    12

    9

    7

    3

    10

    5

    0

    3

    15

    12

    8

    2

    4

    9

    1

    7

    5

    11

    3

    14

    10

    0

    6

    13

    S2盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    15

    1

    8

    14

    6

    11

    3

    4

    9

    7

    2

    13

    12

    0

    5

    10

    1

    3

    13

    4

    7

    15

    2

    8

    14

    12

    0

    1

    10

    6

    9

    11

    5

    2

    0

    14

    7

    11

    10

    4

    13

    1

    5

    8

    12

    6

    9

    3

    2

    15

    3

    13

    8

    10

    1

    3

    15

    4

    2

    11

    6

    7

    12

    0

    5

    14

    9

    S3盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    10

    0

    9

    14

    6

    3

    15

    5

    1

    13

    12

    7

    11

    4

    2

    8

    1

    13

    7

    0

    9

    3

    4

    6

    10

    2

    8

    5

    14

    12

    11

    15

    1

    2

    13

    6

    4

    9

    8

    15

    3

    0

    11

    1

    2

    12

    5

    10

    14

    7

    3

    1

    10

    13

    0

    6

    9

    8

    7

    4

    15

    14

    3

    11

    5

    2

    12

    S4盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    7

    13

    14

    3

    0

    6

    9

    10

    1

    2

    8

    5

    11

    12

    4

    15

    1

    13

    8

    11

    5

    6

    15

    0

    3

    4

    7

    2

    12

    1

    10

    14

    9

    2

    10

    6

    9

    0

    12

    11

    7

    13

    15

    1

    3

    14

    5

    2

    8

    4

    3

    3

    15

    0

    6

    10

    1

    13

    8

    9

    4

    5

    11

    12

    7

    2

    14

    S5盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    2

    12

    4

    1

    7

    10

    11

    6

    8

    5

    3

    15

    13

    0

    14

    9

    1

    14

    11

    2

    12

    4

    7

    13

    1

    5

    0

    15

    10

    3

    9

    8

    6

    2

    4

    2

    1

    11

    10

    13

    7

    8

    15

    9

    12

    5

    6

    3

    0

    14

    3

    11

    8

    12

    7

    1

    14

    2

    13

    6

    15

    0

    9

    10

    4

    5

    3

    S6盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    12

    1

    10

    15

    9

    2

    6

    8

    0

    13

    3

    4

    14

    7

    5

    11

    1

    10

    15

    4

    2

    7

    12

    9

    5

    6

    1

    13

    14

    0

    11

    3

    8

    2

    9

    14

    15

    5

    2

    8

    12

    3

    7

    0

    4

    10

    1

    13

    11

    6

    3

    4

    3

    2

    12

    9

    5

    15

    10

    11

    14

    1

    7

    6

    0

    8

    13

    S7盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    4

    11

    2

    14

    15

    0

    8

    13

    3

    12

    9

    7

    5

    10

    6

    1

    1

    13

    0

    11

    7

    4

    9

    1

    10

    14

    3

    5

    12

    2

    15

    8

    6

    2

    1

    4

    11

    13

    12

    3

    7

    14

    10

    15

    6

    8

    0

    5

    9

    2

    3

    6

    11

    13

    8

    1

    4

    10

    7

    9

    5

    0

    15

    14

    2

    3

    12

    S8盒

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    0

    13

    2

    8

    4

    6

    15

    11

    1

    10

    9

    3

    14

    5

    0

    12

    7

    1

    1

    15

    13

    8

    10

    3

    7

    4

    12

    5

    6

    11

    0

    14

    9

    2

    2

    7

    11

    4

    1

    9

    12

    14

    2

    0

    6

    10

    13

    15

    3

    5

    8

    3

    2

    1

    14

    7

    4

    10

    8

    13

    15

    12

    9

    0

    3

    5

    6

    11

     将得到的R0平均分为8组,每组对应一个S盒, 每一组的数据长度为6位

    假设第一组的二进制数据为:“101010”
     那么,我们取第一位与最后一位,组成十进制行数:“10”=2
     然后取中间四位,组成十进制列数:“0101”=5
     那么,在对应的S1盒中,取2行5列的数据:6
     再将取得的数字转换为2进制:“0110”
     将这个得到的4位二进制数据,代替原来第一组的6位数据,这样一来,等8个S盒全部代替完毕,我们就得到32位的数据。

     S盒置换完成后,就要进行P盒置换。

    P盒置换

    输入32位,输出32位(图源百度百科

    填完之后,我们终于得到了f(R0,K1)

    再与L0进行异或运算,得到了第一轮运算最终的R1,然后再将R0的值赋给L1,就完成了第一轮的运算,得到了L1,R1。

     经过16轮的运算,我们终于得到了最终的L16、R16

    最后将二者合并起来,但是合并时需要将两数据调换位置

    也就是R16L16,合并之后就得到了64位的数据。

    最后进行末置换

    末置换

    按图表位置填写对应数据即可 

     最后吐个槽,我想上热榜。。。

  • 相关阅读:
    【图像分割】距离正则化水平集演化及其在图像分割中的应用(Matlab代码实现)
    冒死开源。阿里新产Spring Boot+Spring Cloud微服务开发实战笔记
    C++ 并发编程实战 第四章 并发操作的同步
    JS 实现自定义弹窗
    ChatGPT HTML JS Echarts实现热力图展示
    【ESD专题】如何防止连接器空脚的ESD电弧
    开发 Java 用小而美的框架,Solon v1.9.4 发布
    SpringMVC基于注解使用:拦截器
    如何把文件从本地上传云服务器
    NodeJs的模块化和包
  • 原文地址:https://blog.csdn.net/m0_55400802/article/details/127956751