加密算法(1)DES

DES加密算法最早是由IBM在上世纪70年代开发的,后来成为美国军方和政府机构的标准加密算法,因此DES几乎成为全球最流行的对称加密算法,采用块加密的方式,广泛应用于各个领域。

DES的基本流程如下图所示:

通过56位密钥和64位明文之间的各种替换和迭代运算,最后生成64位的密文。在实际应用中通常明文和密钥都是8个字节,但是对于8个字节的密钥而言,每个字节只有前面的7位数据是有效的,第8位数据在DES计算过程中是忽略的,也就是说,如果你计算的密钥值分别为:0102030405060708,和0003020504070609,那么计算的结果应该是一样的,因为两组数据分别去掉每个字节的第8位之后是完全相同的。

其中:

IP代表初始置换(Initial Permutation),说白了就是把原来的数据按照规定的格式进行重新组合,俗话说就是倒腾数据;

PC-1:表示置换选择1(Permutation Choice 1),也是按照规定的格式倒腾;

PC-2:表示置换选择2(Permutation Choice 2),含义同上;

IP-1:表示逆初始置换,按照和IP初始置换相反的方式把数据再倒腾回来。

 

在实际应用中一般有单DES和三DES两种方式,我们把明文记作:P,密文记作:E,密钥记作:K,加密记为:DES(),解密记为:DES-1(),那么单DES加密可以描述为:

E=DES(P,K)

单DES解密类似可以描述为:

P=DES-1(E,K)

对于三DES而言,可以理解为用三个密钥K1,K2,K3分别进行三次加解密来求得最终的密文,可以描述为:

E=DES(DES-1(DES(P,K1),K2),K3)

实际应用中多数的三DES运算都使用16字节的密钥,分别定义为左右两个子密钥,即KLKR,称为双长度密钥的三DES运算,加解密公式可以描述为:

E=DES(DES-1(DES(P,KL),KR),KL)

P=DES-1 (DES (DES-1 (E,KL),KR),KL)

目前多数智能卡芯片都已经集成了硬件DES引擎,可以很方便地进行DES运算,而如果使用软件实现DES的话,一个DES算法大约需要占用1K左右的代码空间,对于没有接触过DES算法的工程师来说,通常需要一周的时间可以完成一个比较完美的汇编语言DES算法。而如果采用C语言的话,时间会稍微快一点。

### DES 加密解密详细流程及步骤 #### 明确 DES 的基本概念 数据加密标准(Data Encryption Standard, DES)是一种对称加密算法,其核心是对64位明文分组进行一系列复杂的变换操作。整个过程依赖于一个56位的有效密钥以及额外8位用于奇偶校验的冗余位[^1]。 #### 密钥生成阶段 在正式进入加密和解密之前,需要通过初始输入的64位密钥(其中有效部分为56位),经过压缩置换得到子密钥序列。具体来说: - 输入的原始密钥会先经历一次 **PC-1 压缩置换**,将实际参与运算的部分提取出来。 - 接着,这些被选取出来的比特分为两半 C 和 D,在每一轮迭代前分别向左循环移位一定次数。 - 移位后的结果再经由第二次置换 PC-2 转化成当前轮次使用的子密钥 K_i (i=1~16)[^2]。 #### 初始排列 IP 及逆初始排列 IP^-1 对于待处理的数据块而言,首先要执行的是固定模式下的重新排序——即所谓的 Initial Permutation (IP),这一步骤不会引入任何保密性因素;而在最终输出端,则需应用对应的反向转换 Inverse of the Initial Permutation (IP^-1) 来恢复原有顺序关系。 #### 主要迭代环节 F 函数描述 DES 中最复杂也是最关键的一个组成部分就是 Feistel 结构中的非线性替代盒 S-boxes 所定义的功能模块 f(R,K): 给定右半边 R 与本轮次对应子密钥 Ki 合并后扩展 E 成长度加倍形式; 随后两者异或所得作为查找表索引位置访问各个独立设计的小型映射单元Sj(j∈{0,...7}), 最后收集所有返回值并通过 P 替换形成新的状态表示L_{n} 或者R_{n}。 以下是具体的Python实现代码片段展示如何模拟单步F函数计算逻辑: ```python def feistel_function(right_half_bits, subkey): expanded_right = expand_permutation_table(right_half_bits) # 使用E表展开右侧32bit至48bit xor_result = perform_xor(expanded_right, subkey) # 将扩展后的右边与子密钥做XOR sbox_output = [] for i in range(8): # 遍历每一个sbox row_index = int((xor_result[i*6] << 1) | xor_result[(i*6)+5], base=2) col_index = int(''.join(map(str,xor_result[(i*6+1):(i*6+5)])),base=2) value_from_sbox = get_value_from_specific_SBox(i,row_index,col_index)# 获取指定sbox内的数值 binary_representation_of_val = convert_to_4bits(value_from_sbox) # 转换成固定的四位二进制串 sbox_output.extend(binary_representation_of_val) final_foutput = apply_p_transformation(sbox_output) # 应用P置换获得最终f函数的结果 return final_foutput ``` 上述伪代码展示了Feistel网络内部的核心运作机制之一:F函数的具体实现细节。 #### 完整加密过程概述 基于以上各组件介绍可以总结出完整的DES加密流程如下所示: 1. 对原始消息按照规定方式填充直至满足64-bit倍数条件; 2. 每个64-bit分组依次送入初始化排列(IP); 3. 经过划分左右两侧之后开始重复调用feistel_structure共十六轮; 4. 最终合并左右两端再次施加逆初始排列(ip_inv),从而得出密文. 与此相对应地,只要掌握相同的秘密钥匙k就可以遵循完全一致但是方向相反的操作路径来还原原来的清晰文本信息了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值