异或的加密

准备工作:

#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的二位数组就是一样的 加密解密也就是一样的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
AES(Advanced Encryption Standard)加密是一种对称加密算法,也是目前应用非常广泛的加密算法之一。它采用分组加密方式,将明文分为固定长度的数据块,并通过多轮的加密运算来进行加密。其核心运算包括字节替换、行移位、列混淆和轮密钥加等步骤,通过多轮运算来实现高强度的加密。 相比之下,异或加密是一种简单的位运算。异或运算是指对两个二进制数相同位置的位进行比较,若位相同则结果为0,若位不同则结果为1。异或加密是通过将明文与密钥进行异或运算得到密文的一种加密方式。由于异或运算具有逆运算的性质,所以可以通过再一次对密文与密钥进行异或运算,得到原始的明文。 相比而言,AES加密更加安全可靠。AES加密采用复杂的运算过程和密钥扩展机制,其安全性经过广泛的验证和应用。而异或加密相对简单,容易受到频率分析等攻击手段的威胁。异或加密的安全性依赖于密钥的安全性,对密钥的管理和保护要求较高。 因此,在实际应用中,为了保证数据的安全性,一般更倾向于选择使用AES加密。不过,异或加密在一些特殊情况下也可作为一种简单加密方式来使用,如在一些简单的防护算法、校验算法和简易数据加密等场景中。但需要注意的是,异或加密的安全性相对较低,不适用于对抗一些高级攻击手段的场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值