参考来源:https://blog.csdn.net/lisonglisonglisong/article/details/41777413
- 调用DES分组密码源程序中的相关函数,设计一个文件加密器,可以加密任意长度的文件,并且密文文件可解密还原回原明文文件。
- DES分组密码算法流程:
(1)以下程序加密从桌面上的des_message.txt读入8个字符长度的明文,然后输出到桌面上的des_password.txt文件中,解密从后者输出到桌面上的des_p2m.txt文件中(由于加密后或解密失败后输出的字符为中文乱码,在Mac系统中无法正常打开,因此显示图标不一样)。
代码如下:/*提醒:代码很长*/
#include<iostream>
#include<fstream>
#include "memory.h"
#include "time.h"
#include "stdlib.h"
using namespace std;
#define PLAIN_FILE_OPEN_ERROR -1
#define CIPHER_FILE_OPEN_ERROR -2
#define OK 1
typedef char ElemType;
/* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *//* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
/*初始置换IP*第一步
int 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^-1*最后一步
int 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};
/* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *//* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
/* ***** ***** ***** ***** ***** 密码函数f所用到的表 ***** ***** ***** ***** ***** *//* ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
/*选择运算E*///扩展置换表,将32位扩展位48位
int 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};
/*置换运算P*///P置换,将32位变成32位//S盒输出的8*4=32位的置换//f函数的输出
int 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盒*///8个S盒,均为4*16的置换表,将6位转换为4位//第1位和第6位作为行,中间四位作为列,对应的数作为4位二进制数输出
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