在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例桌面应用界面/GUI → Des加解密

Des加解密

桌面应用界面/GUI

下载此实例
  • 开发语言:C/C++
  • 实例大小:41.88M
  • 下载次数:16
  • 浏览次数:172
  • 发布时间:2021-05-05
  • 实例类别:桌面应用界面/GUI
  • 发 布 人:2982359710
  • 文件格式:.7z
  • 所需积分:2
 相关标签: 加解密 DES ES 解密

实例介绍

【实例简介】

基于MFC的Des加解密

【实例截图】


【核心代码】

static void CharToBit(const char input[], int output[], int bits)//把CHAR转换为INT
{

int i, j;
for (j = 0; j < 8; j )
{
for (i = 0; i < 8; i )
{
output[7 * (j 1) - i j] = (input[j] >> i) & 1;
}
}
};
static void BitToChar(const int intput[], char output[], int bits)//把INT转换为CHAR
{
int i, j;
for (j = 0; j < 8; j )
{
for (i = 0; i < 8; i )
{
output[j] = output[j] * 2 intput[i 8 * j];
}
}
};
static void Xor(int *INA, int *INB, int len,int count,int flag)//异或操作
{
int i;
for (i = 0; i < len; i )
{
*(INA i) = *(INA i) ^ *(INB i);
}

if (flag == 0) {
if (count == 1)
copy(INA, XorKeyBox, 0, 48);

}
if (flag == 1) {
if (count == 1)
copy(INA, lXorBox, 0, 32);

}
};
static  void IP(const int input[64], int output[64], int table[64])//初始IP置换
{
int i;
for (i = 0; i < 64; i )
{
output[i] = input[table[i] - 1];//减1操作不可少!!

}
if (flag == 1)
copy(output, ipBox, 0, 64);
flag = 0;


};
static  void E(const int input[32], int output[48], int table[48],int count)//E扩展
{
for (int j = 0; j < 32; j )
{
pre_right[j] = input[j];
}
int i;
for (i = 0; i < 48; i )
{
output[i] = input[table[i] - 1];
}

if(count == 1)
copy(output,eBox,0,48);



};
static  void P(const int input[32], int output[32], int table[32],int count)//P置换
{
int i;
for (i = 0; i < 32; i )
{
output[i] = input[table[i] - 1];
}
if (count == 1)
copy(output, pBox, 0, 32);

};
static  void IP_In(const int input[64], int output[64], int table[64])//逆IP
{
int i;
for (i = 0; i < 64; i )
{
output[i] = input[table[i] - 1];
}


};
static  void PC_1(const int input[64], int output[56], int table[56])//PC_1
{
int i;
for (i = 0; i < 56; i )
{
output[i] = input[table[i] - 1];
}
};
static  void PC_2(const int input[56], int output[48], int table[48])//PC_2
{
int i;
for (i = 0; i < 48; i )
{
output[i] = input[table[i] - 1];
}
};
static  void S(const int input[48], int output[32], int table[8][4][16],int count)//S盒压缩
{
int i = 0;
int j = 0;
int INT[8] = {0};
for (; i < 48; i = i 6)
{
INT[j] = table[j][(input[i] << 1) (input[i 5])][(input[i 1] << 3) (input[i 2] << 2) (input[i 3] << 1) (input[i 4])];
j ;
}
for (j = 0; j < 8; j )
{
for (i = 0; i < 4; i )
{
output[3 * (j 1) - i j] = (INT[j] >> i) & 1;
}
}
if (count == 1)
copy(output, sBox, 0, 32);



};
static void F_func(int input[32], int output[32], int subkey[48],int i)//完成DES算法轮变换
{
int len = 48;
int temp[48] = { 0 };
int temp_1[32] = { 0 };
E(input, temp, E_Table,i);
Xor(temp, subkey, len,i,0);
S(temp, temp_1, S_Box,i);
P(temp_1, output, P_Table,i);
};
static void RotateL(const int input[28], int output[28], int leftCount)//秘钥循环左移
{
int i;
int len = 28;
for (i = 0; i < len; i )
{
output[i] = input[(i leftCount) % len];
}
};
static void  subKey_fun(const int input[64], int Subkey[16][48])//子密钥生成
{

int loop = 1, loop_2 = 2;
int i, j;
int c[28], d[28];
int pc_1[56] = { 0 };
int pc_2[16][56] = { 0 };
int rotatel_c[16][28] = { 0 };
int rotatel_d[16][28] = { 0 };
PC_1(input, pc_1, PC1_Table);
for (i = 0; i < 28; i )
{
c[i] = pc_1[i];//c0
d[i] = pc_1[i 28];//d0
}
int leftCount = 0;
for (i = 1; i < 17; i )
{
if (i == 1 || i == 2 || i == 9 || i == 16)
{
leftCount = loop;
RotateL(c, rotatel_c[i - 1], leftCount);
RotateL(d, rotatel_d[i - 1], leftCount);
}
else
{
leftCount = loop_2;
RotateL(c, rotatel_c[i - 1], leftCount);
RotateL(d, rotatel_d[i - 1], leftCount);
}
}
for (i = 0; i < 16; i )
{
for (j = 0; j < 28; j )
{
pc_2[i][j] = rotatel_c[i][j];
pc_2[i][j 28] = rotatel_d[i][j];
}
}
for (i = 0; i < 16; i )
{
PC_2(pc_2[i], Subkey[i], PC2_Table);
}

copy(Subkey[0], sKeyBox, 0, 48);
};
static void  DES_Efun(char input[8], char key_in[8], int output[64])
{


int Ip[64] = { 0 };//存储初始置换后的矩阵
int output_1[64] = { 0 };
int subkeys[16][48] = { 0 };
int chartobit[64] = { 0 };
int key[64] = { 0 };
int l[17][32] = { 0 }, r[17][32] = { 0 };


CharToBit(input, chartobit, 8);//正确,转换为64个二进制数的操作正确!
IP(chartobit, Ip, IP_Table);//正确,IP初始置换!
CharToBit(key_in, key, 8);//正确!
subKey_fun(key, subkeys);//正确!
for (int i = 0; i < 32; i )
{
l[0][i] = Ip[i];
r[0][i] = Ip[32 i];
}


for (int j = 1; j < 16; j )//前15轮的操作
{

for (int k = 0; k < 32; k )
{
l[j][k] = r[j - 1][k];
}
F_func(r[j - 1], r[j], subkeys[j - 1], j);


Xor(r[j], l[j - 1], 32, j, 1);
memset(r2, 0, 65);
memset(l2, 0, 32);

aIntTosChar(pre_right, r2);
aIntTosChar(r[j], l2);

for (int k = 32; k < 64; k )
{
r2[k] = l2[k - 32];
}
sEach[j - 1] = r2;


}
int t = 0;
for (t = 0; t < 32; t )//最后一轮的操作
{
r[16][t] = r[15][t];
}

F_func(r[15], l[16], subkeys[15], 16);
Xor(l[16], l[15], 32, 16, 1);


for (t = 0; t < 32; t )
{
output_1[t] = l[16][t];
output_1[32 t] = r[16][t];
}
char buf2[65] = { 0 };
IBintoSBin(output_1, buf2, 64);
string sTemp(buf2);
sEach[15] = sTemp.substr(0, 64);

IP_In(output_1, output, IPR_Table);//逆置换


if (once == 1) {
IBintoSBin(output, fkey, 64);
once ;
}

};
static void  DES_Dfun(int input[64], char key_in[8], char output[8])
{

int Ip[64] = { 0 };//存储初始置换后的矩阵
int output_1[64] = { 0 };
int output_2[64] = { 0 };
int subkeys[16][48] = {0};
int chartobit[64] = { 0 };
int key[64] = {0};
int l[17][32] = { 0 }, r[17][32] = {0};

IP(input, Ip, IP_Table);//正确,IP初始置换!
CharToBit(key_in, key, 8);//正确!
subKey_fun(key, subkeys);//正确!
for (int i = 0; i < 32; i )
{
l[0][i] = Ip[i];
r[0][i] = Ip[32 i];
}
for (int j = 1; j < 16; j )//前15轮的操作
{
for (int k = 0; k < 32; k )
{
l[j][k] = r[j - 1][k];
}
F_func(r[j - 1], r[j], subkeys[16 - j],j);
Xor(r[j], l[j - 1], 32,j,1);
}
int t = 0;
for (t = 0; t < 32; t )//最后一轮的操作
{
r[16][t] = r[15][t];
}
F_func(r[15], l[16], subkeys[0],16);
Xor(l[16], l[15], 32,16,1);
for (t = 0; t < 32; t )
{
output_1[t] = l[16][t];
output_1[32 t] = r[16][t];
}
IP_In(output_1, output_2, IPR_Table);
BitToChar(output_2, output, 8);

};


标签: 加解密 DES ES 解密

实例下载地址

Des加解密

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警