您的位置:首页 > 其它

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

2013-06-13 12:13 337 查看
具体代码:http://download.csdn.net/detail/dragon101788/5720453(20130708更新)

http://download.csdn.net/detail/dragon101788/5571493(旧代码)

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

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

主设备gpio模拟i2c请参阅:/article/2720731.html

加密部分我自己写的哈希算法,能够实现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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: