DES加密算法课程设计报告
更新时间:2023-09-23 05:14:01 阅读量: 人文社科 文档下载
- des加密算法详解推荐度:
- 相关推荐
软件实现流程图
开始 输入密文和密钥 密文和密钥转换成二进制,存储在文件中 读出64位密文和密钥 64位密钥进行pc-1置换,生成56位 56位比特串分成左右各28位。C[i]与D[i],i=0; C[i]与D[i]左移一位或者两位,由左移表决定左移位数Ls[16].左移产生C[i+1]与D[i+1] C[i+1]与D[i+1]合并为56位比特串,并进行pc-2置换,产生子密钥keys[i+1],i++; i>15 N Y 节点1
加密过程 节点1 64位明文进行IP置换后进行分组Li[32]与Ri[32];i=0 Ri[32]进行E扩展,生成48位比特串。48位比特串与子密钥keys[i+1]进行异或运算。 得到的48位比特串分为8组,进入8个S盒中,并按照S盒的规则输出8个十进制数 将8个十进制数转换为32位比特串。 32位比特串进行P置换,产生新的32位比特串 32位比特串与Li[32]进行异或,产生R(i+1)[32] L(i+1)[32]=Ri[32];i++ N i>15 Y R16[32]在前,L16[32]在后进行合并,合并后进行IP逆置换,即产生密文 结束 1
开始 输入密文和密钥 密文和密钥转换成二进制,存储在文件中 读出64位密文和密钥 64位密钥进行pc-1置换,生成56位 56位比特串分成左右各28位。C[i]与D[i],i=0; C[i]与D[i]左移一位或者两位,由左移表决定左移位数Ls[16].左移产生C[i+1]与D[i+1] C[i+1]与D[i+1]合并为56位比特串,并进行pc-2置换,产生子密钥keys[i+1],i++; i>15 N Y 节点1
加密过程 节点1 64位明文进行IP置换后进行分组Li[32]与Ri[32];i=0 Ri[32]进行E扩展,生成48位比特串。48位比特串与子密钥keys[i+1]进行异或运算。 得到的48位比特串分为8组,进入8个S盒中,并按照S盒的规则输出8个十进制数 将8个十进制数转换为32位比特串。 32位比特串进行P置换,产生新的32位比特串 32位比特串与Li[32]进行异或,产生R(i+1)[32] L(i+1)[32]=Ri[32];i++ N i>15 Y R16[32]在前,L16[32]在后进行合并,合并后进行IP逆置换,即产生密文 结束 2
二、标准DES的加密过程
1、明文与密钥的输入
首先8位ACSII字符的明文与密钥的输入,存放在mingwen[8]和miyao[8]中,然后将这些8位的ASCII字符转换成二进制的64位的明文和密钥,分别存放在mingwenB[64]和miyaoB[64]中,并将二进制的明文和密钥放在文件中 int str[8],i,j,ch,k;
FILE *fp4;fp4=fopen(\明文二进制.txt\ k=0;
for(i=0;i<8;i++) {
ch=mingwen[i]; for(j=0;j<8;j++) {
str[j]=ch%2; ch=ch/2; }
for(j=7;j>=0;j--) {
mingwenB[k]=str[j]; k++;
fprintf(fp4,\ } }
密钥的转换和存储同理。 2、密钥的产生
1)、64位miyaoB[64]经过pc-1置换,生成56位的比特串。定义pc1_Table[56],存放在afterpc1[56]中。
for(i=0;i<56;i++) afterpc1[i]=miyaoB[pc1_Table[i]-1]; 2)、56位比特串分组,生成C0[28]和D0[28] for(i=0;i<28;i++) C0[i]=afterpc1[i];
for(j=0,i=28;i<56;i++,j++) D0[j]=afterpc1[i];
3)、C0[28]、D0[28]进行左移,产生C[16][28]和D[16][28],为进行pc-2置换产生密钥做准备。 for(i=0;i<27;i++) //第一轮数据生成C[0][28]与D[0][28] {
C[0][i]=C0[i+1]; D[0][i]=D0[i+1]; }
C[0][27]=C0[0]; D[0][27]=D0[0];
for(i=1;i<16;i++) //第二轮数据至第十六轮数据生成
3
{ if(i==1||i==8||i==15) { for(j=0;j<27;j++) //左移1位 {
C[i][j]=C[i-1][j+1]; D[i][j]=D[i-1][j+1]; }
C[i][27]=C[i-1][0]; D[i][27]=D[i-1][0]; }
else //左移2位 {
for(j=0;j<26;j++) {
C[i][j]=C[i-1][j+2]; D[i][j]=D[i-1][j+2]; }
C[i][26]=C[i-1][0]; C[i][27]=C[i-1][1]; D[i][26]=D[i-1][0]; D[i][27]=D[i-1][1]; }
} //产生16轮左右数据,为pc-2置换准备。 4)、左右两部分比特串合并,存放在int beforekey[16][56]中 k=0;
for(i=0;i<16;i++) {
for(j=0;j<28;j++)
beforekey[i][j]=C[i][j]; for(k=0;k<28;k++,j++)
beforekey[i][j]=D[i][k]; }
5)、beforekey[16][56]经过pc-2置换,产生16轮密钥keys[16][48], for(i=0;i<16;i++) for(j=0;j<48;j++)
keys[i][j]=beforekey[i][pc_2table[j]-1]; 至此,16轮子密钥产生完毕,为keys[16][48]。 3、密文的产生
1)、明文经过初始置换IP置换。结果放在afterIP[64]中。 for(j=0;j<64;j++) {
afterIP[j]=mingwenB[IP_table[j]-1]; }
2)、明文的第0次分组,左部分L0[32],右部分R0[32]。 for(i=0;i<32;i++)
4
L0[i]=afterIP[i];
for(j=0,i=32;i<64;i++,j++) R0[j]=afterIP[i];
3)、为产生密文,要进行16轮的循环,每次循环生成一个L[i][32]和R[i][32],下面进行第一次循环,生成L[0][32]和R[0][32]。 for(i=0;i<32;i++) //Li=R(i-1) L[0][i]=R0[i];
4)、至于R[0][32]的生成,R[0][32]=L0[32]^f(R0,keys[0])。因此,要首先计算出f值。R0[32]经过E变换,由32位扩展为48位,然后与子密钥进行异或,为进入S盒做准备。结果放在afterER0[48]中 for(i=0;i<48;i++)
afterER0[i]=R0[E_table[i]-1];
5)、E扩展后,与子密钥进行异或,生成进入S盒前的数据。存放在beforeS[48].
for(i=0;i<48;i++)
if(afterER0[i]==keys[0][i]) beforeS[i]=0; else
beforeS[i]=1;
6)、要进入S盒的48位比特串要经过8个不同的S盒,因此,将48位比特串分在8个数组中,放在beforeSBox[8][6]. for(k=0,i=0;i<8;i++) for(j=0;j<6;j++)
{ beforeSBox[i][j]=beforeS[k]; k++; }
7)、进入S盒后,进过8个S盒,每个S盒产生一个十进制的数字,在0~15之间。beforeSBox[i][6]中的6个数字,第0、5位组成了S盒的行号,第1、2、3、4,4位组成了S盒的列号,根据行列选中S盒中的数据作为输出,存放在afterSBox[8]中。
int hang,lie; for(i=0;i<8;i++)
{ hang=beforeSBox[i][0]*2+beforeSBox[i][5];
lie=beforeSBox[i][1]*8+beforeSBox[i][2]*4+beforeSBox[i][3]*2+beforeSBox[i][4];
afterSBox[i]=SBox[i][hang][lie]; }
8)、由S盒出来的8个十进制数字转换成32位的二进制比特串,存放在beroreP[32]中,为接下来的P置换做准备。 k=0; int temp; int str1[4]; for(i=0;i<8;i++) {
temp=afterSBox[i];
5
m_Mingwen=m_Mingwen+(char)(48+output[i]); if((i+1)%8==0)
m_Mingwen=m_Mingwen+\ //64位明文显示在界面上 }
int charB[8][8]; k=0;
for(i=0;i<8;i++) {
for(j=0;j<8;j++,k++)
charB[i][j]=output[k]; }
char result[8]; for(i=0;i<8;i++) {
str[i]=0;
if(charB[i][0]==1) str[i]=str[i]+128; if(charB[i][1]==1) str[i]=str[i]+64; if(charB[i][2]==1) str[i]=str[i]+32; if(charB[i][3]==1) str[i]=str[i]+16; if(charB[i][4]==1) str[i]=str[i]+8; if(charB[i][5]==1) str[i]=str[i]+4; if(charB[i][6]==1) str[i]=str[i]+2; if(charB[i][7]==1) str[i]=str[i]+1; }
for(i=0;i<8;i++)
result[i]=str[i]; result[i]='\\0';
m_outputMingwen=result; CString temp2,temp3; char *ch1,*ch2,*ch3; for(i=0;i<16;i++) {
int m=m_output.InsertItem(0,\ char
chtempL[40]=\ int ctempL[32],ctempkey[48],ctempR[32];
36
for(j=0;j<32;j++) {
ctempL[j]=R[i][j]; ctempR[j]=L[i][j]; }
for(j=0;j<48;j++)
ctempkey[j]=keys[i][j]; for(j=0;j<32;j++) {
temp1.Format(\
ch1=temp1.GetBuffer(temp1.GetLength()); strcat(chtempL,ch1); if((j+1)%8==0)
strcat(chtempL,\
temp2.Format(\
ch2=temp2.GetBuffer(temp2.GetLength()); strcat(chtempR,ch2); if((j+1)%8==0)
strcat(chtempR,\ }
for(j=0;j<48;j++) {
temp3.Format(\
ch3=temp3.GetBuffer(temp3.GetLength()); strcat(chtempkey,ch3); if((j+1)%8==0)
strcat(chtempkey,\ }
_itoa(i+1,number,10);
m_output.SetItemText(m,0,number); m_output.SetItemText(m,1,chtempkey); m_output.SetItemText(m,2,chtempL); m_output.SetItemText(m,3,chtempR); }
UpdateData(false); }
37
2、解密过程(JieMi.cpp)
// JieMi.cpp : implementation file
#include \#include \#include \
#ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#include \
// JieMi dialog
JieMi::JieMi(CWnd* pParent /*=NULL*/) : CDialog(JieMi::IDD, pParent) {
//{{AFX_DATA_INIT(JieMi) m_Mingwen = _T(\ m_Miwen = _T(\ m_Miyao = _T(\
m_outputMingwen = _T(\ //}}AFX_DATA_INIT }
void JieMi::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(JieMi)
DDX_Control(pDX, IDC_LIST1, m_output); DDX_Text(pDX, IDC_Mingwen, m_Mingwen); DDX_Text(pDX, IDC_Miwen, m_Miwen); DDX_Text(pDX, IDC_Miyao, m_Miyao);
DDX_Text(pDX, IDC_outMingwen, m_outputMingwen); //}}AFX_DATA_MAP }
BEGIN_MESSAGE_MAP(JieMi, CDialog) //{{AFX_MSG_MAP(JieMi)
ON_BN_CLICKED(IDC_back, Onback) ON_BN_CLICKED(IDC_JieMi, OnJieMi) //}}AFX_MSG_MAP END_MESSAGE_MAP()
// JieMi message handlers
26
BOOL JieMi::OnInitDialog() {
CDialog::OnInitDialog();
m_output.ModifyStyle(0,LVS_REPORT); DWORD style= m_output.GetExStyle(); style=style^LVS_EX_CHECKBOXES;
m_output.SetExtendedStyle(style|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT);
m_output.InsertColumn(0,\循环轮数\ m_output.InsertColumn(1,\子密钥\ m_output.InsertColumn(2,\左部(Li)\ m_output.InsertColumn(3,\右部(Ri)\ // TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
void JieMi::Onback() {
// TODO: Add your control notification handler code here ShowWindow(SW_HIDE); CDESDlg dlg; dlg.DoModal(); }
void JieMi::OnJieMi() {
// TODO: Add your control notification handler code here FILE *fp1,*fp2; int i,j,k; int str[8];
char miwen[8],miyao[8]; //存储从文件中读取的明文和密钥 int miwenB[64],miyaoB[64]; //存储64位二进制的明文和密钥 fp1=fopen(\ fp2=fopen(\ if(fp1==NULL||fp2==NULL) {
MessageBox(\明文和密钥文件打开失败!\ return; }
for(i=0;i<8;i++) {
fscanf(fp1,\ fscanf(fp2,\
27
}
fclose(fp1); fclose(fp2); FILE *fp4,*fp5; char ch;
fp4=fopen(\密文二进制.txt\fp5=fopen(\密钥二进制.txt\k=0;
for(i=0;i<8;i++) {
ch=miwen[i]; for(j=0;j<8;j++) {
str[j]=ch%2; ch=ch/2; }
for(j=7;j>=0;j--) {
miwenB[k]=str[j]; k++;
fprintf(fp4,\ } }
fclose(fp4); k=0;
for(i=0;i<8;i++) {
ch=miyao[i]; for(j=0;j<8;j++) {
str[j]=ch%2; ch=ch/2; }
for(j=7;j>=0;j--) {
miyaoB[k]=str[j]; k++;
fprintf(fp5,\ } }
fclose(fp5);
char Miwentemp[75]=\CString temp1; char *cha;
28
for(i=0;i<64;i++) {
temp1.Format(\
cha=temp1.GetBuffer(temp1.GetLength()); strcat(Miwentemp,cha); if((i+1)%8==0)
strcat(Miwentemp,\ }
m_Miwen=Miwentemp; //二进制密文显示在界面上 for(i=0;i<64;i++) {
temp1.Format(\
cha=temp1.GetBuffer(temp1.GetLength()); strcat(Miyaotemp,cha); if((i+1)%8==0)
strcat(Miyaotemp,\ }
m_Miyao=Miyaotemp; //二进制密钥显示在界面上 /*密钥的生成*/
int pc_1table[56]={ //pc_1置换表 57,49,41,33,25,17,9, 1,58,50,42,34,26,18, 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};
int pc_2table[48]={ //pc_2置换表 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}; int afterpc_1[56]; /*经过pc_1置换*/ for(i=0;i<56;i++)
afterpc_1[i]=miyaoB[pc_1table[i]-1]; /*密钥第0次分组*/ int C0[28],D0[28]; for(i=0;i<28;i++)
29
C0[i]=afterpc_1[i]; for(j=0,i=28;i<56;i++,j++) D0[j]=afterpc_1[i];
/*十六轮子密钥产生前的中间数据,左移产生的C[16][28],D[16][28]*/ int C[16][28],D[16][28]; for(i=0;i<27;i++) //第一轮数据生成C[0][28]与D[0][28] {
C[0][i]=C0[i+1]; D[0][i]=D0[i+1]; }
C[0][27]=C0[0]; D[0][27]=D0[0]; for(i=1;i<16;i++) //第二轮数据至第十六轮数据生成 {
if(i==1||i==8||i==15) {
for(j=0;j<27;j++) //左移1位 {
C[i][j]=C[i-1][j+1]; D[i][j]=D[i-1][j+1]; }
C[i][27]=C[i-1][0]; D[i][27]=D[i-1][0]; }
else //左移2位 {
for(j=0;j<26;j++) {
C[i][j]=C[i-1][j+2]; D[i][j]=D[i-1][j+2]; }
C[i][26]=C[i-1][0]; C[i][27]=C[i-1][1]; D[i][26]=D[i-1][0]; D[i][27]=D[i-1][1]; } }
/*十六轮子密钥初始数据合并,为pc_2置换生成子密钥做准备*/ int beforekey[16][56]; k=0;
for(i=0;i<16;i++) {
for(j=0;j<28;j++)
30
正在阅读:
DES加密算法课程设计报告09-23
跨文化管理复习06-08
爱在心窝里03-18
人美版三年级上册《书法练习与指导》整册教案(最新)04-10
我要的是葫芦续编故事06-14
2017-2018年高中地理选修六全一册课时提升试卷(18份) 人教课标版1611-29
【精编范文】赡养老人纠纷民事起诉状-word范文模板 (3页)04-19
复印机常见故障及检修07-01
- 粮油储藏基础知识
- 论文范文(包括统一封面和内容的格式)
- 经典解题方法
- 综合部后勤办公用品管理办法+领用表
- 学生宿舍突发事件应急预案
- 16秋浙大《生理学及病理生理学》在线作业
- 四分比丘尼戒本(诵戒专用)
- 浙江财经大学高财题库第一章习题
- 九大员岗位职责(项目经理、技术负责人、施工员、安全员、质检员、资料员、材料员、造价员、机管员)
- 旅游财务管理习题(学生版)
- 德阳外国语高二秋期入学考试题
- 投资学 精要版 第九版 第11章 期权市场
- 控制性详细规划城市设计认识
- bl03海运提单3国际贸易答案
- 2010-2011学年湖北省武汉市武珞路中学七年级(上)期中数学试卷
- VB程序填空改错设计题库全
- 教师心理健康案例分析 - 年轻班主任的心理困惑
- 民间借贷司法解释溯及力是否适用?
- 三联书店推荐的100本好书
- 《化工原理》(第三版)复习思考题及解答
- 算法
- 加密
- 课程
- 报告
- 设计
- DES