88 lines
3.1 KiB
C
88 lines
3.1 KiB
C
|
|
#include "Encryption.h"
|
||
|
|
|
||
|
|
//从机加密表
|
||
|
|
const unsigned char EPT_Table[32][6] = {
|
||
|
|
{1, 6, 4, 2, 3, 5}, {2, 4, 6, 3, 5, 1}, {3, 5, 6, 2, 1, 4}, {5, 3, 2, 1, 4, 6},
|
||
|
|
{4, 2, 3, 1, 5, 6}, {6, 3, 5, 1, 4, 2}, {3, 5, 2, 6, 4, 1}, {2, 5, 4, 3, 1, 6},
|
||
|
|
{2, 4, 1, 5, 3, 6}, {4, 6, 1, 3, 2, 5}, {4, 2, 1, 5, 6, 3}, {3, 2, 6, 5, 1, 4},
|
||
|
|
{2, 6, 5, 1, 4, 3}, {6, 4, 3, 1, 2, 5}, {1, 6, 3, 2, 4, 5}, {5, 3, 4, 6, 2, 1},
|
||
|
|
{5, 3, 1, 2, 6, 4}, {1, 4, 2, 6, 5, 3}, {3, 5, 2, 1, 4, 6}, {6, 1, 4, 2, 3, 5},
|
||
|
|
{4, 1, 2, 5, 3, 6}, {4, 2, 6, 3, 5, 1}, {2, 6, 1, 4, 3, 5}, {4, 3, 1, 5, 6, 2},
|
||
|
|
{5, 1, 2, 4, 6, 3}, {6, 5, 1, 3, 4, 2}, {2, 1, 6, 3, 5, 4}, {1, 5, 6, 3, 4, 2},
|
||
|
|
{3, 6, 5, 4, 2, 1}, {1, 2, 6, 3, 5, 4}, {4, 6, 5, 3, 2, 1}, {5, 3, 4, 2, 6, 1}
|
||
|
|
};
|
||
|
|
|
||
|
|
//从机解密表:
|
||
|
|
const unsigned char DPT_Table[32][5] ={
|
||
|
|
{1, 4, 2, 3, 5}, {2, 4, 3, 5, 1}, {3, 5, 2, 1, 4}, {5, 3, 2, 1, 4},
|
||
|
|
{4, 2, 3, 1, 5}, {3, 5, 1, 4, 2}, {3, 5, 2, 4, 1}, {2, 5, 4, 3, 1},
|
||
|
|
{2, 4, 1, 5, 3}, {4, 1, 3, 2, 5}, {4, 2, 1, 5, 3}, {3, 2, 5, 1, 4},
|
||
|
|
{2, 5, 1, 4, 3}, {4, 3, 1, 2, 5}, {1, 3, 2, 4, 5}, {5, 3, 4, 2, 1},
|
||
|
|
{5, 3, 1, 2, 4}, {1, 4, 2, 5, 3}, {3, 2, 1, 4, 5}, {1, 4, 5, 2, 3},
|
||
|
|
{4, 1, 2, 5, 3}, {4, 2, 3, 5, 1}, {2, 1, 4, 3, 5}, {4, 3, 1, 5, 2},
|
||
|
|
{5, 1, 2, 4, 3}, {5, 1, 3, 4, 2}, {2, 1, 3, 5, 4}, {1, 5, 3, 4, 2},
|
||
|
|
{3, 5, 4, 2, 1}, {1, 2, 3, 5, 4}, {4, 5, 3, 2, 1}, {5, 3, 4, 2, 1}
|
||
|
|
};
|
||
|
|
|
||
|
|
//数据位加密表:
|
||
|
|
const unsigned char EPT_D[32] = {
|
||
|
|
0x23, 0x4c, 0x92, 0x38, 0x52, 0xa4, 0x9a, 0x61,
|
||
|
|
0x86, 0xc8, 0x70, 0x16, 0x32, 0x58, 0x62, 0x83,
|
||
|
|
0xa5, 0x16, 0x1c, 0x49, 0x48, 0xc1, 0x8c, 0x91,
|
||
|
|
0xd0, 0x2c, 0x49, 0x42, 0xc1, 0x8c, 0x98, 0xd0
|
||
|
|
};
|
||
|
|
|
||
|
|
/****************************************************************/
|
||
|
|
/* 加密函数 */
|
||
|
|
/* */
|
||
|
|
/*函数入口: *data,未加密的普通协议数据 */
|
||
|
|
/* */
|
||
|
|
/*函数出口: *EPT_data,生成的加密协议 */
|
||
|
|
/****************************************************************/
|
||
|
|
void Encrypt_Code(unsigned char *data, unsigned char *EPT_data) {
|
||
|
|
unsigned char Edata[6];
|
||
|
|
unsigned char i = 0;
|
||
|
|
unsigned char check;
|
||
|
|
unsigned char ept_byte;
|
||
|
|
|
||
|
|
check = (data[0]+data[1]+data[2]+data[3]+data[4]+data[5]) % 0xff;
|
||
|
|
ept_byte = check % 32;
|
||
|
|
|
||
|
|
for (i = 0; i < 6; i++) {
|
||
|
|
Edata[i] = ((~(data[i] & EPT_D[ept_byte])) & EPT_D[ept_byte]) | (data[i] & (~EPT_D[ept_byte]));
|
||
|
|
}
|
||
|
|
|
||
|
|
for (i = 0; i < 6; i++) {
|
||
|
|
EPT_data[i] = Edata[EPT_Table[ept_byte][i]-1];
|
||
|
|
}
|
||
|
|
|
||
|
|
EPT_data[6] = ((~(check & 0xaa)) & 0xaa) | (check & 0x55);
|
||
|
|
}
|
||
|
|
|
||
|
|
/****************************************************************/
|
||
|
|
/* 解密函数 */
|
||
|
|
/* */
|
||
|
|
/*函数入口: *EPT_data,需要解密的加密协议 */
|
||
|
|
/* */
|
||
|
|
/*函数出口: *DPT_data,生成的普通协议 */
|
||
|
|
/****************************************************************/
|
||
|
|
void Decrypt_Code(unsigned char *EPT_data,unsigned char *DPT_data) {
|
||
|
|
unsigned char data[5];
|
||
|
|
unsigned char i = 0;
|
||
|
|
unsigned char check;
|
||
|
|
unsigned char ept_byte;
|
||
|
|
|
||
|
|
check = ((~(EPT_data[5]&0xaa))&0xaa)|(EPT_data[5]&0x55);
|
||
|
|
ept_byte = check % 32;
|
||
|
|
|
||
|
|
for(i=0;i<5;i++) {
|
||
|
|
data[i] = ((~(EPT_data[i]&EPT_D[ept_byte]))&EPT_D[ept_byte])|(EPT_data[i]&(~EPT_D[ept_byte]));
|
||
|
|
}
|
||
|
|
for(i=0;i<5;i++) {
|
||
|
|
DPT_data[DPT_Table[ept_byte][i]-1] = data[i];
|
||
|
|
}
|
||
|
|
DPT_data[5] = check;
|
||
|
|
}
|
||
|
|
|
||
|
|
|