突发奇想,自己做一个加密芯片,用51单片机做i2c从设备

本文介绍了一种基于STC12C5A60S2单片机的加密芯片设计,采用自定义的64位哈希算法进行数据加密,并通过I2C总线与主设备交互验证加密有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体代码:http://download.youkuaiyun.com/detail/dragon101788/5720453(20130708更新)

http://download.youkuaiyun.com/detail/dragon101788/5571493(旧代码)

研究i2c有一段时间了,这一次自己做了个加密芯片,硬件环境如要使用stc12c5a60s2单片机作为从设备,主设备使用ralink rt5350与6410测试通过。

主设备中使用标准i2c协议,也可以使用gpio模拟,不过通过测试stc12c5a60s2中如果i2c脉冲在10us的情况下从设备不是很稳定,我使用的脉冲为100us,相当稳定

主设备gpio模拟i2c请参阅:http://blog.youkuaiyun.com/dragon101788/article/details/9084031

加密部分我自己写的哈希算法,能够实现64位的哈希加密,主机先给从机发送8个字节的随机码,从机通过hash算法与key校验之后的数据再读出来与主机进行对比。

上位机加密部分代码为:

 

unsigned char  secret_key[8]={'1','9','8','8','1','0','1','7'};//为固定的key码,与下位机相同
unsigned char  random[8]={0};//随机码
void RSHash()//具体hash加密算法
{
 char i;
 unsigned char a=0;
 unsigned char hash=0;
 for(i = 0; i < 8; i++)
 {
  
  a = random[i]+hash;
  hash += a;
  random[i]=secret_key[hash%8]*hash;
 }
}  



int exmcu_verify()//与下位机通讯校验部分
{
	int ret;
	
	int i=0;

	//linux内核过去随机数
	get_random_bytes(random,8);
	//写入随机码
	gpio_i2c_write(0x17,0x51,random[0]);
	udelay(500);
	gpio_i2c_write(0x17,0x52,random[1]);
	udelay(500);
	gpio_i2c_write(0x17,0x53,random[2]);
	udelay(500);
	gpio_i2c_write(0x17,0x54,random[3]);
	udelay(500);
	gpio_i2c_write(0x17,0x55,random[4]);
	udelay(500);
	gpio_i2c_write(0x17,0x56,random[5]);
	udelay(500);
	gpio_i2c_write(0x17,0x57,random[6]);
	udelay(500);
	gpio_i2c_write(0x17,0x58,random[7]);
	udelay(500);
	gpio_i2c_write(0x17,0x50,1);
	mdelay(100);
	//上位机计算hash结果
	RSHash();

	ret = 0;
	for(i=0;i<8;i++)
	{//读取下位机hash结果
		if(gpio_i2c_read(0x17,0x51+i)!=random[i])
			ret = -1;
		//printk("%x=%x\r\n",i,random[i]);
		udelay(500);
	}
	//返回校验结果
	return ret;
//	ret = gpio_i2c_read(0x17,0x51);
//	printk("0x51=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x52);
//	printk("0x52=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x53);
//	printk("0x53=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x54);
//	printk("0x54=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x55);
//	printk("0x55=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x56);
//	printk("0x56=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x57);
//	printk("0x57=%x\r\n",ret);
//	ret = gpio_i2c_read(0x17,0x58);
//	printk("0x58=%x\r\n",ret);
}

使用飞思卡尔电机和s3010舵机,可以实现许多有趣的项目和创意。对于使用超声波控制舵机的程序,我在一个下午的时间里编写了以下代码。 首先,我导入了所需的库和模块。我使用了Arduino的软件和它的舵机库,这样可以简化编程过程并提供链式函数来控制舵机的角度。我还使用了超声波模块来测量距离。 然后,我初始化了舵机和超声波模块的引脚。我将超声波的Trig引脚连接到Arduino的数字引脚,将Echo引脚连接到Arduino的另一个数字引脚。我还将舵机的信号线连接到Arduino的数字引脚。 接下来,我编写了一个函数来测量超声波的距离。这个函数使用超声波模块发送一个短脉冲,然后通过计算返回超声波返回的时间与物体之间的距离。 然后,我编写了另一个函数来控制舵机的角度。这个函数接受一个角度作为参数,并将舵机旋转到相应的位置。 在主循环中,我使用超声波函数来测量到最近物体的距离。然后,如果距离小于某个阈值,我将调用舵机控制函数来旋转舵机到一定角度。这样,当有物体靠近时,舵机会自动旋转。 最后,我上传了代码到Arduino开发板,并将飞思卡尔电机和s3010舵机连接到正确的引脚。接下来,我打开了水龙头和超声波模块之间的距离。如果有物体靠近超声波模块,舵机会自动旋转到一定角度,打开水龙头。 这个程序可以通过多次试验和调整来优化,以达到准确控制舵机角度的目的。通过这个程序,我实现了使用超声波控制舵机的想法,并且能够自动打开水龙头,实现了更方便的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值