DES对称加密算法
1. 创建资源
开始实验之前,您需要先创建实验相关资源。
在实验室页面,单击创建资源。
(可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。
说明:资源创建过程需要3~5分钟(视资源不同开通时间有所差异,ACK等资源开通时间较长)。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。
实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。
资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息
2. 实验原理
实验原理
DES加密算法简介
DES(Data Encryption Standard)是分组对称密码算法。DES采用了64位的分组长度和56位的密钥长度,它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。
DES算法利用多次组合替代算法和换位算法,分散和错乱的相互作用,把明文编制成密码强度很高的密文,它的加密和解密过程用的是同一算法。其在算法结构上主要采用了置换、代替、模二相加等函数,通过轮函数迭代的方式来进行计算和工作。
DES算法加密数据的流程如图1所示。
明文处理
图1中左半部分是对明文处理的三个阶段,下面分具体的关键步骤来解释:
初始IP置换
首先64比特明文经过初始置换IP(表1),即将数据的第58位置换到第1位,第50位置换到第2位···,产生64比特的输出X,再将X分成左半部分𝐿0 和右 半部分𝑅0。这是初始IP置换,然后对置换后的数据进行16轮加密处理。
16轮加密处理
DES的一轮加密如图2所示。
加密过程主要在𝑓函数中进行。𝑓函数的输入是一个32比特的数据(𝑅𝑖−1) 和48比特的子密钥(比特的子密钥(𝐾𝑖),输出是32比特的数据,将𝑓函数输出的32比特的数据与𝐿𝑖−1做异或运算得到𝑅𝑖。将𝑅𝑖−1的值直接赋给𝐿𝑖,得到𝐿𝑖。
𝑓函数如图3所示,包括扩展置换E,密钥异或运算,S盒变换和P盒置换。
首先通过扩展置换E将𝑅0扩展为48位,扩展规则如下表2,即将原数据的第32位放在第1位,第1位放在第2位,...,依次类推。
经过扩展变换E得到的48比特数据与𝐾𝑖进行密钥异或运算,得到48比特数据。进行S盒变换。输出32比特数据。最后经过固定的P盒置换得到𝑓函数的32比特输出数据。S盒和P盒分别见表3、表4。
S盒变换过程为:将S盒6位输入的第1位和第6位组成一个2位的二进制数对应S盒中的某一行,中间4位组成一个4位二进制数对应位二进制数对应S盒中的某一列。例如S1盒的输入为100110,则对应S1[2][3],即S1盒第3行第4列的数8 (1000)。(注:从0开始)
经过S盒变换后,产生8组4比特的数据,拼接后为32比特。32比特作为输入进行P盒置换。P盒的具体置换过程即将原数据的第16位置换到第1位,第7位置换到第2位。经过P盒置换后得到32比特的数据。
这就是𝑓函数的构造方式,以此类推进行16轮加密。
结尾变换
结束最后一轮加密之后,会产生一个64比特的数据,将这64比特数据平均分为左右两等分,然后将左右两等分进行位置调换,即原来左等分的数据整体位移至右侧,而原来右等分的数据则整体位移至左侧。再经过逆初始置换 ,最终将得到一组64比特的密文。逆初始变换见表5。即将数据的第40位置换到第1位,第8位置换到第2位,...,依次类推。结果即为密文。
密钥处理
图1右半部分给出了密钥的产生过程。具体过程如下:
密钥置换PC-1
DES算法的加密密钥是64比特,但是由于密钥的第n∗8(n=1,2...8)位是奇偶校验位,因此实际参与加密的密钥只有56比特。去掉8个奇偶校验位,用密钥置换PC-1(表6)置换剩下的56位密钥,即将密钥的57位置换到第1位,第49位置换到第2位......
子密钥的生成
将56位密钥等分成两部分,前28位记为𝐶[0],后28位记为𝐷[0]。 计算子密钥(共16个),从𝑖 = 1开始,分别对𝐶[𝑖−1],𝐷[𝑖−1]做循环左移来生成𝐶[𝑖],𝐷[𝑖]。每次左移的位数见下表。
将𝐶[𝑖],𝐷[𝑖]合并后通过压缩置换PC-2,即将第14位置换到第1位,将17位置换到第2位···,得到48位子密钥𝐾𝑖 。
DES解密算法
由于DES算法属于对称密码体制算法,因此DES的解密过程和加密过程是一样的,其加密和解密过程也可以用同样的方法。
3. 实验内容
实验内容
编写代码实现DES加密、解密算法。语言不限(推荐使用Python语言)。
将加密后的密文、解密后的明文输出到文件或屏幕。选取不同的明文加密(自己的名字,可以是拼音,也可以是汉字编码后的,取最后64bit)。
独立完成实验报告(包含实验思路,实验结果截图等),不得抄袭。
# -*- coding: utf-8 -*- """ Created on Tue Apr 06 23:15:21 2021 @author: Zheng Yuntao """ #import sys """S盒与其他置换盒的数据""" # WRITE YOUR CODE HERE! def permutation_by_table(block, block_len, table): """实现置换表的功能""" # WRITE YOUR CODE HERE! def generate_round_keys(C0, D0): """生成子密钥""" # WRITE YOUR CODE HERE! def round_function(Ri, Ki): """f函数""" # WRITE YOUR CODE HERE! def encrypt(plaintext, key): """加密算法""" # WRITE YOUR CODE HERE! return 0 def decrypt(ciphertext, key): """加密算法""" # WRITE YOUR CODE HERE! return 0 if __name__ == '__main__': # 测试代码 text = '12345678' key = 'FUDANSTU' cipher_text = encrypt(text, key) print (cipher_text) plain_text = decrypt(cipher_text, key) print (plain_text) # WRITE YOUR CODE HERE!
实验链接:https://developer.aliyun.com/adc/scenario/e0b41962a14e4e33a817578decf75d78