3DES算法软件实现

3DES算法是DES(数据加密标准)加密算法的一种模式:使用3条56bit的密钥对数据进行三次加密。3DES加密算法是DES加密算法向AES(高级加密标准)加密算法一个过渡。

des.h

#ifndef __DES_H__
#define __DES_H__

#include <stdint.h>

void DES_DataEncrypt(const uint8_t *pUsingKey, uint8_t *pResult, const uint8_t *pSrcBuf, uint8_t aSrcLen);
void DES_DataDecrypt(const uint8_t *pUsingKey, uint8_t *pResult, const uint8_t *pSrcBuf, uint8_t aSrcLen);

#endif

des.c

#include "des.h"
#include <string.h>

uint8_t gDesSr[8];   
uint8_t gDesKey[8];  

uint8_t gS[8];
uint8_t gD[8];

uint8_t gS0;

static __inline void SetU32(uint8_t *buff, uint32_t data)
{
	buff[0] = (data >> 0) & 0xff;
	buff[1] = (data >> 8) & 0xff;
	buff[2] = (data >> 16) & 0xff;
	buff[3] = (data >> 24) & 0xff;
}

static __inline uint32_t GetU32(uint8_t *buff)
{
	uint32_t data = 0;

	data |= buff[0] << 0;
	data |= buff[1] << 8;
	data |= buff[2] << 16;
	data |= buff[3] << 24;

	return data;
}

void DES_pDesSL(void)
{
	uint8_t Temp;
	uint8_t B08[4];
	uint32_t B32;

	B08[3] = gDesKey[0];
	B08[2] = gDesKey[1];
	B08[1] = gDesKey[2];
	B08[0] = gDesKey[3] & 0xF0;
	
	B32 = GetU32(B08);
	B32 <<= 1;
	SetU32(B08, B32);

	Temp = B08[0] | ((gDesKey[0] & 0x80) >> 3);

	gDesKey[0] = B08[3];
	gDesKey[1] = B08[2];
	gDesKey[2] = B08[1];

	B08[3] = gDesKey[3];
	B08[2] = gDesKey[4];
	B08[1] = gDesKey[5];
	B08[0] = gDesKey[6];

	B32 = GetU32(B08);
	B32 <<= 1;
	SetU32(B08, B32);

	gDesKey[3] = Temp + (B08[3] & 0x0F);
	gDesKey[4] = B08[2];
	gDesKey[5] = B08[1];
	gDesKey[6] = B08[0] | ((B08[3] & 0x10) >> 4);
}

void DES_pDesSR(void)
{
	uint8_t Temp;
	uint8_t B08[4];
	uint32_t B32;

	B08[3] = gDesKey[0];
	B08[2] = gDesKey[1];
	B08[1] = gDesKey[2];
	B08[0] = gDesKey[3];

	B32 = GetU32(B08);
	B32 >>= 1;
	SetU32(B08, B32);

	Temp = B08[0] & 0xF0;

	gDesKey[0] = B08[3] | ((gDesKey[3] & 0x10) << 3);
	gDesKey[1] = B08[2];
	gDesKey[2] = B08[1];

	B08[3] = gDesKey[3] & 0x0F;
	B08[2] = gDesKey[4];
	B08[1] = gDesKey[5];
	B08[0] = gDesKey[6];

	B32 = GetU32(B08);
	B32 >>= 1;
	SetU32(B08, B32);

	gDesKey[3] = Temp + B08[3] | ((gDesKey[6] & 0x01) << 3);
	gDesKey[4] = B08[2];
	gDesKey[5] = B08[1];
	gDesKey[6] = B08[0];
}

