DES实验报告
DES加密算法的简单实现实验报告

DES加密算法的简单实现实验报告一、实验目的本实验的主要目的是对DES加密算法进行简单的实现,并通过实际运行案例来验证算法的正确性和可靠性。
通过该实验可以让学生进一步了解DES算法的工作原理和加密过程,并培养学生对算法实现和数据处理的能力。
二、实验原理DES(Data Encryption Standard,数据加密标准)是一种对称密钥加密算法,它是美国联邦政府采用的一种加密标准。
DES算法使用了一个共享的对称密钥(也称为密钥),用于加密和解密数据。
它采用了分组密码的方式,在进行加密和解密操作时,需要将数据分成固定长度的数据块,并使用密钥对数据进行加密和解密。
DES算法主要由四个步骤组成:初始置换(Initial Permutation),轮函数(Round Function),轮置换(Round Permutation)和最终置换(Final Permutation)。
其中初始置换和最终置换是固定的置换过程,用于改变数据的顺序和排列方式。
轮函数是DES算法的核心部分,它使用了密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
通过多轮的迭代运算,DES算法可以通过一个给定的密钥对数据进行高强度的加密和解密操作。
三、实验步骤2.初始置换:将输入数据按照一定的规则重新排列,生成一个新的数据块。
初始置换的规则通过查表的方式给出,我们可以根据规则生成初始置换的代码。
3.轮函数:轮函数是DES算法的核心部分,它使用轮密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
在实际的算法设计和实现中,可以使用混合逻辑电路等方式来实现轮函数。
4.轮置换:轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
轮置换的规则也可以通过查表的方式给出。
5.最终置换:最终置换与初始置换类似,将最后一轮的结果重新排列,生成最终的加密结果。
des算法实验报告

des算法实验报告DES算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司于1975年研发并被美国国家标准局(NBS)采纳为联邦信息处理标准(FIPS)。
二、算法原理DES算法采用了分组密码的方式,将明文数据划分为固定长度的数据块(64位),并通过密钥进行加密和解密操作。
其核心是Feistel结构,每轮加密操作包括置换和替代两个步骤。
1. 置换步骤DES算法的初始置换(IP)和逆初始置换(IP-1)通过一系列的位重排操作,将输入的64位明文数据打乱,以增加加密的强度。
2. 替代步骤DES算法中使用了8个S盒(Substitution Box),每个S盒接受6位输入,并输出4位结果。
S盒的作用是将输入的6位数据映射为4位输出,通过这种非线性的映射关系,增加了算法的安全性。
3. 轮函数DES算法的加密过程包含16轮迭代,每轮迭代中都会对数据进行一系列的位重排和替代操作。
其中,轮函数是DES算法的核心部分,它通过使用子密钥对数据进行异或操作,并通过S盒替代和P盒置换操作,产生新的数据块。
三、实验步骤为了更好地理解DES算法的加密过程,我们进行了以下实验步骤:1. 输入明文和密钥我们选择了一个64位的明文数据块和一个56位的密钥作为输入。
明文数据块经过初始置换(IP)后,得到L0和R0两个32位的数据块。
2. 生成子密钥通过对密钥进行置换和循环左移操作,生成16个48位的子密钥。
3. 迭代加密对明文数据块进行16轮的迭代加密,每轮加密包括以下步骤:a. 将R(i-1)作为输入,经过扩展置换(E-box),得到48位的扩展数据。
b. 将扩展数据和子密钥Ki进行异或操作,得到48位的异或结果。
c. 将异或结果分为8个6位的数据块,分别经过8个S盒替代操作,得到32位的S盒替代结果。
d. 将S盒替代结果经过P盒置换,得到32位的轮函数输出。
实验5 DES密码算法

