DES_加密解密算法的C++实现--实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//按64位分一组 void Get64Bit(ElemType ch[8],ElemType bit[64]) { ElemType temp[8]; int count=0; fo j]; } count++; } } //初始置换
wk.baidu.com
void InitialEX(ElemType Inorder[64],ElemType Disorder[64]) { for(int i=0;i<64;i++) { } //逆置换 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]; } }
int IP_ANTEX[64]= { 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6 }; //扩展矩阵 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 }; //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, 1 }, { {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, {3, 13, 4, 7, 15, 2, 8, 14 }, { {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, {13, 7, 0, 9, 3, 4, 6, 10 }, { { 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, {13, 8, 11, 5, 6, 15, 0, 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, }, { {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, {13, 0, 11, 7, 4, 9, 1, 10 }, { {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, {1, 15, 13, 8, 10, 3, 7, 4 }
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]) 3 //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]) 函数执行次序和调用关系关系如下:
1 实验一 1、实验题目 利用C/C++编程实现DES加密算法或MD5加密算法。我选择的是用 C++语言实现 DES的加密算法。 2、实验目的 通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其 实际应用 价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算 法的实现过程 3、实验环境 操作系统:WIN7旗舰版 开发工具:Visual Studio 2010旗舰版 开发语言:C++ 4、实验原理 DES加密流程
2 如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1, 压缩换位2,扩 展置换,S盒置换,异或运算、终结置换等过程。 初始置换是按照初 始置换表将64位明文重新排列次序 扩展置换是将原32为数据扩展为 48位数据,它主要由三个目的: 1、产生与子密钥相同的长度 2、提 供更长的结果,使其在加密过程中可以被压缩 3、产生雪崩效应,使得输入的一位将影响两个替换 S盒置换是DES算法中最核心的内容,在DES中,只有S盒置换是非线 性的,它比DES 中其他任何一步都提供更好的安全性 终结置换与初始置换相对应,它们都不影响DES的安全性,主要目的 是为了更容易将 明文与密文数据一字节大小放入DES的f算法中
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<<"左边" <<endl; for(int i=0;i<32;i++) { cout<<(int)LResult[i]; if((i+1)%8==0) { cout<<end } } cout<<"右边" <<endl; for(int i=0;i<32;i++) { cout<<(int)RResult[i]; if((i+1)%8==0) { cout<<endl; } }*/
}; int DIREX[32]= { 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, }; //左移移位表 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, 3 }; 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 temp } tempbit[7]=0; for(int index = 7;index >=0;index--) { tempch=tempch|(tempbit[index]<<(index)); } ch=tempch; //cout<<(char)tempch<<endl; return 0; }
6.源代码
// DES.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "function.h" #include <iostream> #include<bitset> #include<
//置换矩阵 int IP_EX[64]= { 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 3 };
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" <<endl; for(int i=0;i<32;i++) { cout<<(int)LResult[i]; if((i+1)%8==0) { cout<<end } } cout<<"右边" <<endl; for(int i=0;i<32;i++) { cout<<(int)RResult[i]; if((i+1)%8==0) { cout<<endl; } }*/
//16轮加密迭代 void MoveLeft(ElemType C[28],ElemType D[28],ElemType L0[32],ElemType R0[32]) { 子密钥 ElemType Result[48]; //每轮异或结果 ElemType Sout[32];
//每轮S盒输出 ElemType DirOut[32]; //直接置换输出 ElemType RResult[32]; ElemType LResult[32]; ElemType ExpandMsg[48]; ElemType 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 } 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]; //获取界面的子密钥 }