DES/3DES/AES

Author Avatar
Euan 9月 09, 2019
  • 在其它设备中阅读本文章

DES/3DES/AES

实验原理

DES算法的密钥长度已经被证明不能满足当前安全的要求,但为了充分利用现有的DES软件和硬件资源,人们开始提出针对DES的各种改进方案,最简单的方案是使用多重DES,使用多个不同的DES密钥利用DES加密算法对明文进行多次加密。这样可以增加密钥量,从而大大提高抵抗对密钥的穷举搜索攻击的能力。而最常用的多主要是三重DES算法。

算法原理

三重DES有4种模式,如下图1所示:

DES-EEE3 模式:该模式中共使用3个不同密钥,顺序使用3次DES加密算法。

DES-EDE3 模式:该模式中共使用3个不同密钥,依次用加密—解密—加密。

DES-EEE2 模式:该模式中共使用2个不同密钥,顺序使用3次DES加密算法,其中第一次和第三次加密使用的密钥相同。

DES-EDE2 模式:该模式中共使用2个不同密钥,依次用加密—解密—加密,其中加密算法使用的密钥相同。

Kq73B4.png

DES-EEE3模式

Kq7QjU.png

DES-EDE3模式

Kq71uF.png

DES-EEE2模式

Kq78HJ.png

DES-EDE2模式

图1 三重DES的使用模式

前两种模式使用3个不同的密钥,每个密钥长度为56位,因此三重DES总的密钥长度达到168位。后2种模式使用2个不同的密钥,总的密钥长度为112位。以前两种模式为例,设k1,k2,k3,是三个长度为56位的密钥。给定明文x,则明文为

Kq75Dg.png

给定密文y,则明文为

Kq74KS.png

在1999年10月发布的DES标准报告中推荐使用的三重DES是k1=k3的情形,两个密钥的三重DES算法。这是一种比较受欢迎的DES的替代方案。银行业已大量采用这种算法。k1,k2,k3互不相同的三DES在实际应用中也经常被采用。下面我们给出k1=k3模式的三重DES加密和解密内部流程。

Kq7McT.png

图2

算法参数

在三重DES算法中,其参数与DES是保持一致的,密钥总长度为64位。其中有效长度为56位,并附加上8位的奇偶校验位。分组长度为64位,初始置换IP,逆初始置换IP-1,E盒,S盒均在DES算法中予以说明,这里就不再赘述了。

算法流程

根据在上文中叙述的有关算法的运行原理及加解密流程,我们给出了其用C语言实现的源代码,相关的程序流程图如图3所示。由于三重DES算法的代码以单重DES算法为基础,除了中间需要一步逆向的解密过程外,其他均是DES的单重加密。所以我们这里仅给出单重DES的加密流程图。

Kq7JE9.png

图3

实验环境

Windows Server 2012 R2

实验工具在【C:\密码学课程\01密码学算法\04 分组密码\02 3DES密码算法】

打开文件【3DES.exe】,即可得到3DES加密算法的结果。如图4所示

Kq7t41.png

图4

2.3DES核心密码算法

2.3DES核心密码算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdio.h"
#include "des.h"
#include "pub.h"
void main()
{
unsigned char key1[] = "12345678";
unsigned char key2[] = "abcdefgh";
unsigned char key3[] = "12345678"; //如果只需要两组密钥,则本组密钥可以和密钥1一样。
unsigned char en_data[] = "Cryptosystem lab";
unsigned char en_out_put[8];
printf("\r\n++++++++3DES 加密示例++++++++");
print_hex("3DES [输入]明文 ", en_data, 8);
print_hex("3DES [输入]密钥1", key1, 8);
print_hex("3DES [输入]密钥2", key2, 8);
print_hex("3DES [输入]密钥3", key3, 8);
//3DES 加密
des(en_data, key1, en_out_put, DES_ENCRYPT);
des(en_out_put, key2, en_data, DES_DECRYPT);
des(en_data, key3, en_out_put, DES_ENCRYPT);
print_hex("3DES [输出]密文 ", en_out_put, 8);
printf("\r\n");
printf("\r\n++++++++3DES 解密示例++++++++");
print_hex("3DES [输入]密文 ", en_out_put, 8);
print_hex("3DES [输入]密钥1", key1, 8);
print_hex("3DES [输入]密钥2", key2, 8);
print_hex("3DES [输入]密钥3", key3, 8);
//3DES 加密
des(en_out_put, key3, en_data, DES_DECRYPT);
des(en_data, key2, en_out_put, DES_ENCRYPT);
des(en_out_put, key1, en_data, DES_DECRYPT);
print_hex("3DES [输出]明文 ", en_data, 8);
printf("\r\n");
return;
}

大概看了一下代码,也是使用des头文件中的函数进行加密,本实验也比较简单

AES实验

加密

Kq7YNR.png

解密

Kq7U9x.png

后面文件加密原理一样不再傻瓜式操作

实验思考

1.3DES算法与DES算法和AES算法有什么区别?

DES使用1条64位的密钥对数据进行一次加密。

3DES是DES加密算法的一种模式,它使用3条64位的密钥对数据进行三次加密。3DES是DES向AES过渡的加密算法(1999年,NIST将3-DES指定为过渡的加密标准),是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。

AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高

AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。

AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。

分组密码总结:与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议

本文链接:https://zyhang8.github.io/2019/09/09/cipher-exp2/