具体代码: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请参阅:http://blog.csdn.net/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);
}