des课程设计

更新时间:2024-01-26 03:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DES加解密算法的实现

一、DES算法的概述

DES(Data Encryption Standard)是由美国IBM公司于20世纪70年代中期的一个密码算(LUCIFER)发展而来,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可,在过去的20多年时间里,DES被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前DES算法已经被更为安全的Rijndael算法取代,但是DES加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对DES的研究还有很大价值,在国内DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN码加密传输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

DES算法是一种采用传统的代替和置换操作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效密钥长度是56比特,其中加密密钥有8比特是奇偶校验,DES的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每64比特的二进制的数据块,用56比特有效密钥对64比特二进制数据块进行加密,每次加密可对64比特的明文输入进行16轮的替换和移位后,输出完全不同的64比特密文数据。由于DES算法仅使用最大为64比特的标准算法和逻辑运算,运算速度快,密

钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。 二、DES算法描述

DES算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为64比特的块。图2-1是DES加密算法的加密流程。图2-2是密钥扩展处理过程。

图2-1

图2-2

三、DES算法的实现

DES算法的加密与解密过程互逆,我们以加密算法为例,一步一步实现加密。

1、子密钥的产生

由于子密钥产生与DES加密过程相互独立,所以我们先实现子密钥函数。64比特的密钥生成16个48比特的子密钥。其生成过程如图1-2.

a. 首先我们这里64比特密码用的是16位十六进制的数转换为64比特。

b. 然后经过置换选择1.如图3-1

图3-1

用函数的实现方法是,首先将PC-1表存起来,然后循环每次对照表,依次取出密钥数组对应的比特。

c .接下来我们要将得到的56比特,前28位赋值给C[28];后28位赋值给D[28]。

d .接下来左右部分分别按照LS[1],循环左移,第一位移动到第28位。每一轮移动的位数都是在上一轮移动结束的基础上再移动LS[n]位(n<17),所以第n轮移动的位数实际上为LS数组前n项的和(为方便,LS[1]代表第一轮,LS[0]=0)。

LS数组如下图3-2:

图3-2

e .将移动结束后的C[28],D[28]结合为K[56],按照IP2表如图3-3进行置换输出。

scanf(\ for(i=0;i<16;n++,i++) { if(M[i]<60) s=M[i]-48; else if(M[i]<90) s=M[i]-55; else s=M[i]-87; change(s,num); if(4*(n+1)%8==0) h=4*(n+1)/8-1; else

h=4*(n+1)/8; if((n+1)%2==0) l=4; else l=0;

for(j=0;j<4;j++) mw[h][l++]=num[j]; }

}

//ipbiao函数将自动生成64位的ip置换表上下差2,左右差8 void ipbiao(int ip [8][8]) {

long i,j,k; for(j=0;j<4;j++) {

i=2+j*2; for(k=7;k>=0;k--)

{

ip[j][k]=i;

i+=8; }

}

for(j=4;j<8;j++) {

i=1+(j-4)*2; for(k=7;k>=0;k--)

{

ip[j][k]=i;

i+=8; }

}

}

//初始置换函数 将64bit 按ip表重新排列 void InitRep (int mw [8][8],int tem[8][8]) {

int i,j,h,l,a; int ip[8][8];

ipbiao(ip); //产生ip表函数 for(i=0;i<8;i++) for(j=0;j<8;j++) {

a=ip[i][j]; if(a%8==0) { h=a/8-1; l=7; } else { h=a/8; l=a%8-1; }

}

tem[i][j]=mw[h][l]; }

//划分函数,将64位bit 分为两个32位 void BreakLR (int tem [8][8] ,int L [32] ,int R [32]) { int h,l,i; i=0;

for (h=0;h<4;h++) for(l=0;l<8;l++) L[i++]=tem[h][l]; i=0;

for (h=4;h<8;h++) for(l=0;l<8;l++) R[i++]=tem[h][l]; } 3、轮加密

DES算法的论结构分为左右两部分32比特在每一轮中被独立处理。如图具体过程为:下一轮左半部分32比特等于上一轮右半部分32比特;而下一轮右半部分的32比特的计算则是由上一轮右半部分和轮密钥输入到F函数中进行变换,变换结果与上一轮左半部分进行异或运算,得到。因此每一轮的变换可由公式表示:

L(i)==R(i-1);

R(i)=L(i-1)⊕F(R(i-1),K(i));

图3-5

a.扩张变换E

将右半部分的32比特,进行E盒扩展,扩展成为48比特。具体变换过程为把输入的32比特E盒扩展之后输出E[8][6]。E[8][6]中每一位与R[32]中的对应关系如图3—6

图3-6 代码:

