准备工作:
#include <stdio.h>
typedef unsigned char uint8_t;
void show_arr(uint8_t *arr,int len)
{
int i=0;
while(i<len)
printf("%d\t",arr[i++] );
printf("\n");
}
简单:数据---异或一个数据变成新数据--再次异或那个数据就会打回原形
uint8_t encrypt(uint8_t *data, uint8_t cipherKey , uint8_t length)
{
for (int i = 0; i < length; i++)
{
data[i] = ((uint8_t) ((data[i] ^ cipherKey) & 0xff));
}
return 1;
}
.......
unsigned char arr[4]={1,2,3,4};
show_arr(arr,4);
encrypt(arr,0xAB,4);
show_arr(arr,4);
encrypt(arr,0xAB,4);
show_arr(arr,4);
上面可以说是一层加密,我们可以多层加密。比如你是data^A^B^C这样就加密了3层 你解密的时候就dat^C^B^A
uint8_t encryptCommand(uint8_t *command,uint8_t size, uint8_t *keyWord , uint8_t length)
{
for (int i = 0; i < length; i++)
{
encrypt(command, keyWord[i] , size);
}
return TRUE;
}
uint8_t decryptCommand(uint8_t *command,uint8_t size, uint8_t *keyWord , uint8_t length)
{
while(length--)
{
encrypt(command, keyWord[length],size);
}
return TRUE;
}
现在进阶,看看标准行业规范加密
void desData(unsigned char desMode,unsigned char* inData, unsigned char* outData,unsigned char (*subkey)[8])
{
int i;
int j=0;
if(desMode==0)//jiami
{
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)//jiemi
{
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];
}
}
第一个参数是模式0解密 1解密
第二个参数是input
第三个参数是output
第四个参数是二位数组也就是我们的秘钥
比如加密input的数据是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;
memset(outKey,0,sizeof(outKey));
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));
}
}
其实是输入一个3长度的数组,不变,给你一个8*8的二维数组。
这个3长度的数组其实是本地的秘钥,怎么算出来的?是在里面抛出了的,算法给平台一致就可以。
说道这里说一下:临时访客密码的设计
A:用户输入密码--单片机上传到平台--平台check是否合格--反馈给单片机结果(特斯联不做)
B:平台下发密码给单片机--保存到本地--用户输入验证--成功开门--本地删除临时密码(特斯联做法)
C:本地平台并不交换密码,都在跑同样的IO代码,in是北京时间(相差不多)out是密码,蜜汁好用,跟这个是一样。
单片机和平台的种子 in 3长度的密码是一样的 做的8*8的二位数组就是一样的 加密解密也就是一样的。