加密解密部分-蓝牙第一步

加密方法说明
详细分析蓝牙第一个报文 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;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值