DES加密解密算法的C++实现实验报告.docx

上传人:b****6 文档编号:15458187 上传时间:2023-07-04 格式:DOCX 页数:19 大小:115.37KB
下载 相关 举报
DES加密解密算法的C++实现实验报告.docx_第1页
第1页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第2页
第2页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第3页
第3页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第4页
第4页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第5页
第5页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第6页
第6页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第7页
第7页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第8页
第8页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第9页
第9页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第10页
第10页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第11页
第11页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第12页
第12页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第13页
第13页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第14页
第14页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第15页
第15页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第16页
第16页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第17页
第17页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第18页
第18页 / 共19页
DES加密解密算法的C++实现实验报告.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

DES加密解密算法的C++实现实验报告.docx

《DES加密解密算法的C++实现实验报告.docx》由会员分享,可在线阅读,更多相关《DES加密解密算法的C++实现实验报告.docx(19页珍藏版)》请在冰点文库上搜索。

DES加密解密算法的C++实现实验报告.docx

DES加密解密算法的C++实现实验报告

 

实验一 

1、实验题目 

  

利用C/C++编程实现DES加密算法或MD5加密算法。

我选择的是用C++语言实现

 

DES的加密算法。

 

2、实验目的 

  

通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其实际应用 

价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算法的实现过程 

3、实验环境 

操作系统:

WIN7旗舰版 

开发工具:

Visual Studio 2010旗舰版 开发语言:

C++ 

4、实验原理 

 

 

DES加密流程

 

 

 如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1,压缩换位2,扩

展置换,S盒置换,异或运算、终结置换等过程。

   初始置换是按照初始置换表将64位明文重新排列次序   扩展置换是将原32为数据扩展为48位数据,它主要由三个目的:

   1、产生与子密钥相同的长度   2、提供更长的结果,使其在加密过程中可以被压缩   

3、产生雪崩效应,使得输入的一位将影响两个替换 

  S盒置换是DES算法中最核心的容,在DES中,只有S盒置换是非线性的,它比DES   中其他任何一步都提供更好的安全性 

  终结置换与初始置换相对应,它们都不影响DES的安全性,主要目的是为了更容易将   明文与密文数据一字节大小放入DES的f算法中 

 

DES解密流程与加密流程基本相同,只不过在进行16轮迭代元算时,将子密钥生成的

K的次序倒过来进行迭代运算 

5、实验过程记录 

 

在对DES算法有了清晰的认识后,编码过程中我将其分为几个关键部分分别进行编码,最后将整个过程按顺序执行,即可完成DES的加密,代码的主要几个函数如下:

 

//Byte转为Bit 

ByteToBit(ElemType ch,ElemType bit[8])     //Bit转为Byte 

BitToByte(ElemType bit[8],ElemType &ch)  //初始置换 

InitialEX(ElemType Inorder[64],ElemType Disorder[64]) //终结置换 

AntiEx(ElemType Disorder[64]) //扩展置换 

ExpandEX(ElemType RightMsg[32],ElemType ExpandMsg[48]) //16轮迭代加密 

MoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32])  

 

//16轮迭代解密 

mMoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32]) 

//生成48位子密钥 

GetCD48(ElemType C[28],ElemType D[28],ElemType Secret[48]) //48位明文与子密钥进行异或运算 

XOR(ElemType ExpandMsg[48],ElemType Secret[48],ElemType Result[48]) //S盒四位输出 

getSOut(ElemType Result[48],ElemType Sout[32]) //直接置换 

DirExchange(ElemType Sout[32],ElemType DirOut[32]) //Li与Ri进行抑或运算 

XORLR(ElemType DirOut[32],ElemType Left[32],ElemType Result[32])  

函数执行次序和调用关系关系如下:

 

 

 

6.源代码

 

 

 

// DES.cpp :

 定义控制台应用程序的入口点。

 //  