void DES_pDesPc1(void)
{
	uint8_t m, n;

	memcpy(gS, gDesKey, 8);

	for (m = 0, n = 0x80; m<3; m++)
	{
		gS0 = 0x00;
		if (gS[7] & n) gS0 |= (0x1 << 7);
		if (gS[6] & n) gS0 |= (0x1 << 6);
		if (gS[5] & n) gS0 |= (0x1 << 5);
		if (gS[4] & n) gS0 |= (0x1 << 4);
		if (gS[3] & n) gS0 |= (0x1 << 3);
		if (gS[2] & n) gS0 |= (0x1 << 2);
		if (gS[1] & n) gS0 |= (0x1 << 1);
		if (gS[0] & n) gS0 |= (0x1 << 0);
		gD[m] = gS0;

		n >>= 1;
	}

	gS0 = 0x00;
	if (gS[7] & 0x10) gS0 |= (0x1 << 7);
	if (gS[6] & 0x10) gS0 |= (0x1 << 6);
	if (gS[5] & 0x10) gS0 |= (0x1 << 5);
	if (gS[4] & 0x10) gS0 |= (0x1 << 4);
	if (gS[7] & 0x02) gS0 |= (0x1 << 3);
	if (gS[6] & 0x02) gS0 |= (0x1 << 2);
	if (gS[5] & 0x02) gS0 |= (0x1 << 1);
	if (gS[4] & 0x02) gS0 |= (0x1 << 0);
	gD[3] = gS0;

	for (m = 4, n = 0x02; m<6; m++)
	{
		gS0 = 0x00;
		if (gS[3] & n) gS0 |= (0x1 << 7);
		if (gS[2] & n) gS0 |= (0x1 << 6);
		if (gS[1] & n) gS0 |= (0x1 << 5);
		if (gS[0] & n) gS0 |= (0x1 << 4);
		n <<= 1;
		if (gS[7] & n) gS0 |= (0x1 << 3);
		if (gS[6] & n) gS0 |= (0x1 << 2);
		if (gS[5] & n) gS0 |= (0x1 << 1);
		if (gS[4] & n) gS0 |= (0x1 << 0);
		gD[m] = gS0;
	}

	gS0 = 0x00;
	if (gS[3] & n) gS0 |= (0x1 << 7);
	if (gS[2] & n) gS0 |= (0x1 << 6);
	if (gS[1] & n) gS0 |= (0x1 << 5);
	if (gS[0] & n) gS0 |= (0x1 << 4);
	n <<= 1;
	if (gS[3] & n) gS0 |= (0x1 << 3);
	if (gS[2] & n) gS0 |= (0x1 << 2);
	if (gS[1] & n) gS0 |= (0x1 << 1);
	if (gS[0] & n) gS0 |= (0x1 << 0);
	gD[6] = gS0;

	memcpy(gDesKey, gD, 7);
}

void DES_pDesPc2(uint8_t* d)
{
	memcpy(gS, gDesKey, 7);

	gS0 = 0x00;
	if (gS[1] & 0x04) gS0 |= (0x1 << 7);
	if (gS[2] & 0x80) gS0 |= (0x1 << 6);
	if (gS[1] & 0x20) gS0 |= (0x1 << 5);
	if (gS[2] & 0x01) gS0 |= (0x1 << 4);
	if (gS[0] & 0x80) gS0 |= (0x1 << 3);
	if (gS[0] & 0x08) gS0 |= (0x1 << 2);
	if (gS[0] & 0x20) gS0 |= (0x1 << 1);
	if (gS[3] & 0x10) gS0 |= (0x1 << 0);
	gD[0] = gS0;

	gS0 = 0x00;
	if (gS[1] & 0x02) gS0 |= (0x1 << 7);
	if (gS[0] & 0x04) gS0 |= (0x1 << 6);
	if (gS[2] & 0x08) gS0 |= (0x1 << 5);
	if (gS[1] & 0x40) gS0 |= (0x1 << 4);
	if (gS[2] & 0x02) gS0 |= (0x1 << 3);
	if (gS[2] & 0x20) gS0 |= (0x1 << 2);
	if (gS[1] & 0x10) gS0 |= (0x1 << 1);
	if (gS[0] & 0x10) gS0 |= (0x1 << 0);
	gD[1] = gS0;

	gS0 = 0x00;
	if (gS[3] & 0x40) gS0 |= (0x1 << 7);
	if (gS[0] & 0x01) gS0 |= (0x1 << 6);
	if (gS[1] & 0x01) gS0 |= (0x1 << 5);
	if (gS[0] & 0x02) gS0 |= (0x1 << 4);
	if (gS[3] & 0x20) gS0 |= (0x1 << 3);
	if (gS[2] & 0x10) gS0 |= (0x1 << 2);
	if (gS[1] & 0x08) gS0 |= (0x1 << 1);
	if (gS[0] & 0x40) gS0 |= (0x1 << 0);
	gD[2] = gS0;

	gS0 = 0x00;
	if (gS[5] & 0x80) gS0 |= (0x1 << 7);
	if (gS[6] & 0x10) gS0 |= (0x1 << 6);
	if (gS[3] & 0x02) gS0 |= (0x1 << 5);
	if (gS[4] & 0x08) gS0 |= (0x1 << 4);
	if (gS[5] & 0x02) gS0 |= (0x1 << 3);
	if (gS[6] & 0x02) gS0 |= (0x1 << 2);
	if (gS[3] & 0x04) gS0 |= (0x1 << 1);
	if (gS[4] & 0x01) gS0 |= (0x1 << 0);
	gD[3] = gS0;

	gS0 = 0x00;
	if (gS[6] & 0x20) gS0 |= (0x1 << 7);
	if (gS[5] & 0x08) gS0 |= (0x1 << 6);
	if (gS[4] & 0x80) gS0 |= (0x1 << 5);
	if (gS[5] & 0x01) gS0 |= (0x1 << 4);
	if (gS[5] & 0x10) gS0 |= (0x1 << 3);
	if (gS[6] & 0x80) gS0 |= (0x1 << 2);
	if (gS[4] & 0x02) gS0 |= (0x1 << 1);
	if (gS[6] & 0x01) gS0 |= (0x1 << 0);
	gD[4] = gS0;

	gS0 = 0x00;
	if (gS[4] & 0x40) gS0 |= (0x1 << 7);
	if (gS[6] & 0x08) gS0 |= (0x1 << 6);
	if (gS[5] & 0x04) gS0 |= (0x1 << 5);
	if (gS[5] & 0x40) gS0 |= (0x1 << 4);
	if (gS[6] & 0x40) gS0 |= (0x1 << 3);
	if (gS[4] & 0x10) gS0 |= (0x1 << 2);
	if (gS[3] & 0x08) gS0 |= (0x1 << 1);
	if (gS[3] & 0x01) gS0 |= (0x1 << 0);
	gD[5] = gS0;

	memcpy(d, gD, 6);
}


