实现DES 分组密码算法的加解密

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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位

{

相关文档
最新文档