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);
}
}