void DES_pDesIp(void)
{
	uint8_t m, n;

	memcpy(gS, gDesSr, 8);

	for (m = 0, n = 0x40; m<8; m++)
	{
		if (m == 4) n = 0x80;

		gS0 = 0x00;
		if (gS[7] & n) gS0 |= (0x1 << 7);
		if (gS[6] & n) gS0 |= (0x1 << 6);
		if (gS[5] & n) gS0 |= (0x1 << 5);
		if (gS[4] & n) gS0 |= (0x1 << 4);
		if (gS[3] & n) gS0 |= (0x1 << 3);
		if (gS[2] & n) gS0 |= (0x1 << 2);
		if (gS[1] & n) gS0 |= (0x1 << 1);
		if (gS[0] & n) gS0 |= (0x1 << 0);
		gD[m] = gS0;

		n >>= 2;
	}

	memcpy(gDesSr, gD, 8);
}

void DES_pDesIip(void)
{
	uint8_t m, n;

	gS[4] = gDesSr[0];
	gS[5] = gDesSr[1];
	gS[6] = gDesSr[2];
	gS[7] = gDesSr[3];
	gS[0] = gDesSr[4];
	gS[1] = gDesSr[5];
	gS[2] = gDesSr[6];
	gS[3] = gDesSr[7];

	for (m = 0, n = 1; m<8; m++)
	{
		gS0 = 0x00;
		if (gS[4] & n) gS0 |= (0x1 << 7);
		if (gS[0] & n) gS0 |= (0x1 << 6);
		if (gS[5] & n) gS0 |= (0x1 << 5);
		if (gS[1] & n) gS0 |= (0x1 << 4);
		if (gS[6] & n) gS0 |= (0x1 << 3);
		if (gS[2] & n) gS0 |= (0x1 << 2);
		if (gS[7] & n) gS0 |= (0x1 << 1);
		if (gS[3] & n) gS0 |= (0x1 << 0);
		gD[m] = gS0;

		n <<= 1;
	}

	memcpy(gDesSr, gD, 8);
}