实验5 DES密码算法一、实验目的通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。
二、实验原理DES算法属于分组加密算法,即在明文加密和密文解密过程中,信息都是按照固定长度分组后进行处理的。
混淆和扩散是它采用的两个最重要的安全特性。
混淆是指通过密码算法使明文和密文以及密钥的关系非常复杂,无法从数学上描述或者统计。
扩散是指明文和密钥中的每一位信息的变动,都会影响到密文中许多位信息的变动,从而隐藏统计上的特性,增加密码的安全。
DES算法将明文分成64位大小的众多数据块,即分组长度为64位。
同时用56位密钥对64位明文信息加密,最终形成64位的密文。
需要注意的地方是掌握DES算法的16轮加、解密流程以及子密钥的产生流程。
三、实验环境运行Windows或者Linux操作系统的PC机,具有TC、VC++(Windows)等C语言编译环境。
四、实验内容1、算法分析(1)写出DES算法的16轮加、解密流程;(2)写出子密钥的产生流程;2、下载DES算法的实现程序,并调用其程序对一个文件进行加密和解密,提交程序代码和执行结果。
3、调用下载的DES算法的实现程序对输入的十六进制数加密,比较输入和输出,当改变一个位时比较输出的变化,并说明原因。
五、实验步骤1、算法分析(1)解密过程为加密过程的逆过程:(2)2、打开VC++,编写程序如下:#include "stdio.h"#include "memory.h" //#include "time.h"#include "stdlib.h"#define PLAIN_FILE_OPEN_ERROR -1#define KEY_FILE_OPEN_ERROR -2#define CIPHER_FILE_OPEN_ERROR -3#define OK 1typedef char ElemType;//初始置换表IPint IP_Table[64] = { 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6}; //逆初始置换表IP^-1int IP_1_Table[64] = {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,32,0,40,8,48,16,56,24};//扩充置换表E 32--->48int E_Table[48] = {31, 0, 1, 2, 3, 4,3, 4, 5, 6, 7, 8,7, 8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31, 0};//置换函数Pint P_Table[32] = {15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24};//S盒int S[8][4][16] =//S1{{{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}},//S2{{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}},//S3{{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}},//S4{{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}},//S5{{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}},//S6{{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}},//S7{{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}},//S8{{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}}}; //置换选择1int PC_1[56] = {56,48,40,32,24,16,8,0,57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,60,52,44,36,28,20,12,4,27,19,11,3};//置换选择2int PC_2[48] = {13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,46,43,48,38,55,33,52,45,41,49,35,28,31};//对左移次数的规定int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};int ByteToBit(ElemType ch,ElemType bit[8]);int BitToByte(ElemType bit[8],ElemType *ch);int Char8ToBit64(ElemType ch[8],ElemType bit[64]);int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);int DES_ROL(ElemType data[56], int time);int DES_IP_Transform(ElemType data[64]);int DES_IP_1_Transform(ElemType data[64]);int DES_E_Transform(ElemType data[48]);int DES_P_Transform(ElemType data[32]);int DES_SBOX(ElemType data[48]);int DES_XOR(ElemType R[48], ElemType L[48],int count); //异或操作int DES_Swap(ElemType left[32],ElemType right[32]); //交换L分组与R分组交换.int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);//字节转换成二进制int ByteToBit(ElemType ch, ElemType bit[8]){int cnt;for(cnt = 0;cnt < 8; cnt++){*(bit+cnt) = (ch>>cnt)&1; //右移cnt位,与1相与.将字节装入8位二进制数组中.倒序装入} //7=,bit={}//printf("%s",bit);return 0;}//二进制转换成字节int BitToByte(ElemType bit[8],ElemType *ch){int cnt;for(cnt = 0;cnt < 8; cnt++){*ch |= *(bit + cnt)<<cnt; // 为*(1)+*(10)+*(100)+0000+00000+...=7 }return 0;}//将长度为8的字符串转为二进制位串int Char8ToBit64(ElemType ch[8],ElemType bit[64]){int cnt;for(cnt = 0; cnt < 8; cnt++){ByteToBit(*(ch+cnt),bit+(cnt<<3)); //cnt<<3即为cnt*8}return 0;}//将二进制位串转为长度为8的字符串int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){int cnt;memset(ch,0,8); //以ch为起点的8位空间数组置0.for(cnt = 0; cnt < 8; cnt++){BitToByte(bit+(cnt<<3),ch+cnt);return 0;}//IP置换int DES_IP_Transform(ElemType data[64]){int cnt;ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_Table[cnt]];}memcpy(data,temp,64); //由temp所指内存区域复制64个字节到data所指内存区域,与strcpy 同.return 0;}//IP逆置换int DES_IP_1_Transform(ElemType data[64]){int cnt;ElemType temp[64];for(cnt = 0; cnt < 64; cnt++){temp[cnt] = data[IP_1_Table[cnt]];}memcpy(data,temp,64); //由temp所指内存区域复制64个字节到data所指内存区域,与strcpy同return 0;}//密钥置换1 pc-1int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){int cnt;for(cnt = 0; cnt < 56; cnt++){tempbts[cnt] = key[PC_1[cnt]];return 0;}//密钥置换2 pc-2int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){int cnt;for(cnt = 0; cnt < 48; cnt++){tempbts[cnt] = key[PC_2[cnt]];}return 0;}//E扩展置换int DES_E_Transform(ElemType data[48]){ //这里data两种用处,故为48位极人臣int cnt;ElemType temp[48];for(cnt = 0; cnt < 48; cnt++){temp[cnt] = data[E_Table[cnt]]; //这里data下标最高为32.}memcpy(data,temp,48);return 0;}//P置换int DES_P_Transform(ElemType data[32]){int cnt;ElemType temp[32];for(cnt = 0; cnt < 32; cnt++){temp[cnt] = data[P_Table[cnt]];}memcpy(data,temp,32);return 0;}//循环左移//左右两边同时循环左移相同的位数.//10010循环左移1位为00101,左移2位为01010int DES_ROL(ElemType data[56], int times){ElemType temp[56]; //temp只保存将要循环到右边的位.//保存将要循环移动到右边的位memcpy(temp,data,times); //保存前28位的移位memcpy(temp+times,data+28,times); //保存后28位的移位极人臣//前28位移动memcpy(data,data+times,28-times); //一般移位memcpy(data+28-times,temp,times); //循环位移动//后28位移动memcpy(data+28,data+28+times,28-times);memcpy(data+56-times,temp+times,times);return 0;}//生成子密钥int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){ ElemType temp[56];int cnt;DES_PC1_Transform(key,temp);//PC1置换for(cnt = 0; cnt < 16; cnt++){//16轮跌代,产生16个子密钥DES_ROL(temp,MOVE_TIMES[cnt]);//Ci Di 左右两边,循环左移DES_PC2_Transform(temp,subKeys[cnt]);//PC2置换,产生子密钥}}//异或int DES_XOR(ElemType R[48], ElemType L[48] ,int count){int cnt;for(cnt = 0; cnt < count; cnt++){R[cnt] ^= L[cnt]; //异或即为模2加法}return 0;}//S盒置换48=8*6 32=8*4int DES_SBOX(ElemType data[48]){int cnt;int line,row,output;int cur1,cur2;for(cnt = 0; cnt < 8; cnt++){cur1 = cnt*6;cur2 = cnt<<2;//计算在S盒中的行与列b1b2b3b4b5b6 b1b2 //b3b4b5b6line = (data[cur1]<<1) + data[cur1+5];row = (data[cur1+1]<<3) + (data[cur1+2]<<2)+ (data[cur1+3]<<1) + data[cur1+4];output = S[cnt][line][row];//化为2进制data[cur2] = (output&0X08)>>3; //取得output二进制倒数第4位为0还是1data[cur2+1] = (output&0X04)>>2; //output=7=0111 oxo4=0100data[cur2+2] = (output&0X02)>>1; //相&得到0100 右移2位得到1data[cur2+3] = output&0x01;}}//交换L分组与R分组交换.int DES_Swap(ElemType left[32], ElemType right[32]){ElemType temp[32];memcpy(temp,left,32);memcpy(left,right,32);memcpy(right,temp,32);return 0;}//加密单个分组int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){ElemType plainBits[64]; //明文比特ElemType copyRight[48]; //int cnt;Char8ToBit64(plainBlock,plainBits);//初始置换(IP置换)DES_IP_Transform(plainBits);//16轮迭代for(cnt = 0; cnt < 16; cnt++){//将右半部分拷贝到数组中.memcpy(copyRight,plainBits+32,32);//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(plainBits,copyRight,32);if(cnt != 15){//最终完成左右部的交换DES_Swap(plainBits,plainBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(plainBits);Bit64ToChar8(plainBits,cipherBlock);return 0;}//解密单个分组int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){ElemType cipherBits[64];ElemType copyRight[48];int cnt;Char8ToBit64(cipherBlock,cipherBits);//初始置换(IP置换)DES_IP_Transform(cipherBits);//16轮迭代for(cnt = 15; cnt >= 0; cnt--){memcpy(copyRight,cipherBits+32,32); //这里为什么还是右半部分?//将右半部分进行扩展置换,从32位扩展到48位DES_E_Transform(copyRight);//将右半部分与子密钥进行异或操作DES_XOR(copyRight,subKeys[cnt],48);//异或结果进入S盒,输出32位结果DES_SBOX(copyRight);//P置换DES_P_Transform(copyRight);//将明文左半部分与右半部分进行异或DES_XOR(cipherBits,copyRight,32);if(cnt != 0){//最终完成左右部的交换DES_Swap(cipherBits,cipherBits+32);}}//逆初始置换(IP^1置换)DES_IP_1_Transform(cipherBits);Bit64ToChar8(cipherBits,plainBlock);return 0;}//加密文件int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){ FILE *plain,*cipher;int count;ElemType plainBlock[8],cipherBlock[8],keyBlock[8];ElemType bKey[64];ElemType subKeys[16][48];if((plain = fopen(plainFile,"rb")) == NULL){return PLAIN_FILE_OPEN_ERROR;}if((cipher = fopen(cipherFile,"wb")) == NULL){return CIPHER_FILE_OPEN_ERROR;}//设置密钥memcpy(keyBlock,keyStr,8);//将密钥转换为二进制流//printf("%s\n",keyBlock);//int i;//for(i=0;i<8;i++){// printf(" %s \n",keyBlock[i]);//}Char8ToBit64(keyBlock,bKey);//生成子密钥DES_MakeSubKeys(bKey,subKeys);while(!feof(plain)){//每次读8个字节,即一个分组读八次.并返回成功读取的字节数if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){DES_EncryptBlock(plainBlock,subKeys,cipherBlock);fwrite(cipherBlock,sizeof(char),8,cipher);}}if(count){memset(plainBlock + count,'\0',7 - count);plainBlock[7] = 8 - count;DES_EncryptBlock(plainBlock,subKeys,cipherBlock);fwrite(cipherBlock,sizeof(char),8,cipher);}fclose(plain);fclose(cipher);return OK;}//解密文件int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){ FILE *plain, *cipher;int count,times = 0;long fileLen;ElemType plainBlock[8],cipherBlock[8],keyBlock[8];ElemType bKey[64];ElemType subKeys[16][48];if((cipher = fopen(cipherFile,"rb")) == NULL){return CIPHER_FILE_OPEN_ERROR;}if((plain = fopen(plainFile,"wb")) == NULL){return PLAIN_FILE_OPEN_ERROR;}//设置密钥memcpy(keyBlock,keyStr,8);//将密钥转换为二进制流Char8ToBit64(keyBlock,bKey);//生成子密钥DES_MakeSubKeys(bKey,subKeys);//取文件长度fseek(cipher,0,SEEK_END); //将文件指针置尾,距SEEK_END 0的位置, fileLen = ftell(cipher); //取文件指针当前位置,相对于文件头,即可取文件长度. rewind(cipher); //将文件指针重指向文件头while(1){fread(cipherBlock,sizeof(char),8,cipher);DES_DecryptBlock(cipherBlock,subKeys,plainBlock);times += 8;if(times < fileLen){fwrite(plainBlock,sizeof(char),8,plain);}else{break;}}if(plainBlock[7] < 8){for(count = 8 - plainBlock[7]; count < 7; count++){if(plainBlock[count] != '\0'){break;}}}if(count == 7){//有填充fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);}else{//无填充fwrite(plainBlock,sizeof(char),8,plain);}fclose(plain);fclose(cipher);return OK;}int main(){clock_t a,b; // 时间类型变量a = clock(); //时间函数DES_Encrypt("plaint.txt","","cipher.txt");b = clock();printf("加密消耗%d毫秒\n",b-a);system("pause"); //暂停一下a = clock();DES_Decrypt("cipher.txt","","result.txt");b = clock();printf("解密消耗%d毫秒\n",b-a);getchar();return 0;}明文文件为:plaint.txt,密钥:key.txt,密文文件为:cipher.txt,解密得到明文为:result.txt 运行结果如下:3、输入明文,调试程序,运行结果如下:改变一个位时结果如下:从实验结果可以看出,明文就算是相差一个位,但是他们的密文完全没有规律可循,这就保证了数据加密的可靠性,至于这样的原因,DES 是由于采用了Feistel 结构,在加密过程中经过多轮重复操作,但每一轮的子密钥不同,这样就使得即使原来很相近的两个数据串经过N 轮后,这个数据串被分得很散,也就很不一样了.。
密码学案例实验报告书

