第0步:根据代码,引入问题

uint8_t read_tag( tagBufferType *tag)
|
|
uint8_t tag_read_data( tagBufferType *tag)
|
|
uint8_t tag_read_15693_data( tagBufferType *tag )
|
|
|
		log_arry(DEBUG,"Read data:" ,tag->buffer , 110);//之前长什么样子
		Decryptionr(tag->buffer,tag->UID,tag->buffer);//解密函数
		log_arry(DEBUG,"Decryptionr data:" ,tag->buffer , 110 );//之后长什么样子

CARD ID: :  [59 26 17 0A 8F 21 02 E0 ]

解密之前:

F6 56 21 33 9E 25 29 D3 10 09 F1 87 F5 1F 2F 23 75 D9 A2 E2 3E 38 F8 FE 09 0B 9C 30 61 01 32 95 94 11 0D E5 49 5C 86 62 14 F0 B4 5F D7 95 36 65 3E AD 8A 16 23 1E 48 DC 11 F8 33 D7 C1 3F 9D E6 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 B4 2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

解密以后:

00 2E BE 01 00 01 00 00 00 00 34 54 9A 4E 3E 4E 41 13 10 FC 99 06 01 74 5B 10 D5 DD 12 01 DD D1 FE 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 B4 2A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

 

void Decryptionr( unsigned char* SourceData, unsigned char *key,unsigned char* PurposeData)
{
  int i,j;
  unsigned char uckey64[8][8],ucMw[8][8];
  /*通过key[8]组合出一个[8][8]的 uckey64*/
  for(i=0;i<8;i++)  { uckey64[0][i]=*(key+i);    }
  for(i=0;i<8;i++)  { uckey64[1][i]=*(key+7-i); }
  for(i=0;i<7;i++)  { uckey64[2][i]=*(key+i+1); } uckey64[2][7]=*(key+0);
  for(i=0;i<6;i++)  { uckey64[3][i]=*(key+i+2); } for(i=0;i<2;i++)  { uckey64[3][6+i]=*(key+i); } 
  for(i=0;i<5;i++)  { uckey64[4][i]=*(key+i+3); } for(i=0;i<3;i++)  { uckey64[4][5+i]=*(key+i); }
  for(i=0;i<4;i++)  { uckey64[5][i]=*(key+i+4); } for(i=0;i<4;i++)  { uckey64[5][4+i]=*(key+i); }
  for(i=0;i<3;i++)  { uckey64[6][i]=*(key+i+5); } for(i=0;i<5;i++)  { uckey64[6][3+i]=*(key+i); }
  for(i=0;i<2;i++)  { uckey64[7][i]=*(key+i+6); } for(i=0;i<6;i++)  { uckey64[7][2+i]=*(key+i); }

/*把明文的64个字节拿出来放到二维数组*/
  for(j=0;j<8;j++) 
      for(i=0;i<8;i++)
	    ucMw[j][i]=SourceData[j*8+i];
      
 /*二维数组拿去加密解密*/ 
  for(j=0;j<8;j++)
  	DecryStr(ucMw[j],uckey64[j],ucMw[j]);
  
  /*二位数组的结果拿出来赋值给返回值*/
  for(j=0;j<8;j++)
      for(i=0;i<8;i++)
          PurposeData[j*8+i]=ucMw[j][i];
  
}

 

宗旨:传入一个报文(也就是读卡的100个成员的数组),一把钥匙(也就是UID),返回给我一个新的报文(解密之后的)

第一步1:钥匙[8]---->制作成[8][8]  也就是一把钥匙变成8把钥匙

第二步2:报文[64]--->制作成[8][8] 也就是前面64个成员参加解密 是报文的分块吧 ( 趴,贴过来。)

第三步3:分8次去解密,每次拿着第i把钥匙[8]和第i块信息[8]

第三步3.1:钥匙[8]---->制作成[8][8]     用到BitPMC

第三步3.2:信息[8] 和上面的[8][8]去解密 得到新的信息[8]   

第三步3.2:信息[8] 自己整理一下

第四步:解密结束[8][8]给返回值。    

 

 

 

++++++++++++++++++++++++下面是备用第二套测试数据+++++++++++++++++++++++++

之前

[26 4E 27 17 8F 45 27 DB 9D 8C A6 55 2A C3 CF A6 3D 8C 2E D6 3C 6B 2F 49 F9 D0 DE C6 0C E5 C2 E3 3C 1E 44 A5 0F 4C 9A 9F D4 EE 82 79 B3 A5 2F E7 BE A8 82 3A 23 1F 4C 56 C3 F0 01 EB 20 74 0D 86 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 96 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

之后

 [00 43 BE 01 00 01 00 00 00 00 9A 9F D1 91 4E 53 41 17 30 FC 99 04 28 8A F6 AF 15 EA 12 01 1A 50 42 10 22 19 90 01 22 60 51 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 96 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

CARD ID: :  [79 8E 17 0A 8F 21 02 E0 ]

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/81670068