void DES_pDesE(void)
{
	gS0 = 0x00;
	if (gS[3] & 0x01) gS0 |= (0x1 << 7);
	if (gS[0] & 0x80) gS0 |= (0x1 << 6);
	if (gS[0] & 0x40) gS0 |= (0x1 << 5);
	if (gS[0] & 0x20) gS0 |= (0x1 << 4);
	if (gS[0] & 0x10) gS0 |= (0x1 << 3);
	if (gS[0] & 0x08) gS0 |= (0x1 << 2);
	if (gS[0] & 0x10) gS0 |= (0x1 << 1);
	if (gS[0] & 0x08) gS0 |= (0x1 << 0);
	gD[0] = gS0;

	gS0 = 0x00;
	if (gS[0] & 0x04) gS0 |= (0x1 << 7);
	if (gS[0] & 0x02) gS0 |= (0x1 << 6);
	if (gS[0] & 0x01) gS0 |= (0x1 << 5);
	if (gS[1] & 0x80) gS0 |= (0x1 << 4);
	if (gS[0] & 0x01) gS0 |= (0x1 << 3);
	if (gS[1] & 0x80) gS0 |= (0x1 << 2);
	if (gS[1] & 0x40) gS0 |= (0x1 << 1);
	if (gS[1] & 0x20) gS0 |= (0x1 << 0);
	gD[1] = gS0;

	gS0 = 0x00;
	if (gS[1] & 0x10) gS0 |= (0x1 << 7);
	if (gS[1] & 0x08) gS0 |= (0x1 << 6);
	if (gS[1] & 0x10) gS0 |= (0x1 << 5);
	if (gS[1] & 0x08) gS0 |= (0x1 << 4);
	if (gS[1] & 0x04) gS0 |= (0x1 << 3);
	if (gS[1] & 0x02) gS0 |= (0x1 << 2);
	if (gS[1] & 0x01) gS0 |= (0x1 << 1);
	if (gS[2] & 0x80) gS0 |= (0x1 << 0);
	gD[2] = gS0;

	gS0 = 0x00;
	if (gS[1] & 0x01) gS0 |= (0x1 << 7);
	if (gS[2] & 0x80) gS0 |= (0x1 << 6);
	if (gS[2] & 0x40) gS0 |= (0x1 << 5);
	if (gS[2] & 0x20) gS0 |= (0x1 << 4);
	if (gS[2] & 0x10) gS0 |= (0x1 << 3);
	if (gS[2] & 0x08) gS0 |= (0x1 << 2);
	if (gS[2] & 0x10) gS0 |= (0x1 << 1);
	if (gS[2] & 0x08) gS0 |= (0x1 << 0);
	gD[3] = gS0;

	gS0 = 0x00;
	if (gS[2] & 0x04) gS0 |= (0x1 << 7);
	if (gS[2] & 0x02) gS0 |= (0x1 << 6);
	if (gS[2] & 0x01) gS0 |= (0x1 << 5);
	if (gS[3] & 0x80) gS0 |= (0x1 << 4);
	if (gS[2] & 0x01) gS0 |= (0x1 << 3);
	if (gS[3] & 0x80) gS0 |= (0x1 << 2);
	if (gS[3] & 0x40) gS0 |= (0x1 << 1);
	if (gS[3] & 0x20) gS0 |= (0x1 << 0);
	gD[4] = gS0;

	gS0 = 0x00;
	if (gS[3] & 0x10) gS0 |= (0x1 << 7);
	if (gS[3] & 0x08) gS0 |= (0x1 << 6);
	if (gS[3] & 0x10) gS0 |= (0x1 << 5);
	if (gS[3] & 0x08) gS0 |= (0x1 << 4);
	if (gS[3] & 0x04) gS0 |= (0x1 << 3);
	if (gS[3] & 0x02) gS0 |= (0x1 << 2);
	if (gS[3] & 0x01) gS0 |= (0x1 << 1);
	if (gS[0] & 0x80) gS0 |= (0x1 << 0);
	gD[5] = gS0;
}