一、实验背景随着信息技术的飞速发展,信息安全问题日益突出。
密码学作为保障信息安全的核心技术,在数据加密、身份认证、数字签名等领域发挥着重要作用。
为了加深对密码学原理的理解,提高实际应用能力,我们开展了本次密码学案例实验。
二、实验目的1. 掌握DES加密算法的基本原理和操作步骤。
2. 熟悉RSA加密算法的原理和应用。
3. 学习数字签名技术的应用。
4. 培养动手实践能力,提高解决实际问题的能力。
三、实验内容1. DES加密算法(1)实验目的:了解DES加密算法的基本原理,掌握DES加密和解密过程。
(2)实验内容:① 设计一个简单的DES加密程序,实现明文到密文的转换。
② 设计一个简单的DES解密程序,实现密文到明文的转换。
(3)实验步骤:① 编写DES加密程序,输入明文和密钥,输出密文。
② 编写DES解密程序,输入密文和密钥,输出明文。
2. RSA加密算法(1)实验目的:了解RSA加密算法的基本原理,掌握RSA加密和解密过程。
(2)实验内容:① 设计一个简单的RSA加密程序,实现明文到密文的转换。
② 设计一个简单的RSA解密程序,实现密文到明文的转换。
(3)实验步骤:① 编写RSA加密程序,输入明文和密钥对,输出密文。
② 编写RSA解密程序,输入密文和私钥,输出明文。
3. 数字签名技术(1)实验目的:了解数字签名技术的基本原理,掌握数字签名的生成和验证过程。
(2)实验内容:① 设计一个简单的数字签名程序,实现签名生成和验证。
(3)实验步骤:① 编写数字签名程序,输入明文、私钥和签名算法,输出签名。
② 编写数字签名验证程序,输入明文、公钥和签名,验证签名是否正确。
四、实验结果与分析1. DES加密算法实验结果通过编写DES加密和解密程序,成功实现了明文到密文和密文到明文的转换。
实验结果表明,DES加密算法在保证数据安全的同时,具有较高的效率。
2. RSA加密算法实验结果通过编写RSA加密和解密程序,成功实现了明文到密文和密文到明文的转换。
DES算法的原理与实现

