实现DES 分组密码算法的加解密
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程:密码学班级:姓名:学号:
成绩:指导教师:实验日期:2011/5/25
实验密级:预习程度:实验时间:12:50-15:20 仪器组次:18 必修/选修:必修实验序号:4
实验名称:实现DES 分组密码算法的加解密
实验目的与要求:1、掌握DES 分组密码算法的软件实现方法;
2、复习DES 分组密码算法设计的基本原理;
3、能用DES 分组密码算法实现已知明文的加解密实验仪器:
一、实验要求
1、求主密钥的扩展密钥前,先输出使用的PC-1 置换和PC-2 置换;
2、对明/密文文件用DES 算法进行加/解密前,先输出确定使用的S 盒和有关置换表;
3、“确定主密钥的扩展密钥”和“对明/密文文件的加/解密”分别编写两个模块,如果时
间不够,可以任选一个模块;
4、确定扩展密钥前,先指出是加密密钥还是解密密钥;
5、密钥扩展的移位的位数可以先添表,但最后一轮移位完后,必须回到初始值c0d0。
6、主密钥长度与明文相一致,需要忽略校验位;
7、能完成任意给定的一个明/密文文件的加/解密;
8、加解密结果正确。
二、实验内容与步骤
下面是程序的部分代码
int main()
{
char MingWen[104];
char target[8];
char InputKey[8];
int text[64];
int text_ip[64];
int L0[32],Li[32];
int R0[32],Ri[32];
int RE0[48];
int key[64];
int keyPC1[56];
int A[28];
int B[28];
int keyAB[56];
int K[16][48];
int RK[48];
int RKS[8];
int SP[32];
int RKSP[32];
int text_end[64];
int text_out[14][64];
char init[9]={"HTmadeit"};
int CBC[64];
int result[13][64];
int H[208];
char MiWen[208];
int C[832];
int M[13][8];
char choice;
int t;
int i,j;
int k,l,m,n;
int r[8],c[8];
int flag=1;
printf("欢迎使用DES加密解密\n\n");
while(flag)
{printf("A加密,B解密,请选择:\n");
scanf("%c",&choice);
while(choice!='A'&&choice!='B'&&choice!='a'&&choice!='b')
{printf("对不起,您的输入不合法。请选择A或B,A表示加密,B表示解密。\n");
scanf("%c",&choice);
}
getchar();
printf("请输入8位密钥:\n");
gets(InputKey);
while(InputKey[7]=='\0'||InputKey[8]!='\0')
{
printf("您输入的密钥位数有误,请重新输入8位密钥:\n");
gets(InputKey);
}
for(i=0;i<8;i++)
{
int a[8]={0,0,0,0,0,0,0,0};
m=InputKey[i];
for(j=0;m!=0;j++)
{
a[j]=m%2;
m=m/2;
}
for(j=0;j<8;j++)
key[(i*8)+j]=a[7-j];
}
for(i=0;i<56;i++)
keyPC1[i]=key[PC1[i]-1];
for(i=0;i<28;i++) {
A[i]=keyPC1[i];
B[i]=keyPC1[i+28];
}
for(t=0;t<16;t++)
{
if(move[t]==1)
{
n=A[0];
for(i=0;i<27;i++)
A[i]=A[i+1];
A[27]=n;
n=B[0];
for(i=0;i<28;i++)
else
for(i=0;i<8;i++)
target[i]=MingWen[i+(8*l)];
for(i=0;i<8;i++)
{
int a[8]={0,0,0,0,0,0,0,0};
m=target[i];
for(j=0;m!=0;j++)
{a[j]=m%2;
m=m/2;
}
for(j=0;j<8;j++)
text[(i*8)+j]=a[7-j];
}
//for(i=0;i<64;i++)
//printf("%d,",text[i]);
//printf("\n");
//for(i=0;i<64;i++)
//printf("%d,",text_out[l][i]);
//printf("\n");
for(i=0;i<64;i++) //CBC模式下前一分组的密文异或当前分组
text[i]=text_out[l][i]^text[i];
//for(i=0;i<64;i++)
//printf("%d,",text[i]);
//printf("\n");
//对每个text进行DES加密
for(i=0;i<64;i++) //进行初始换位
text_ip[i]=text[IP[i]-1];
for(i=0;i<32;i++) //分成左右两部分,各32位
{