void DES_pDesP(void)
{
	gS0 = 0x00;
	if (gS[1] & 0x01) gS0 |= (0x1 << 7);
	if (gS[0] & 0x02) gS0 |= (0x1 << 6);
	if (gS[2] & 0x10) gS0 |= (0x1 << 5);
	if (gS[2] & 0x08) gS0 |= (0x1 << 4);
	if (gS[3] & 0x08) gS0 |= (0x1 << 3);
	if (gS[1] & 0x10) gS0 |= (0x1 << 2);
	if (gS[3] & 0x10) gS0 |= (0x1 << 1);
	if (gS[2] & 0x80) gS0 |= (0x1 << 0);
	gD[0] = gS0;

	gS0 = 0x00;
	if (gS[0] & 0x80) gS0 |= (0x1 << 7);
	if (gS[1] & 0x02) gS0 |= (0x1 << 6);
	if (gS[2] & 0x02) gS0 |= (0x1 << 5);
	if (gS[3] & 0x40) gS0 |= (0x1 << 4);
	if (gS[0] & 0x08) gS0 |= (0x1 << 3);
	if (gS[2] & 0x40) gS0 |= (0x1 << 2);
	if (gS[3] & 0x02) gS0 |= (0x1 << 1);
	if (gS[1] & 0x40) gS0 |= (0x1 << 0);
	gD[1] = gS0;

	gS0 = 0x00;
	if (gS[0] & 0x40) gS0 |= (0x1 << 7);
	if (gS[0] & 0x01) gS0 |= (0x1 << 6);
	if (gS[2] & 0x01) gS0 |= (0x1 << 5);
	if (gS[1] & 0x04) gS0 |= (0x1 << 4);
	if (gS[3] & 0x01) gS0 |= (0x1 << 3);
	if (gS[3] & 0x20) gS0 |= (0x1 << 2);
	if (gS[0] & 0x20) gS0 |= (0x1 << 1);
	if (gS[1] & 0x80) gS0 |= (0x1 << 0);
	gD[2] = gS0;

	gS0 = 0x00;
	if (gS[2] & 0x20) gS0 |= (0x1 << 7);
	if (gS[1] & 0x08) gS0 |= (0x1 << 6);
	if (gS[3] & 0x04) gS0 |= (0x1 << 5);
	if (gS[0] & 0x04) gS0 |= (0x1 << 4);
	if (gS[2] & 0x04) gS0 |= (0x1 << 3);
	if (gS[1] & 0x20) gS0 |= (0x1 << 2);
	if (gS[0] & 0x10) gS0 |= (0x1 << 1);
	if (gS[3] & 0x80) gS0 |= (0x1 << 0);
	gD[3] = gS0;
}

const uint8_t gTabS1[64] = {
	0xe0, 0x00, 0x40, 0xf0, 0xd0, 0x70, 0x10, 0x40,
	0x20, 0xe0, 0xf0, 0x20, 0xb0, 0xd0, 0x80, 0x10,
	0x30, 0xa0, 0xa0, 0x60, 0x60, 0xc0, 0xc0, 0xb0,
	0x50, 0x90, 0x90, 0x50, 0x00, 0x30, 0x70, 0x80,
	0x40, 0xf0, 0x10, 0xc0, 0xe0, 0x80, 0x80, 0x20,
	0xd0, 0x40, 0x60, 0x90, 0x20, 0x10, 0xb0, 0x70,
	0xf0, 0x50, 0xc0, 0xb0, 0x90, 0x30, 0x70, 0xe0,
	0x30, 0xa0, 0xa0, 0x00, 0x50, 0x60, 0x00, 0xd0
};

const uint8_t gTabS2[64] = {
	15, 3, 1, 13, 8, 4, 14, 7,
	6, 15, 11, 2, 3, 8, 4, 14,
	9, 12, 7, 0, 2, 1, 13, 10,
	12, 6, 0, 9, 5, 11, 10, 5,
	0, 13, 14, 8, 7, 10, 11, 1,
	10, 3, 4, 15, 13, 4, 1, 2,
	5, 11, 8, 6, 12, 7, 6, 12,
	9, 0, 3, 5, 2, 14, 15, 9
};

const uint8_t gTabS3[64] = {
	0xa0, 0xd0, 0x00, 0x70, 0x90, 0x00, 0xe0, 0x90,
	0x60, 0x30, 0x30, 0x40, 0xf0, 0x60, 0x50, 0xa0,
	0x10, 0x20, 0xd0, 0x80, 0xc0, 0x50, 0x70, 0xe0,
	0xb0, 0xc0, 0x40, 0xb0, 0x20, 0xf0, 0x80, 0x10,
	0xd0, 0x10, 0x60, 0xa0, 0x40, 0xd0, 0x90, 0x00,
	0x80, 0x60, 0xf0, 0x90, 0x30, 0x80, 0x00, 0x70,
	0xb0, 0x40, 0x10, 0xf0, 0x20, 0xe0, 0xc0, 0x30,
	0x50, 0xb0, 0xa0, 0x50, 0xe0, 0x20, 0x70, 0xc0
};