//扩展函数将32位变为48位 首先按R[32]一条龙对E[8][6]赋值,然后再处理多出来的16位

void Extension (int r[32],int E[8][6]) {

int i,h,l; i=0;

while(i<32)

for(h=0;h<8;h++) for(l=1;l<5;l++) E[h][l]=r[i++];

E[0][0]=r[31]; E[0][5]=r[4]; i=9;

for(h=1;h<7;h++) {

E[h][0]=r[4*h-1]; E[h][5]=r[i-1]; i=i+4; }

E[7][0]=r[27]; E[7][5]=r[0]; }

b 异或函数

相同为假,相同为真,将E盒的输出与子密钥进行异或得到的48比特作为S盒的输入。

代码:

//异或函数 r[48]为结果

void XorFun (int E[8][6],int k [48],int r [48]) {

int h,l,a; a=0;

for(h=0;h<8;h++) for(l=0;l<6;l++) {

}

if(E[h][l]!=k[a]) r[a++]=1; else r[a++]=0; }

c .S函数

进入S盒变换,48比特压缩为32比特如图3-7。S盒的安全性能是保证DES算法安全性的源泉,DES算法共有8个不同的S盒,每个S盒接受6位输入,输出4位。8个S盒如图3-8:

图3-7

图3-8

任取一S盒,现在分析S盒的变换过程见图3-9:

图3-9

在其输入

b1,b2,b3,b4,b5,b6

中,计算出

x=b1*2+b6,

y=b5+b4*2+b3*4+b2*8,再从S[i]表中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。函数实现中将48位K [48]转换

为SI[8][6]二维数组,一次处理6比特。将8个S盒存成S[8][64]二维数组,则第i个S盒中的X行Y列转化为S[i-1][X*16+Y-1]; 代码:

// F函数中的S函数

void FeiSFun(int k[48],int p [32]) {

int i,ni,pi,h,l,sh,sl,out; int num [4]; int si[8][6]; int

s[8][64]={ {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,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13},{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9 },{ 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12},{ 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14},{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3},{12,1,10,15,9,2,6,

8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13},{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12},{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}} ; pi=0; i=0;

for(h=0;h<8;h++) //将将48位K [48]转换为SI[8][6]二维数组 for(l=0;l<6;l++) si[h][l]=k[i++];

for(h=0;h<8;h++) //8个S盒变换 {

sh=2*si[h][0]+si[h][5];

sl=8*si[h][1]+4*si[h][2]+2*si[h][3]+si[h][4]; out=s[h][sh*16+sl]; change(out,num); for(ni=0;ni<4;ni++) p[pi++]=num[ni]; }}

d.P盒置换

S盒输出的32比特经过P盒置换,重新编排32比特的位置。下

图3-10为P盒置换过程。

图3-10

e.将扩张变换E和异或运算S函数P置换整合为F函数 F 函数输入为R[32]、 K[48] 输出为PO[32] //F 函数

void Feistel (int r [32],int k [48],int po [32]) {

int Ex[8][6]; int pi[32]; int re [48]; Extension (r,Ex); XorFun(Ex,k,re); FeiSFun(re,pi); FSPFun(pi,po);

}

f. 循环加密

前15轮加密过程相同为 L(i)==R(i-1);

R(i)=L(i-1)⊕F(R(i-1),K(i));(i=0.、1、2、3……15) 第16轮为

L(16)=L(15)⊕F(R(15),K(16)) R(16)=R(15); 代码:

for(d=1;d<16;d++) {

KeyProd( ms,d,key); //密钥产生函数 Feistel(R,key,rr); //F函数

LPXorFun(rr,L,R1); //异或函数 ArrayCopy (L,R); //数组复制函数 ArrayCopy (R,R1);

}

KeyProd( ms,16,key); /

Feistel(R,key,rr);

LPXorFun(rr,L,R1);

ArrayCopy (L,R1);

g.逆初始置换

DES算法进行完16轮运算之后,需要进行逆初始置换,逆初始置换正好为初始置换的逆,如一个矩阵进行初始置换之后输出,在进行依次逆初始置换的输出结果为初始矩阵。变换规则如下图3-11

代码:

//逆初始置换函数

Void IPRevFun (int L [32],int R [32],int re[64]) { int i,j; int tem [64];

int ip11 [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 };

j=0;

for(i=0;i<32;i++) tem[j++]=L[i]; for(i=0;i<32;i++) tem[j++]=R[i]; for(i=0;i<64;i++) re[i]=tem[ip11[i]-1]; }

四、结果测试 加密测试结果如图:

解密测试结果如图:

本文来源:https://www.bwwdw.com/article/ilzw.html

Top