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