const uint8_t gTabS4[64] = {
	7, 13, 13, 8, 14, 11, 3, 5,
	0, 6, 6, 15, 9, 0, 10, 3,
	1, 4, 2, 7, 8, 2, 5, 12,
	11, 1, 12, 10, 4, 14, 15, 9,
	10, 3, 6, 15, 9, 0, 0, 6,
	12, 10, 11, 1, 7, 13, 13, 8,
	15, 9, 1, 4, 3, 5, 14, 11,
	5, 12, 2, 7, 8, 2, 4, 14
};

const uint8_t gTabS5[64] = {
	0x20, 0xe0, 0xc0, 0xb0, 0x40, 0x20, 0x10, 0xc0,
	0x70, 0x40, 0xa0, 0x70, 0xb0, 0xd0, 0x60, 0x10,
	0x80, 0x50, 0x50, 0x00, 0x30, 0xf0, 0xf0, 0xa0,
	0xd0, 0x30, 0x00, 0x90, 0xe0, 0x80, 0x90, 0x60,
	0x40, 0xb0, 0x20, 0x80, 0x10, 0xc0, 0xb0, 0x70,
	0xa0, 0x10, 0xd0, 0xe0, 0x70, 0x20, 0x80, 0xd0,
	0xf0, 0x60, 0x90, 0xf0, 0xc0, 0x00, 0x50, 0x90,
	0x60, 0xa0, 0x30, 0x40, 0x00, 0x50, 0xe0, 0x30
};


const uint8_t gTabS6[64] = {
	12, 10, 1, 15, 10, 4, 15, 2,
	9, 7, 2, 12, 6, 9, 8, 5,
	0, 6, 13, 1, 3, 13, 4, 14,
	14, 0, 7, 11, 5, 3, 11, 8,
	9, 4, 14, 3, 15, 2, 5, 12,
	2, 9, 8, 5, 12, 15, 3, 10,
	7, 11, 0, 14, 4, 1, 10, 7,
	1, 6, 13, 0, 11, 8, 6, 13
};

const uint8_t gTabS7[64] = {
	0x40, 0xd0, 0xb0, 0x00, 0x20, 0xb0, 0xe0, 0x70,
	0xf0, 0x40, 0x00, 0x90, 0x80, 0x10, 0xd0, 0xa0,
	0x30, 0xe0, 0xc0, 0x30, 0x90, 0x50, 0x70, 0xc0,
	0x50, 0x20, 0xa0, 0xf0, 0x60, 0x80, 0x10, 0x60,
	0x10, 0x60, 0x40, 0xb0, 0xb0, 0xd0, 0xd0, 0x80,
	0xc0, 0x10, 0x30, 0x40, 0x70, 0xa0, 0xe0, 0x70,
	0xa0, 0x90, 0xf0, 0x50, 0x60, 0x00, 0x80, 0xf0,
	0x00, 0xe0, 0x50, 0x20, 0x90, 0x30, 0x20, 0xc0
};

const uint8_t gTabS8[64] = {
	13, 1, 2, 15, 8, 13, 4, 8,
	6, 10, 15, 3, 11, 7, 1, 4,
	10, 12, 9, 5, 3, 6, 14, 11,
	5, 0, 0, 14, 12, 9, 7, 2,
	7, 2, 11, 1, 4, 14, 1, 7,
	9, 4, 12, 10, 14, 8, 2, 13,
	0, 15, 6, 12, 10, 9, 13, 0,
	15, 3, 3, 5, 5, 6, 8, 11
};


void DES_pDesS(void)
{
	gS0 = gD[1] >> 4;
	if (gD[0] & 0x02) gS0 |= (0x1 << 5); else gS0 &= ~(0x1 << 5);
	if (gD[0] & 0x01) gS0 |= (0x1 << 4); else gS0 &= ~(0x1 << 4);
	gS[0] = gTabS1[gD[0] >> 2] | gTabS2[gS0];

	gS0 = gD[1] << 2;
	gS0 &= 0x3f;
	if (gD[2] & 0x80) gS0 |= (0x1 << 1); else gS0 &= ~(0x1 << 1);
	if (gD[2] & 0x40) gS0 |= (0x1 << 0); else gS0 &= ~(0x1 << 0);
	gS[1] = gTabS3[gS0] | gTabS4[gD[2] & 0x3f];

	gS0 = gD[4] >> 4;
	if (gD[3] & 0x02) gS0 |= (0x1 << 5); else gS0 &= ~(0x1 << 5);
	if (gD[3] & 0x01) gS0 |= (0x1 << 4); else gS0 &= ~(0x1 << 4);
	gS[2] = gTabS5[gD[3] >> 2] | gTabS6[gS0];

	gS0 = gD[4] << 2;
	gS0 &= 0x3f;
	if (gD[5] & 0x80) gS0 |= (0x1 << 1); else gS0 &= ~(0x1 << 1);
	if (gD[5] & 0x40) gS0 |= (0x1 << 0); else gS0 &= ~(0x1 << 0);
	gS[3] = gTabS7[gS0] | gTabS8[gD[5] & 0x3f];
}

