分组密码之DES算法

您所在的位置:网站首页 des算法s盒的作用是压缩 分组密码之DES算法

分组密码之DES算法

2024-07-07 20:52| 来源: 网络整理| 查看: 265

DES(Data Encryption Standard)算法于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。

DES是一种分组密码,明文、密文和密钥的分组长度都是64位,并且都是面向二进制的密码算法。DES处理的明文分组长度为64位,密文分组长度也是64位,使用的密钥长度为56位(实现上函数要求一个64位的密钥作为输入,但其中用到的只有56位,另外8位可以用作奇偶校验位或者其他用途)。DES的解密过程和加密相似,解密时使用与加密同样的算法,不过子密钥的使用次序要反过来。DES的整个体制是公开的,系统的安全性完全靠密钥的保密。

DES加密算法的加密过程经过了三个阶段,整体结构如图:

2011092714051344

算法主要包括:

初始置换IP、16轮迭代的乘积变换、逆初始置换IP-1以及16个子密钥产生器。

初始置换IP、逆初始置换IP-1:

将64 bit明文的位置进行置换,得到一个乱序的64 bit明文组,而后分成左右两段,每段为32 bit,以L0和R0表示,IP中各列元素位置号数相差为8,相当于将原明文各字节按列写出,各列比特经过偶采样和奇采样置换后,再对各行进行逆序。将阵中元素按行读出构成置换输出。逆初始置换IP-1。将16轮迭代后给出的64 bit组进行置换,得到输出的密文组。输出为阵中元素按行读得的结果。IP和IP-1在密码意义上作用不大,它们的作用在于打乱原来输入x的ASCII码字划分的关系,并将原来明文的校验位x8, x16,, x64变成为IP输出的一个字节。

其置换规则见下表:image

初始置换表IP

即将输入的第58位换到第一位,第50位换到第2位,…,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左 32位,R0 是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50…D8;R0= D57D49…D7。

image

逆初始置换表IP-1

具体置换图示如下:

image乘积变换F:

它是DES算法的核心部分。将经过IP置换后的数据分成32 bit的左右两组,在迭代过程中彼此左右交换位置。每次迭代时只对右边的32 bit进行一系列的加密变换,在此轮迭代即将结束时,把左边的32 bit与右边得到的32 bit逐位模2相加,作为下一轮迭代时右边的段,并将原来右边未经变换的段直接送到左边的寄存器中作为下一轮迭代时左边的段。在每一轮迭代时,右边的段要经过选择扩展运算E、密钥加密运算、选择压缩运算S、置换运算P和左右混合运算。

image乘积变换框图

选择扩展运算E:

将输入的32 bit Ri-1扩展成48 bit的输出,令s表示E原输入数据比特的原下标,则E的输出是将原下标s0或1(mod 4)的各比特重复一次得到的,即对原第1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29,32各位都重复一次,实现数据扩展。将表中数据按行读出得到48 bit输出。

image选择压缩运算S:

将前面送来的48 bit数据自左至右分成8组,每组为6 bit。而后并行送入8个S一盒,每个S盒为一非线性代换网络,有4个输出。

imageS盒运算:

将前面送来的48比特数据从左至右分成8组,每组为6比特,然后并行送入8个S盒。8个S盒的工作原理都是一样,为一个非线性替换运算。每个S盒都是一个4行、16列的矩阵,每行都是0到15的数字,但每行的数字排列都不同。每个S盒有6位输入,4位输出,6位输入中的第1位和第6位数字组成的二进制数值决定置换矩阵的行数,其余4位数字所组成的二进制数值决定置换矩阵的列数,行数和列数交点的数字便是S盒的输出。

image

例:假设S1盒的输入110010, 因第1位和第6位数字组成的二进制数为10=(2)10,他对应S1行号为2的那一行,其余4位数字所组成的二进制数为1001=(9)10,对应S1列号为9的那一列,交点处的数是12,则S1的输出为1100。S盒的置换矩阵如上表所示。

置换运算P:

对S1至S8盒输出的32 bit数据进行坐标置换,置换P输出的32 bit数据与左边32 bit即Ri-1逐位模2相加,所得到的32 bit作为下一轮迭代用的右边的数字段。并将Ri-1并行送到左边的寄存器,作为下一轮迭代用的左边的数字段。

image子密钥的生产:

DES的乘积变换部分含有16轮非线性变换,每一轮变换都用一个48比特的子密钥,共需16个不同的48比特的子密钥。一个64比特的外部密钥经过密钥产生器产生48比特的16个子密钥。

image置换1的作用是将56比特密钥K’各位上的数按规定方式进行换位。置换后的56比特分别存到两个28比特的寄存器中。

图片1

C0的各位依次为原密钥中的57,49,41,…,36位,D0的各位依次为原密钥中的63,55,…,4位。

循环左移寄存器:

每个循环左移寄存器都有28比特,加密时,循环寄存器对 C i+1 、D i+1的内容是将循环寄存器对Ci、 Di的内容分别左移1至2位得到的。各级寄存器移位的比特数如表所示。

image压缩置换:

是从56位内容中选出48位,产生16轮加密的16子密钥。压缩置换表如表:

image压缩置换表中的数字表示循环寄存器对(Ci、Di)的比特序号,他的读取顺序是从左到右,从上到下,即Ci的第14,17,11,…位分别置换成 Ki的第1,2,3,…位。

理论讲完了下面上代码:

main.cpp

123456789101112131415#include "des.h" #include using namespace std; void main(){     char key[9] = {"program."};           //密钥     char mw[9] = {"12345678"};            //明文     cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3