des密码学课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1 密钥产生模块
子密钥产生过程:用户将初始密钥64位输入到子密钥产生流程中,首先经过密钥置换A,将初始密钥的8个奇偶校验位去掉,留下真正的56位比特初始密钥。然后将56比特的初始密钥分为两个28比特的分组C0及D0。再将两个分组分别经过循环左移1或2位后,连接两个分组成56位,最后经过密钥置换B,进行压缩,抛弃8位后,便可输出16轮子密钥的48比特。其流程图如下:
解密过程:解密过程与加密过程完全类似,唯一不同的是子密钥的输入顺序是由子密钥产生器第16轮获得的子密钥作为解密程序第一轮的子密钥输入。
其具体实现流程图如下:
5.程序的实现
5.1开发环境和语言
开发环境:Windows 7 旗舰版
开发工具:Visual studio 2010
开发语言:VC++;
5.2 功能模块程序实现
{
out1[j3]=s44[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s55[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s66[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s77[j1];
2>对每个分组进行处理,首先进行初始置换IP
3>在初始置换IP后,明文组再被分成左右两部分Li和Ri,每部分32位。
4>右边32比特Ro进入F函数变换。F函数变化过程为首先将32位明文经过E扩展变成48比特后再与48位子密钥进行按位异或,然后将得到的48位进行s盒代替,输出32比特,最后将32比特进行p盒输出,最终得到F函数的输出。
}
}
m=n/8;
//tcresult[p*q]='\0';
}
for(int i=0;i<m;i++)
{
for(int j=0;j<64;j++)
{
fenzu[i][j]=tcresult[i*64+j];
5>经过F函数后,将右边得到的32比特与左边的32比特Li再次进行按位异或后最终得到Ri+1,交换左右32比特,即:Li+1=Ri,Ri+1=Li⊕F(Ri,Ki)
6>如上重复16轮(但最后一轮不进行左右分组交换),最终完成一个明文分组的加密过程。
其具体实现流程图如下:
其中的轮结构图为:
4.3解密模块
5.2.1密钥产生模块
(1)密钥由用户选定的任意八个字符组成。
获取用户输入密钥代码:
UpdateData(TRUE);
CstringAstrmiyao2;
strmiyao2=miyao2;
charsmsg1[1000];
strcpy_s(smsg1,strmiyao2);//将密钥保存到smsg1数组中
{
//out[i]=in[i];
out[i]=in[arr[i]-1];
}
}
(3)将得到的64比特分为左右各32比特,然后调用void des:: lunstruct(int a[32],int out[32],int n)进入轮结构,该函数是加密程序的核心部分,其实现代码如下:
void des:: lunstruct(int a[32],int out[32],int n)
28
25
22
19
15
答辩小组成员签名
答辩小组组长签名: 年 月 日
课程设计成绩评定表
成绩汇总
评分项目
评分
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
50%
1.
DES是由美国IBM公司于20世纪70年代中期的一个密码算法(LUCIFER算法)发展而来的,在1977年1月15日,美国国家标准局(NBS)正式公布实施,并得到了ISO的认可。在过去的近20多年的时间里,DES被广泛的应用于美国联邦和各种商业信息的安全保密工作中,经受住了各种密码分析和攻击,体现出了令人满意的安全性。DES算法的加密过程非常快,是目前使用的最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS,ATM,磁卡及智能卡,加油站等领域被广泛使用,以此来实现关键数据的保密。
{
tianchongzifu(in,tcresult);//字符填充
m=(8-n%8+n)/8;
}
else//当不需要字符填充时
{
for( p=0;p<n;p++)
{
zhifu[p]=(int)in[p];
shito2(zhifu[p],zifu1,8);
for( q=0;q<8;q++)
{
tcresult[p*8+q]=zifu1[q];
(2)产生子密钥,调用函数:voidmakekey(char in[8])
该函数的实现如下:
void des:: makekey(char in[8])
{
static int out[64];
int out1[56],left[28],right[28],hebin[56],zhihuan1[48];
总分
指导老师签名: 年 月 日
课程设计答辩记录及评价表
学生
讲述情况
教师主要
提问记录
学生回答
问题情况
答辩评分
评分项目
分值
评价参考标准
评分
总分



及格

选题意义
10
9
8
7
6
4
研究水平与设计能力
25
23
20
18
15
10
课程设计说明书(论文)撰写质量
25
23
20
18
15
10
设计创新
10
9
8
7
6
4
答辩效果
30
E_Find(han[4],lie[4],s44,s5);
E_Find(han[5],lie[5],s55,s6);
E_Find(han[6],lie[6],s66,s7);
E_Find(han[7],lie[7],s77,s8);
for(int j1=0;j1<4;j1++)
{
out1[j3]=s00[j1];
成都信息工程学院
课程设计报告
DES算法加密与解密的设计与实现
课程名称:密码算法程序设计
学生姓名:**
学生学号:**
专业班级:**
任课教师:**
2012年6月29日
指导老师评阅成绩表
学习与工作态度(30%)
选题意义(10%)
研究水平与设计能力(25%)
课程设计说明说(论文)撰写质量(25%)
设计创新(10%)
zifu_to_bit(out, in);//字符转换成二进制
zhihuan(out1,out,EP1,56);//去除奇偶校验位
for(int i=0;i<28;i++)
{
left[i]=out1[i];
}
for(int i=28;i<56;i++)
{
right[i-28]=out1[i];
}
for(int i=0;i<16;i++)
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s11[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s22[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
out1[j3]=s33[j1];
j3++;
}
for(int j1=0;j1<4;j1++)
{
int arr[48], out1[32],j3=0;
int arr1[48];
int arr2[8][6];
int arr3[8],han[8],lie[8];
int s00[4],s11[4],s22[4],s33[4],s44[4],s55[4],s66[4],s77[4];
zhihuan(arr,a,EC,48);//E盒置换
{
loopmove(left,move[i]);
loopmove(right,move[i]);
for(int j=0;j<28;j++)
{
hebin[j]=left[j];
}
for(int j1=0;j1<28;j1++)
{
hebin[28+j1]=right[j1];
}
zhihuan(zhihuan1,hebin,EP2,48);
2.
○字符加密:完成多个明文分组的加解密,明文和密钥是ASCII码,明文长度为任意长度,密钥长度为8个字符,输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;
○能输出6轮的密钥,并以二进制的形式输出
○文件加密:从一个文件读取加密明文,在程序中输出加密后的密文,并能将加密密文保存在明文文件的相同磁盘目录下。
}
(5)再将得到的结果左右32位交换,重复执行16轮。
最后将得到的64比特进行逆初始置换后转换成16进制输出。
最终的加密函数为:
void des::jiami(char *out,char *in)
{
char sixty[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
j3++;
}
zhihuan(out,out1,p,32);//p盒置换
}
(4)将得到的结果与明文的左32位异或
for(int j3=0;j3<32;j3++)
{
out2[j3]=out1[j3]^left[j3];//按位异或¨°
left[j3]=right[j3];
right[j3]=out2[j3];
han[i1]=arr2[i1][0]*2+arr2[i1][5]*1;
}
//E盒查找¨°
E_Find(han[0],lie[0],s00,s1);
E_Find(han[1],lie[1],s11,s2);
E_Find(han[2],lie[2],s22,s3);
E_Find(han[3],lie[3],s33,s4);
for(int i=0;i<48;i++)
{
arr1[i]=arr[i]^key[n][i];
}
for(int i1=0;i1<8;i1++)
{
for(int j=0;j<6;j++)
{
arr2[i1][j]=arr1[i1*6+j];
}
lie[i1]=arr2[i1][1]*8+arr2[i1][2]*4+arr2[i1][3]*2+arr2[i1][4]*1;
int arr[64],a[16],arr1[64];
int tcresult[10000],fenzu[100][64]={0};
int n=strlen(in),p,q;
int m,zhifu[10000],zifu1[8];
char result[1000][16];
if(n%8!=0)//当需要字符填充时
每轮循环左移位数如下表:
轮数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
移位数
1
1
2
2
2
2
2
2
1
2
2
2
2
2
2
1ቤተ መጻሕፍቲ ባይዱ
4.2加密模块
加密过程分为以下几步:
1>获取用户输入信息的内容,计算其字符长度。如果字符长度为8个字符的整数倍,则直接分组,每组8个字符,否则按相应的字符填充方法进行字符填充,使字符长度刚好为8个字符的整数倍。再将每个分组按相应ASCII值转化成64位二进制。
for(int j2=0;j2<48;j2++)
{
key[i][j2]=zhihuan1[j2];
}
}
}
5.2.2加密模块
(1)首先获取要加密的明文,密钥,通过子密钥产生模块生成16轮子密钥,首先判断输入的明文是不是8个字符的整数倍,如果不是,则进行字符填充,填充方法为:用0x00填充,最后一个字节用填充字节的个数作为填充值填充!填充字符的实现调用函数:voidtianchongzifu(char *in,int *out)。再将得到的二进制明文进行分组,每64位一组进行加密。
3.
3.1功能需求
该程序是一个加密程序,因此程序采用des加密算法,需要完成对字符和.txt文件的加密,同时还能观察在加密过程中字密钥的产生状态。模块划分合理,用类对函数进行封装。
3.2性能需求
为了方便用户的使用,具有良好的操作界面是有必要的。因此本软件应采用操作性和美观较强的对话框的界面。
4.
本软件由三个主要模块构成:密钥产生模块,加密模块,解密模块。
DES算法是一种采用传统的代替和置换作加密的分组密码,明文以64比特为分组,密钥长度为64比特,有效长度为56比特,其中加密密钥有8比特是奇偶校验,DES算法的加密和解密密钥使用的是同一算法,它的安全性完全依赖于所有的密钥。由于DES算法运算速度快,密钥产生容易,适合于当前大多数计算机上使用软件方法的实现,同时也适用于在专用芯片上的实现。因此设计和实现一个适用简单的des加密软件是有必要和有意义的。
(2)将得到的64比特块初始IP置换,调用函数:zhihuan(int *out,int *in,int *arr,int length)
//各个置换的转换。
void des::zhihuan(int *out,int *in,int *arr,int length)
{
for(int i=0;i<length;i++)
相关文档
最新文档