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]; }
四、结果测试 加密测试结果如图:
解密测试结果如图:
正在阅读:
des课程设计01-26
芦荟的启示作文600字07-12
环境规划与管理期末考试重点(含题目和答案)重点修改版12-04
官亭童大井施工组织设计 - 图文06-15
03立题目的与依据07-18
终极解密五公经里的末劫时间点,不要再怀疑五公的慈悲与慧观801-25
千百度 二零一四中期报告05-16
VB实验报告(2500字)04-23
《电网运行准则》介绍-08041808-13
小班学习内容09-15
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 课程
- 设计
- des
- 大学生中英文联合演讲比赛策划
- 四年级语文(上册)专项练习题(阅读王)
- 交通运输企业成本费用管理核算办法
- 河南公务员职业道德教育培训网络考试题库
- 《银行业金融机构董事(理事)和高级管理人员任职资格管理办法》
- 小学语文《江雪》教案与评析
- 跨专业实训报告
- 药物合成考试题及答案
- 新生儿专科考试题(最新)
- 总复习-习题集
- 基于51单片机的无线遥控小车
- 《小王子》问答题
- 新版三年级上 - 单位换算 - 时间 - 长度 - 质量 - 练习
- 江苏省无锡市羊尖中学2016届九年级上学期9月月考化学试题(无答案)
- 大学计算机组成原理期末考试试卷 附答案!(最新)
- 三只松鼠产品营销调研分析报告 - 图文
- 0Wxzew2011届高三数学押题卷3doc
- 新疆神新发展有限责任公司顺通煤矿综采招标答疑文件(三)
- 脚手架的倾覆与稳定计算
- 人教版(PEP)小学英语五年级下册教案 - 第二单元