void DES_pDesF(char* k)
{
	gS[0] = gDesSr[4];
	gS[1] = gDesSr[5];
	gS[2] = gDesSr[6];
	gS[3] = gDesSr[7];

	DES_pDesE();
	gD[0] ^= k[0];
	gD[1] ^= k[1];
	gD[2] ^= k[2];
	gD[3] ^= k[3];
	gD[4] ^= k[4];
	gD[5] ^= k[5];
	DES_pDesS();
	DES_pDesP();

	gS0 = gDesSr[4];
	gDesSr[4] = gD[0] ^ gDesSr[0];
	gDesSr[0] = gS0;

	gS0 = gDesSr[5];
	gDesSr[5] = gD[1] ^ gDesSr[1];
	gDesSr[1] = gS0;

	gS0 = gDesSr[6];
	gDesSr[6] = gD[2] ^ gDesSr[2];
	gDesSr[2] = gS0;

	gS0 = gDesSr[7];
	gDesSr[7] = gD[3] ^ gDesSr[3];
	gDesSr[3] = gS0;
}


void DES_pDesEn(void)
{
	uint8_t key[6];

	DES_pDesIp();
	/*gDesSr*/

	DES_pDesPc1();
	/*gDesSr*/

	/*cycle 1*/
	DES_pDesSL();        
	DES_pDesPc2(key);    
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 2*/
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 3*/
	DES_pDesSL();        
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 4*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 5*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 6*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 7*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 8*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 9*/
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 10*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 11*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 12*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 13*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 14*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 15*/
	DES_pDesSL();
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	/*cycle 16*/
	DES_pDesSL();
	DES_pDesPc2(key);
	DES_pDesF(key);
	/*gDesSr*/

	DES_pDesIip();
	/*gDesSr*/
	return;
}

void DES_pDesDe(void)
{
	uint8_t key[6];

	DES_pDesIp();

	DES_pDesPc1();

	/*cycle 1*/
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 2*/
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 3*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 4*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 5*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 6*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 7*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 8*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 9*/
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 10*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 11*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 12*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 13*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 14*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 15*/
	DES_pDesSR();
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	/*cycle 16*/
	DES_pDesSR();
	DES_pDesPc2(key);
	DES_pDesF(key);

	DES_pDesIip();

	return;
}

void DES_DataEncrypt(const uint8_t *pUsingKey, uint8_t *pResult, const uint8_t *pSrcBuf, uint8_t aSrcLen)
{
	uint8_t i, count;
	
	count = aSrcLen / 8;

	for (i = 0; i < count; i++)
	{
		memcpy(gDesSr, pSrcBuf + i * 8, 8);          

		memcpy(gDesKey, pUsingKey, 8);               
		DES_pDesEn();

		memcpy(gDesKey, pUsingKey + 8, 8);           
		DES_pDesDe();

		memcpy(gDesKey, pUsingKey, 8);               
		DES_pDesEn();

		memcpy(pResult + 8 * i, gDesSr, 8);          
	}
}

void DES_DataDecrypt(const uint8_t *pUsingKey, uint8_t *pResult, const uint8_t *pSrcBuf, uint8_t aSrcLen)
{
	uint8_t i, count;

	count = aSrcLen / 8;

	for (i = 0; i < count; i++)
	{
		memcpy(gDesSr, pSrcBuf + i * 8, 8); 

		memcpy(gDesKey, pUsingKey, 8);      
		DES_pDesDe();

		memcpy(gDesKey, pUsingKey + 8, 8);  
		DES_pDesEn();

		memcpy(gDesKey, pUsingKey, 8);      
		DES_pDesDe();

		memcpy(pResult + 8 * i, gDesSr, 8); 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

long7066

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值