|
发表于 2012-7-17 21:06:48
|
显示全部楼层
最近试了一下将楼主的加密方法放到STM8S103上,在程序里面读EEPROM的指定位置,然后读UID,算出一个值,比较,结果用STVP事先往EEPROM中写入预置的KEY时死活写不进去,写一个别的数据就写得进去,在别的地方写KEY也写得进去,难道EEPROM预知了我的KEY?下面详细说这个实例:
校验函数,开机调用:
- void Secure_Verify(void)
- {
- u8 Dat_buf[4];
- u32 temp,uidv;
- u32 id0,id1,id2;
-
- Read_UID();
- char_to_long(&id0, (UID_data+0));
- char_to_long(&id1, (UID_data+4));
- char_to_long(&id2, (UID_data+8));
- uidv = Encryption_win2kddk(SECURE_KEY,id0,id1,id2,0);
- EEPROM_Read(Dat_buf, SECURE_KEY_ADDR, 4);
- char_to_long(&temp, Dat_buf);
-
- if(temp == uidv)
- {
- return;
- }
- else if(temp == SECURE_KEY)
- {
- long_to_char(&uidv,Dat_buf);
- FLASH_DUKR = 0xae;//解除EEPEOM写保护
- FLASH_DUKR = 0x56;
-
- EEPROM_Write(Dat_buf, SECURE_KEY_ADDR, 4);
-
- return;
- }
- else
- {
- asm("sim"); // 关全局中断
- while(1);
- }
- }
复制代码 其中 Read_UID参考了Wanyou123的代码:- u8 UID_data[12];
- void Read_UID(void)
- {
- UID_data[0] = *(u8*)( STM8S_UID_ADDR + 0);
- UID_data[1] = *(u8*)( STM8S_UID_ADDR + 1);
- UID_data[2] = *(u8*)( STM8S_UID_ADDR + 2);
- UID_data[3] = *(u8*)( STM8S_UID_ADDR + 3);
- UID_data[4] = *(u8*)( STM8S_UID_ADDR + 4);
- UID_data[5] = *(u8*)( STM8S_UID_ADDR + 5);
- UID_data[6] = *(u8*)( STM8S_UID_ADDR + 6);
- UID_data[7] = *(u8*)( STM8S_UID_ADDR + 7);
- UID_data[8] = *(u8*)( STM8S_UID_ADDR + 8);
- UID_data[9] = *(u8*)( STM8S_UID_ADDR + 9);
- UID_data[10] = *(u8*)( STM8S_UID_ADDR + 10);
- UID_data[11] = *(u8*)( STM8S_UID_ADDR + 11);
- }
复制代码
其中SECURE_KEY和SECURE_KEY_ADDR的定义为:- //产品密钥
- #define SECURE_KEY 0x56789abc
- #define SECURE_KEY_ADDR 0x00
复制代码 SECURE_KEY_ADDR是以STM8S103的EEPROM的开始地址0x4000为基准的偏移量。
现在问题是:用STVP给STM8S103烧录EEPROM,在Flash中已经烧录了程序的情况下,往EEPROM中SECURE_KEY_ADDR位置写入SECURE_KEY,独独这个位置的这个值死活写不进去,其他位置写这个值、其他位置写其他值、这个位置写其他值,都能正常写进去,真是惊人!!!
修改SECURE_KEY和 SECURE_KEY_ADDR后问题依旧,这不是什么特殊值特殊地址。
在Flash为空的情况下,EEPROM正常,任何位置任何值都可以写。
现在在Flash为空的情况下,往EEPROM中SECURE_KEY_ADDR位置写入 SECURE_KEY,然后再烧Flash(用STVP仅烧Flash),烧完之后,再读EEPROM的SECURE_KEY_ADDR位置,已经不等于SECURE_KEY了,但是也不等于新计算出来的以上程序中的“uidv”,程序卡在“while(1);”。
编译器用的IAR for STM8 V1.3。
对了,有人说HEX中会有KEY的数值串,我找了一下,以我的SECURE_KEY=0x56789abc为例,在生成的HEX中没有发现连在一起的56789abc,但是5678连在一起,然后在不远处9abc连在一起。
|
|