DES分组密码算法_加解密任意长度文件

该博客介绍了如何使用DES算法实现文件的加密和解密,通过调用相关函数处理任意长度的文件。文章详细阐述了DES算法的流程,包括初始和逆初始置换、扩展置换、P置换、S盒等步骤,并提供了C++实现的代码示例。此外,还演示了如何在Mac系统上进行文件加密和解密操作,以及遇到错误密钥时的解密结果(显示为乱码)。
摘要由CSDN通过智能技术生成

参考来源:https://blog.csdn.net/lisonglisonglisong/article/details/41777413


  1. 调用DES分组密码源程序中的相关函数,设计一个文件加密器,可以加密任意长度的文件,并且密文文件可解密还原回原明文文件。
  2. 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,

                   34, 5, 6, 7, 8,

                   78, 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*///8S盒,均为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值