实验项目与实验报告( 2 )学科:信息与网络安全 学号: 姓名: 时间: 月 日实验名称:DES算法的原理与实现实验目的:1.熟悉DES算法的实现程序和具体应用,加深对DES算法的了解。
实验内容:(写出实验内容要点或相关理论准备、实验估计)一、DES算法的简介DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国BM公司研制的对称密码体制加密算法。
明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位代替或交换的方法形成密文组的加密方法。
1、基本原理其入口参数有三个:key、data、mode。
Key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。
当模式为加密模式时,明文按照64为进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。
实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
2、DES特点DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。
而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。
然而,这并不等于说DES是不可破解的。
而实际上,随着硬件技术和Intemet的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。
为了克服DES密钥空间小的缺陷,人们又提出了三重DES的变形方式。
3、主要流程DES算法把64为的明文输入块变为64位的密文输入块,它所使用的密钥也是64位,整个算法的主要流程图如下:(1)置换规则表其功能是把输入的数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。
des 加密算法实验报告

des 加密算法实验报告DES加密算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称加密算法,由IBM公司于1975年研发并被美国联邦政府采用为标准加密算法。
DES算法具有高效、可靠、安全等特点,被广泛应用于信息安全领域。
本实验旨在通过对DES算法的实验研究,深入了解其原理、性能和应用。
二、DES算法原理DES算法采用对称密钥加密,即加密和解密使用相同的密钥。
其核心是Feistel结构,将明文分成左右两部分,经过16轮迭代加密后得到密文。
每一轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和密钥进行变换。
DES算法中使用了置换、代换和异或等运算,以保证加密的安全性。
三、DES算法实验过程1. 密钥生成在DES算法中,密钥长度为64位,但实际上只有56位用于加密,8位用于奇偶校验。
实验中,我们随机生成一个64位的二进制密钥,并通过奇偶校验生成最终的56位密钥。
2. 初始置换明文经过初始置换IP,将明文的每一位按照特定规则重新排列,得到初始置换后的明文。
3. 迭代加密经过初始置换后的明文分为左右两部分,每轮加密中,右半部分作为下一轮的左半部分,而左半部分则通过函数f和子密钥进行变换。
函数f包括扩展置换、S盒代换、P盒置换和异或运算等步骤,最后与右半部分进行异或运算得到新的右半部分。
4. 逆初始置换经过16轮迭代加密后,得到的密文再经过逆初始置换,将密文的每一位按照特定规则重新排列,得到最终的加密结果。
四、DES算法性能评估1. 安全性DES算法的密钥长度较短,易受到暴力破解等攻击手段的威胁。
为了提高安全性,可以采用Triple-DES等加强版算法。
2. 效率DES算法的加密速度较快,适用于对大量数据进行加密。
但随着计算机计算能力的提高,DES算法的加密强度逐渐降低,需要采用更加安全的加密算法。
3. 应用领域DES算法在金融、电子商务、网络通信等领域得到广泛应用。
des算法 实验报告
des算法实验报告DES算法实验报告引言:数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司在20世纪70年代初开发。
DES算法通过将明文分块加密,使用相同的密钥进行加密和解密操作,以保护数据的机密性和完整性。
本实验旨在深入了解DES算法的原理和应用,并通过实验验证其加密和解密的过程。
一、DES算法原理DES算法采用分组密码的方式,将明文分为64位的数据块,并使用56位的密钥进行加密。
其加密过程主要包括初始置换、16轮迭代和逆初始置换三个步骤。
1. 初始置换(Initial Permutation,IP):初始置换通过将明文按照特定的置换表进行重排,得到一个新的数据块。
这一步骤主要是为了增加密文的随机性和混淆性。
2. 16轮迭代(16 Rounds):DES算法通过16轮迭代的运算,对数据块进行加密操作。
每一轮迭代都包括四个步骤:扩展置换(Expansion Permutation,EP)、密钥混合(Key Mixing)、S盒替换(Substitution Boxes,S-Boxes)和P盒置换(Permutation,P)。
其中,S盒替换是DES算法的核心步骤,通过将输入的6位数据映射为4位输出,增加了加密的复杂性。
3. 逆初始置换(Inverse Initial Permutation,IP-1):逆初始置换是初始置换的逆运算,将经过16轮迭代加密的数据块按照逆置换表进行重排,得到最终的密文。
二、实验步骤本实验使用Python编程语言实现了DES算法的加密和解密过程,并通过实验验证了算法的正确性。
1. 密钥生成:首先,根据用户输入的密钥,通过置换表将64位密钥压缩为56位,并生成16个子密钥。
每个子密钥都是48位的,用于16轮迭代中的密钥混合操作。
2. 加密过程:用户输入明文数据块,将明文按照初始置换表进行重排,得到初始数据块。
DES加密解密实验报告
DES加密解密实验报告实验报告题目:DES加密解密实验一、实验目的1.了解DES加密算法的工作原理。
2. 学习使用Python编程语言实现DES加密算法。
3.掌握DES加密算法的应用方法。
二、实验原理DES(Data Encryption Standard)是一种用于加密的对称密钥算法,其密钥长度为64位,分为加密过程和解密过程。
1.加密过程(1)初始置换IP:将64位明文分成左右两部分,分别为L0和R0,进行初始置换IP操作。
(2)子密钥生成:按照规则生成16个子密钥,每个子密钥长度为48位。
(3)迭代加密:通过16轮迭代加密运算,得到最终的密文。
每轮迭代加密包括扩展置换、异或运算、S盒替代、P置换和交换操作。
(4)逆初始置换:将最终的密文分成左右两部分,进行逆初始置换操作,得到最终加密结果。
2.解密过程解密过程与加密过程类似,但是子密钥的使用顺序与加密过程相反。
三、实验材料与方法材料:电脑、Python编程环境、DES加密解密算法代码。
方法:1. 在Python编程环境中导入DES加密解密算法库。
2.输入明文和密钥。
3.调用DES加密函数,得到密文。
4.调用DES解密函数,得到解密结果。
5.输出密文和解密结果。
四、实验步骤1.导入DES加密解密算法库:```pythonfrom Crypto.Cipher import DES```2.输入明文和密钥:```pythonplaintext = "Hello World"key = "ThisIsKey"```3.创建DES加密对象:```pythoncipher = DES.new(key.encode(, DES.MODE_ECB) ```。
DES实验总结
DES实验总结一.DES简介:DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。
DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。
DES的所有的保密性均依赖于密钥。
二. DES算法过程:1. DES的加密过程:第一阶段:初始置换IP。
在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输入分组实施置换。
最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为L0,第33位到第64位记为R0。
第二阶段:16次迭代变换。
DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。
其算法的核心是算法所规定的16次迭代变换。
DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前一次迭代变换的结果和用户密钥扩展得到的子密钥Ki 作为输入;每一次迭代变换只变换了一半数据,它们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果作为新的有半部分,原来的有半部分变成了新的左半部分。
用下面的规则来表示这一过程(假设第i次迭代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1?f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接将R16 L16并在一起作为未置换的输入。
第三阶段:逆(初始)置换。
他是初始置换IP的逆置换,记为IP-1。
在对16次迭代的结果(R16 L16)再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16)。
实验一 DES加密解密
实验一 DES加密解密实验目的1、理解对称加密算法的原理和特点。
2、理解DES和AES算法的加密原理。
实验原理DES是一种分组加密算法,所谓分组加密算法就是对一定大小的明文或密文来做加密或解密动作。
而在DES这个加密系统中,每次加密或解密的分组大小均为64位,所以DES没有密文扩充的问题。
对大于64位的明文只要按每64位一组进行切割,而对小于64位的明文只要在后面补“0”即可。
另一方面,DES所用的加密或解密密钥也是64位大小,但因其中有8个位是用来作奇偶校验的,所以64位中真正起密钥作用的只有56位,密钥过短也是DES最大的缺点。
DES加密与解密所用的算法除了子密钥的顺序不同外,其他部分完全相同。
核心代码#include <stdlib.h>#include <stdio.h>#include <string.h>#define ENCRYPT 1#define DECRYPT 0static void printHex( char *cmd, int len );static void printArray( const char *In, int len );static void F_func(bool In[32], const bool Ki[48]); // f函数static void S_func(bool Out[32], const bool In[48]); // S盒代替static void Transform(bool *Out, bool *In, const char *Table, int len); // 变换static void Xor(bool *InA, const bool *InB, int len); // 异或static void RotateL(bool *In, int len, int loop); // 循环左移static void ByteToBit(bool *Out, const char *In, int bits); // 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits); // 位组转换成字节组// 16位子密钥static bool SubKey[16][48];// 64位经过PC1转换为56位(PC-1)const static char PC1_Table[56] ={};// 左移const static char LOOP_Table[16] ={};// 排列选择 2 (PC-2)const static char PC2_Table[48] ={};// Ri_1(32位)经过变换E后膨胀为48位(E) void F_func static const char E_Table[48] ={};// 8个4比特合并为32比特的排列Pconst static char P_Table[32] ={};// 经过S盒S-boxesconst static char S_Box[8][4][16] ={};// 初始排列(IP)const static char IP_Table[64] ={};// L16与R16合并后经过IP_1的最终排列(IP**-1)const static char IPR_Table[64] ={};void Des_SetKey(const char Key[8]); //生成子密钥void Des_Run(char Out[8], char In[8], bool Type); //DES算法void main(int argc, char *argv[]){char key[12]={1,2,3,4,5,6,7,8};char str[12]="Hello";char str2[12];//printArray( PC2_Table, sizeof(PC2_Table)/sizeof(PC2_Table[0]) );printf("Before encrypting: ");puts(str);Des_SetKey(key);memset(str2, 0, sizeof(str2));Des_Run(str2, str, ENCRYPT);printf("After encrypting: ");printHex( str2, 8 );memset(str, 0, sizeof(str));printf("After decrypting: ");Des_Run(str, str2, DECRYPT);puts(str);}实验分析DES采用传统的换位和置换的方法进行加密,在56b密钥的控制下,将64b明文块变换为64b密文块,加密过程包括16轮的加密迭代,每轮都采用一种乘积密码方式(代替和移位)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// permuted choice key (table)
const static char PC2_Table[48] = {
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40,, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
// number left rotations of pc1
const static char LOOP_Table[16] = {
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
// S3
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,
static const char E_Table[48] = {
32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,
8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,
16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
// S6
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,
二、实验内容
1.编写程序实现DES的加、解密:
1)编程构造DES的密钥;
2)应用上述获得的密钥将一段英文或文件进行加、解密。
2.用DES算法实现口令的安全
三、实验结果
1.实现DES算法的详细代码:
const static char IP_Table[64] = {
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1
};
// 32-bit permutation function P used on the output of the S-boxes
const static char P_Table[32] = {
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
static void SetKey(const char* Key, int len);//设置密钥
static void SetSubKey(PSubKey pSubKey, const char Key[8]);//设置子密钥
static void F_func(bool In[32], const bool Ki[48]);// f函数
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,
static void S_func(bool Out[32], const bool In[48]);// S盒代替
static void Transform(bool *Out, bool *In, const char *Table, int len);//变换
static void Xor(bool *InA, const bool *InB, int len);//异或
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,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
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,
// S4
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
F_func(Ri, (*pSubKey)[i]);
Xor(Ri, Li, 32);
memcpy(Li, tmp, 32);
}
}else{
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
};
// expansion operation matrix
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
};
// permuted choice table (key)
const static char PC1_Table[56] = {
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
// S5
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,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
};
typedef bool (*PSubKey)[16][48];
static void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES加/解密
static bool SubKey[2][16][48];// 16圈子密钥
static bool Is3DES;// 3次DES标志
static char Tmp[256], deskey[16];
void SetKey(const char* Key, int len)
{
memset(deskey, 0, 16);
// S2
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,
static void RotateL(bool *In, int len, int loop);//循环左移
static void ByteToBit(bool *Out, const char *In, int bits);//字节组转换成位组
static void BitToByte(char *Out, const bool *In, int bits);//位组转换成字节组
memcpy(deskey, Key, len>16?16:len);
SetSubKey(&SubKey[0], &deskey[0]);
Is3DES = len>8 ? (SetSubKey(&SubKey[1], &deskey[8]), true) : false;
}
void SDES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
密码学应用与实践课程实验报告
实验1:实现DES密码体制
姓名
高大龙
院系
计算机科学与技术
学号
070410220
任课教师
刘扬
指导教师
刘扬
实验地点
学院实验室
实验时间
2009.12.1