加密方法说明
详细分析蓝牙第一个报文 length=68
串口收到数据:
34 43 43 31 31 36 36 41
41 36 43 44 46 33 45 39
38 46 36 39 35 35 42 36
30 36 46 33 30 33 38 45
34 38 34 42 31 34 43 34
44 37 32 36 36 36 43 44
30 30 23 23 23 23 33 32 34 38 33 33 31 35 34 37 0B 7C 7D 7E
解密以后数据:
08 01 0F 0A 0E 02 01 02
0F 09 07 06 04 04 01 0C
04 08 06 01 0A 09 0C 04
0C 01 02 03 04 05 06 01
02 03 04 05 06 01 00 02
06 02 00 02 01 00 01 08
30 30 23 23 23 23 33 32 34 38 33 33 31 35 34 37 0B 7C 7D 7E
前面48个是加密的 后面不参加解密
算法解读
第一部分:
来料两两组合48变成24
0x4C, 0xC1, 0x16, 0x6A, 0xA6, 0xCD, 0xF3, 0xE9
0x8F, 0x69, 0x55, 0xB6, 0x06, 0xF3, 0x03, 0x8E
0x48, 0x4B, 0x14, 0xC4, 0xD7, 0x26, 0x66, 0xCD
获得如上3个数组【8】依次去解密
第二部分:用匹配密码0X12 0X34 0X56 重复排列如下【8】位
key 准备 0x12,0x34,0x56,0x12,0x34,0x56,0x12,0x34
第三部算法:(demon.c包含加密和解密)
01 FA E2 12 F9 76 44 1C
48 61 A9 C4 C1 23 45 61
23 45 61 02 62 02 10 18
第四部
上面24个HEX分成48个string就来了
头尾分别是ID的高低位
00 01 0F 0A 0E 02 01 02
0F 09 07 06 04 04 01 0C
04 08 06 01 0A 09 0C 04
0C 01 02 03 04 05 06 01
02 03 04 05 06 01 00 02
06 02 00 02 01 00 01 08
解密结束
#include<stdio.h>
#include<string.h>
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
const unsigned char BitPMC[8][64]=//用于makeKey
{
{ 56, 0, 53, 29, 17, 44, 24, 8, 20, 23, 43, 16, 7, 46, 36, 57, 2, 19, 42, 35, 32, 15, 31, 26, 54, 60, 33, 9, 38, 11, 61, 30, 10, 47,
40, 5, 52, 25, 41, 27, 62, 63, 6, 58, 13, 21, 3, 28, 18, 49, 55, 59, 39, 51, 12, 37, 14, 1, 4, 34, 22, 45, 48, 50 },
{63, 10, 47, 58, 39, 38, 51, 42, 23, 54, 3, 21, 14, 55,49, 29, 37, 28, 56, 40, 61, 43, 60, 18, 16, 57, 26, 9, 30, 34,
11, 33, 1, 27, 53, 12, 36, 48, 52, 22, 46, 8, 45, 44, 59, 15, 5, 6, 13, 24, 35, 31, 2, 62, 41, 0, 4, 25, 50, 20, 7, 17, 32, 19 },
{8, 5, 46, 4, 39, 44, 63, 52, 2, 54, 56, 62, 21, 32, 50,48, 20, 22, 47, 57, 60, 37, 12, 34, 9, 41, 27, 11, 6, 18, 33, 14,
24, 31, 28, 55, 36, 23, 16, 40, 51, 25, 61, 43, 17, 3, 35, 53, 0, 7, 10, 58, 15, 1, 13, 19, 38, 45, 29, 42, 49, 26, 59, 30 },
{26, 52, 25, 7, 48, 49, 56, 30, 27, 11, 22, 47, 8, 16,40, 10, 9, 24, 50, 62, 57, 44, 34, 14, 4, 55, 59, 5, 39, 23, 17, 58, 12,
3, 63, 43, 6, 20, 51, 42, 45, 28, 31, 54, 53, 1, 41, 35, 13, 60, 21, 61, 19, 2, 46, 15, 36, 33, 18, 37, 0, 32, 38, 29 },
{ 42, 48, 16, 38, 41, 57, 53, 3, 52, 14, 61, 33, 26, 19, 32, 58, 10, 1, 9, 24, 43, 8, 15, 5, 56, 2, 40, 36, 7, 0, 17, 20, 45, 37, 6,
13, 25, 34, 11, 27, 30, 12, 63, 31, 28, 47, 4, 51, 62, 22, 55, 44, 29, 35, 59, 23, 46, 50, 39, 60, 49, 18, 21, 54 },
{ 51, 44, 45, 12, 10, 19, 9, 57, 53, 0, 49, 8, 29, 7, 22, 36, 13, 58, 35, 15, 50, 23, 59, 52, 63, 4, 30, 43, 26, 33, 42, 1, 14, 24,
55, 38, 5, 32, 48, 28, 21, 31, 17, 46, 41, 47, 60, 25, 20, 11, 61, 3, 6, 16, 2, 40, 39, 18, 62, 37, 34, 27, 56, 54 },
{ 19, 61, 20, 15, 0, 59, 60, 12, 10, 16, 35, 36, 34, 5, 27, 8, 43, 3, 54, 7, 57, 58, 26, 56, 13, 1, 23, 50, 11, 6, 25, 22, 31, 44,
62, 53, 14, 33, 39, 48, 52, 2, 40, 41, 29, 17, 18, 4, 47, 28, 63, 24, 9, 32, 21, 46, 49, 30, 38, 37, 51, 45, 42, 55 },
{ 33, 24, 29, 28, 30, 51, 20, 25, 0, 57, 22, 34, 13, 44, 31, 17, 49, 16, 18, 50, 4, 48, 5, 38, 41, 12, 63, 26, 55, 37, 52, 60, 27, 9,
21, 19, 45, 39, 54, 15, 53, 7, 43, 46, 62, 11, 14, 36, 56, 1, 10, 23, 42, 61, 8, 35, 40, 59, 47, 32, 2, 58, 6, 3 }
};
//准备秘钥 传入一个[8] 做好一个[8][8]
void makeKey(unsigned char* inKey,unsigned char outKey[][8])
{
unsigned char newData[8]={0,0,0,0,0,0,0,0};
int i,j,k;
for(i=0;i<8;i++)
{
for(j=0;j<64;j++)
{
if((inKey[BitPMC[i][j]>>3]&(1<<(7-(BitPMC[i][j]&7))))!=0)
newData[j>>3]=newData[j>>3]|(1<<(7-(j&7)));
}
for(k=0;k<8;k++)
outKey[i][k] = newData[k];
memset(newData,0,sizeof(newData));
}
}
//两用函数0加密1解密
//每次都是修改inData 最后赋值给outData作为返回
void desData(unsigned char desMode,unsigned char* inData, unsigned char* outData,unsigned char (*subkey)[8])
{
int i;
int j=0;
if(desMode==0)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
inData[j]=inData[j]^ subkey[i][j];
}
for(j=0;j<8;j++)
outData[j]=inData[j];
}
else if(desMode==1)
{
for(i=7;i>=0;i--)
for(j=0;j<8;j++)
inData[j]=inData[j]^ subkey[i][j];
for(j=0;j<8;j++)
outData[j]=inData[j];
}
}
//给下面一对函数用 一个初始化[8] 一个再把[8]返回
const unsigned char BitIP[64] =
{ 25, 17, 54, 33, 9, 38, 34, 1,
11, 48, 29, 56, 27, 50, 51, 40,
19, 58, 21, 5, 44, 31, 45, 7,
61, 47, 13, 57, 23, 15, 53, 46,
24, 16, 8, 39, 0, 26, 18, 10,
2, 49, 12, 4, 36, 30, 14, 6,
41, 59, 63, 22, 62, 32, 37, 42,
28, 20, 43, 52, 3, 35, 60, 55 };
//给下面一对函数用 一个初始化[8] 一个再把[8]返回
const unsigned char BitCP[64] =
{ 36, 7, 40, 60, 43, 19, 47, 23,
34, 4, 39, 8, 42, 26, 46, 29,
33, 1, 38, 16, 57, 18, 51, 28,
32, 0, 37, 12, 56, 10, 45, 21,
53, 3, 6, 61, 44, 54, 5, 35,
15, 48, 55, 58, 20, 22, 31, 25,
9, 41, 13, 14, 59, 30, 2, 63,
11, 27, 17, 49, 62, 24, 52, 50 };
void initPermutation(unsigned char* inData)
{
unsigned char newData[8]={0,0,0,0,0,0,0,0};
int i;
for(i=0;i<64;i++)
{
if((inData[BitIP[i]>>3]&(1<<(7-(BitIP[i]&7))))!=0)
newData[i>>3]=newData[i>>3]|(1<<(7-(i&7)));
}
for(i=0;i<8;i++)
{
inData[i]=newData[i];
}
}
void conversePermutation(unsigned char* inData)
{
unsigned char newData[8]={0,0,0,0,0,0,0,0};
int i;
for(i=0;i<64;i++)
{
if( ( inData[BitCP[i]>>3] & (1<<(7-(BitCP[i]&7))) )!=0 )
newData[i>>3]=newData[i>>3]|(1<<(7-(i&7)));
}
for(i=0;i<8;i++)
{
inData[i]=newData[i];
}
}
int main(void)
{
unsigned char presult[8];
unsigned char subkey[8][8];
int i,j;
uint8_t pwd[8]={ 0x12,0x34,0x56,0x12 ,0x34,0x56,0x12,0x34};
uint8_t msg[8]={ 0x48, 0x4B, 0x14, 0xC4, 0xD7, 0x26, 0x66, 0xCD};
printf("%s\n","MAKE-PWD\n" );
makeKey(pwd,subkey);
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{printf("%02X ",subkey[i][j]);if(j==7)printf("\n");}
//此后二维数组不变化//
printf("%s\n","desData\n" );
desData(1,msg,presult,subkey);
for(i=0;i<8;i++)
printf("%02X ",presult[i]); printf("\n");
printf("%s\n","conversePermutation\n" );
conversePermutation(presult);
for(i=0;i<8;i++)
printf("%02X ",presult[i]); printf("\n");
//解密结束//
printf("%s\n","initPermutation\n" );
initPermutation(presult);
for(i=0;i<8;i++)
printf("%02X ",presult[i]); printf("\n");
printf("%s\n","desData\n" );
desData(0,msg,presult,subkey);
for(i=0;i<8;i++)
printf("%02X ",presult[i]); printf("\n");
/加密结束
return 0;
}