DES分组加密算法C实现——解决加密长度任意的情况(有借鉴)

本文介绍了如何使用C语言实现DES分组加密算法,特别是针对明文长度大于等于32字节的情况。通过初始置换和逆置换两个步骤,将64位明文转换为64位密文。当明文长度任意时,通常采用低位补零的方式,分段进行加密。文章提供了一个经过修改的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先感谢原作者(虽然你的程序无法直接运行有错误……)

//
/* DES(Data Encryption Standard) /
/
Written by Bunny /
/
Banyet Soft Labs. 1999 /
/
ALL RIGHTS RESERVED! /
/
注意! 版权所有! 可以自由转载,但不得加以修改或删除! /
/
E-mail:Assassin@ynmail.com Http://Assassin.yeah.net */
/
/

好了就让我开始吧。。。
**

问题描述: 对于DES加密算法,实现对较长明文数据的加密,要求明文长度>=32字节。

**

先复习下DES:

有关DES

算法步骤

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1),其算法主要分为两步:
1)初始置换
其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位……依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50……D8;R0=D57D49……D7。
其置换规则见下表:
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
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,
2)逆置换
经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
此算法是对称加密算法体系中的代表,在计算机网络系统中广泛使用。
DES流程 感谢百度百科

我们知道,DES可直接加密64bit的明码,那么对于明码长度任意时,一般采取低位补零的方法,然后每64bit加密一次完成。
贴上我修改后的代码吧:
(改了一点点吧)

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include "Schedle.h"

char str1[8], str2[99999];
int temp = 0;

class CShift{
   
   
public:
	DWORDLONG mask[16];
	int step[16];
	CShift(){
   
   
		for(int i=0;i<16;i++){
   
   
			step[i]=2;
			mask[i]=0xc000000;
		}
		step[0]=step[1]=step[8]=step[15]=1;
		mask[0]=mask[1]=mask[8]=mask[15]=0x8000000;
	}
};

class CDES{
   
   

public:

	CDES(){
   
   
		m_dwlKey=0;
		m_dwlData=0;
		ConvertTableToMask(dwlKey_PC_1,64);
		//PrintTable(dwlKey_PC_1,7,8);
		ConvertTableToMask(dwlKey_PC_2,56);
		ConvertTableToMask(dwlData_IP,64);
		ConvertTableToMask(dwlData_Expansion,32);
		ConvertTableToMask(dwlData_FP,64);
		ConvertTableToMask(dwlData_P,32);
		Generate_S();

	}
	void PrintBit(DWORDLONG);
	void EncryptKey(char *);
	unsigned char* EncryptData(unsigned char *);
	unsigned char* DescryptData(unsigned char*);

private:
	void ConvertTableToMask(DWORDLONG *,int);
	void Generate_S(void);
	void PrintTable(DWORDLONG*,int,int);
	DWORDLONG ProcessByte(unsigned char*,BOOL);
	DWORDLONG PermuteTable(DWORDLONG,DWORDLONG*,int);
	void Generate_K(void);
	void EncryptKernel(void);
	DWORDLONG Generate_B(DWORDLONG,DWORDLONG*);
	/*For verify schedule permutation only*/
	DWORDLONG UnPermuteTable(DWORDLONG,DWORDLONG*,int); 
	/**************************************/
	DWORDLONG dwlData_S[9][4][16];
	CShift m_shift;
	DWORDLONG m_dwlKey;
	DWORDLONG m_dwlData;
	DWORDLONG m_dwl_K[17];
};		

void CDES::EncryptKey
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值