DES 加密解密

本文主要介绍了江科大信息安全作业中关于DES加密解密的实现过程。内容包括编译环境的选择(如DEV 5.6,注意VS编译需要特定改动),详细描述了加密解密的输入输出步骤,即输入8字符的明文和密钥进行加密,然后使用相同的密钥解密。同时,提供了代码示例和实际运行的结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

江科大信息安全作业 DES 加密解密

编译环境 

DEV 5.6 【VS 编译不通过 需要改动】

输入输出

第1行:输入8字符待加密明文。

第2行:输入8字符密钥。

第3行:输出 结果。

第四行:输入解密密钥。(与加密密钥相同 才能正确解密)

第五行:输入解密答案。

代码

#include <stdlib.h>
#include <stdio.h>
// 对明文执行IP置换得到L0,R0 (L左32位,R右32位)               [明文操作]
const char IP_Table[64]={             
	58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,
	62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,
	57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,
	61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7 
};

// 对迭代后的L16,R16执行IP逆置换,输出密文
const char IPR_Table[64]={              
	40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,
	38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,
	36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,
	34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25	
};

/*--------------------------- 迭代法则 ----------------------------*/ 

// F函数,32位的R0进行E变换,扩为48位输出 (R1~R16)        [备用A]  [明文操作] 
static char E_Table[48]={
	32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
	 8, 9,10,11,12,13,12,13,14,15,16,17,
    16,17,18,19,20,21,20,21,22,23,24,25,
    24,25,26,27,28,29,28,29,30,31,32, 1
};

// 子密钥K(i)的获取 密钥为K 抛弃第6,16,24,32,40,48,64位          [密钥操作] 
// 用PC1选位 分为 前28位C0,后28位D0 两部分  
static char PC1_Table[56]={
	57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,
	10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,
	63,55,47,39,31,23,15, 7,62,54,46,38,30,22,
	14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4
};

// 对C0,D0分别进行左移,共16次,左移位数与下面对应                 [密钥操作]
static char Move_Table[16]={
	 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};

// C1,D1为第一次左移后得到,进行PC2选位,得到48位输出K1   [备用B]   [密钥操作]     
static char PC2_Table[48]={
	14,17,11,24, 1, 5, 3,28,15, 6,21,10,
	23,19,12, 4,26, 8,16, 7,27,20,13, 2,
	41,52,31,37,47,55,30,40,51,34,33,48,
	44,49,39,56,34,53,46,42,50,36,29,32	
};

/*------------- F函数 备用A和备用B 异或 得到48位输出 ---------------*/ 

// 异或后的结果48位分为8组,每组6位,作为8个S盒的输入             [组合操作] 
// S盒以6位作为输入(8组),4位作为输出(4*(8组)=32位)
// S工作原理 假设输入为A=abcdef ,则bcde所代表的数是0-15之间的
// 一个数记为 X=bcde ,af代表的是0-3之间的一个数,记为 Y=af 
// 在S1的X列,Y行找到一个数Value,它在0-15之间,可以用二进制表示
// 所以为4bit (共32位)  
static char S_Box[8][4][16]={
	//S1
	14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
	 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
	 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7
### DES加密解密方法概述 数据加密标准(Data Encryption Standard, DES)是一种对称加密算法,它通过一个固定的56位密钥来加密和解密数据。DES将明文分为64位的数据块,并对其进行一系列复杂的置换和替换操作以生成密文[^1]。 以下是关于DES加密解密的具体实现方式: #### 密钥长度与分组大小 DES使用的是固定长度的密钥——即56位有效密钥加上8位奇偶校验位形成64位输入密钥。每次处理的数据块也是64位长。这种设计使得DES能够快速执行加密和解密过程[^2]。 #### 加密流程描述 在加密过程中,原始消息被分割成多个64比特的小段,每一段都经过初始排列IP (Initial Permutation),随后进入由16轮迭代组成的Feistel结构,在最后一轮结束后再做一次逆向初始排列(IP^-1)[^3]。 #### 解密流程描述 由于DES采用对称密码体制,因此其解密过程实际上就是按照相反顺序重复相同的运算步骤,只是使用的子密钥次序颠倒过来而已[^4]。 下面给出Python语言中的简单示例代码展示如何利用pycryptodome库完成基本的DES解密功能: ```python from Crypto.Cipher import DES from Crypto.Util.Padding import pad, unpad import base64 def des_encrypt(plaintext, key): cipher = DES.new(key.encode(), DES.MODE_ECB) padded_text = pad(plaintext.encode(), DES.block_size) encrypted_data = cipher.encrypt(padded_text) return base64.b64encode(encrypted_data).decode() def des_decrypt(ciphertext, key): cipher = DES.new(key.encode(), DES.MODE_ECB) decoded_ciphertext = base64.b64decode(ciphertext) decrypted_padded_data = cipher.decrypt(decoded_ciphertext) return unpad(decrypted_padded_data, DES.block_size).decode() # Example Usage key = '12345678' # Must be exactly 8 bytes long. message = "HelloWorld" ciphered_message = des_encrypt(message, key) print(f"Cipher Text: {ciphered_message}") original_message = des_decrypt(ciphered_message, key) print(f"Original Message: {original_message}") ``` 上述程序展示了基于ECB模式下的基础版DES加密/解密逻辑[^5]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值