#include "stdafx.h" #include "function.h" #include  #include #include using namespace std;  

 

//置换矩阵 

int IP_EX[64]= {  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 

}; 

 

 int IP_ANTEX[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, 41, 10, 50, 18, 58, 26,  33,  1, 41,  9, 49, 17, 57, 25 

};  

//扩展矩阵

 int EXTEND[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,  24, 25, 26, 27, 28, 29,  28, 29, 30, 31,   1, 2 

};  

//S盒 int S[8][4][16]= {  {   {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} 

 } 

};  

 int DIREX[32]= {  16,  7, 20, 21,  29, 12, 28, 17,   1, 15, 23, 26,   5, 18, 31, 10,   2,  8, 24, 14,  32, 27,  3,  9,  19, 13, 30,  6,  22, 11,  4, 25 

};  

//左移移位表 

int MOVELEFT[16]= {  1,1,2,2,2,2,2,2,  1,2,2,2,2,2,2,1 

};  

//压缩换位表2

 int CutEX[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, 51, 45, 33, 48,  44, 49, 39, 56, 34, 53,  46, 42, 50, 36, 29, 32 

};      

typedef char ElemType;   

ElemType subsec[16][48];  

//Byte转bit 

int ByteToBit(ElemType ch,ElemType bit[8]) { 

    for(int index = 7;index >= 0;index--)  {            bit[index] = (ch>>index)&1;    //cout<<(int)bit[index];     }    

    return 0;    }   

//bit转Byte 

int BitToByte(ElemType bit[8],ElemType &ch) {  ElemType tempch=0;  ElemType tempbit[8];  for(int i=0;i<8;i++)  {   tempbit[i]=bit[i]; 

 } 

 tempbit[7]=0; 

 for(int index = 7;index >=0;index--)  

{    

  tempch=tempch|(tempbit[index]<<(index));     }   ch=tempch; 

 //cout<<(char)tempch<

return 0;  

 

//按64位分一组 

void Get64Bit(ElemType ch[8],ElemType bit[64]) {  ElemType temp[8];  int count=0;  for(int i=0;i<8;i++)  {   ByteToBit(ch[i],temp);   for(int j=0;j<8;j++)   {    bit[count*8+j]=temp[7-j]; 

  } 

  count++; 

 

}  

//初始置换 

void InitialEX(ElemType Inorder[64],ElemType Disorder[64]) {  for(int i=0;i<64;i++)  {   Disorder[i]=Inorder[IP_EX[i]-1];  } 

}  

//逆置换 

void AntiEx(ElemType Disorder[64]) {  ElemType temp[64];  for(int i=0;i<64;i++)  {   

temp[i]=Disorder[i]; 

 } 

 for(int i=0;i<64;i++)  {   Disorder[i]=temp[IP_ANTEX[i]-1]; 

 } 

}  

//扩展置换 

void ExpandEX(ElemType RightMsg[32],ElemType ExpandMsg[48]) { 

 for(int i=0;i<48;i++)  {   ExpandMsg[i]=RightMsg[EXTEND[i]-1]; 

 } 

 

//16轮加密迭代 

void MoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32]) {  ElemType Secret[48];  //子密钥  ElemType Result[48];  //每轮异或结果  ElemType Sout[32];  

 

//每轮S盒输出  ElemType DirOut[32];  //直接置换输出 

 ElemType RResult[32];  ElemType LResult[32];  ElemType ExpandMsg[48];  ElemType temp[32];  for(int i=0;i<32;i++)  {   LResult[i]=L0[i];   

RResult[i]=R0[i]; 

 } 

 for(int i=0;i<16;i++)  {   if(MOVELEFT[i]==1)   {    for(int j=0;j<27;j++)    {     C[i]=C[i+1]; 

   } 

   C[27]=0; 

  }   else   {    for(int j=0;j<26;j++)    {     

C[i]=C[i+2];    } 

   C[26]=0;    C[27]=0; 

  } 

  ExpandEX(RResult,ExpandMsg);   GetCD48(C,D,Secret);  

 

for(int j=0;j<48;j++) 

 

  { 

   subsec[15-i][j]=Secret[j];   //获取界面的子密钥 

  } 

  XOR(ExpandMsg,Secret,Result);   //S盒置换 

  getSOut(Result,Sout);   //直接置换 

  DirExchange(Sout,DirOut);   //与L进行异或 

  XORLR(DirOut,LResult,temp);   for(int i=0;i<32;i++)   {    LResult[i]=RResult[i]; 

  } 

  for(int i=0;i<32;i++)   { 

   RResult[i]=temp[i];   } 

  for(int i=0;i<32;i++)   {    L0[i]=LResult[i];    R0[i]=RResult[i]; 

  } 

  } 

 /*cout<<"zuo"<

  } 

 } 

  cout<<"右边"<

   cout<

  }  

}*/ 

 

   LResult[j]=RResult[j]; 

  } 

  for(int j=0;j<32;j++)   {    RResult[j]=temp[j];   

  } 

 for(int i=0;i<32;i++)  {   L0[i]=LResult[i];   

R0[i]=RResult[i]; 

 } 

 /*cout<<"左边"<

  } 

 } 

  cout<<"右边"<

 cout<

}  

 

//生成48位子密钥 

void GetCD48(ElemType C[28],ElemType D[28],ElemType Secret[48]) {  ElemType temp[56];  for(int i=0;i<28;i++)  { 

  temp[i]=C[i];  } 

 

for(int i=28;i<56;i++) 

 { 

  temp[i]=C[i];  } 

 for(int i=0;i<48;i++)  {   Secret[i]=temp[CutEX[i]]; 

 } 

}  

//48位明文与子密钥进行异或 

/*ExpandMsg[48] 48位明文,Secret[48] 48位密钥,Result[48] 异或结果*/ void XOR(ElemType ExpandMsg[48],ElemType Secret[48],ElemType Result[48]) {  for(int i=0;i<48;i++)  {   Result[i]=ExpandMsg[i]^Secret[i]; 

 } 

}  

//S盒四位输出 

void getSOut(ElemType Result[48],ElemType Sout[32]) {  int row;  int col; 

 ElemType temp[6];  for(int i=0;i<8;i++)  {   for(int j=0;j<6;j++)   {    temp[j]=Result[i*6+j];   } 

  row=temp[0]*2+temp[5]; 

  col=temp[1]*8+temp[2]*4+temp[3]*2+temp[4]*1;   int k=S[i][row][col]%2;   Sout[i*4+3]=k;   Sout[i*4+2]=k%2;   Sout[i*4+1]=(k%2)%2;   Sout[i*4]=((k%2)%2)%2; 

 } 

}  

//直接置换 

void DirExchange(ElemType Sout[32],ElemType DirOut[32]) { 

 for(int i=0;i<32;i++)  {   DirOut[i]=Sout[DIREX[i]-1]; 

 } 

 

//左右异或得到R[i] 

void XORLR(ElemType DirOut[32],ElemType Left[32],ElemType Result[32]) {  for(int i=0;i<32;i++)  {   Result[i]=DirOut[i]^Left[i]; 

 } 

 

void _tmain(int argc, _TCHAR* argv[]) {  ElemType bit[64];  ElemType ch[8];  ElemType Disorder[64];  ElemType right[32];  ElemType left[32];  ElemType expand[48];  ElemType SECRET[56]=  {   1,1,0,1,0,0,1,   1,1,0,1,0,1,1,   0,0,0,0,1,0,1,   1,0,0,0,1,1,1,   0,1,1,0,1,0,1,   0,1,0,1,0,0,1,   1,1,1,0,0,0,1,   0,0,1,1,1,0,1 

 }; 

 //获取C0与D0  ElemType C[28];  ElemTyp

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2