STM32的FLASH ID加密
#define FLASH_ID_OFFSET 30000 //任意定义一个数
//把地址直接减去或者加上一个数是不要程序中直接出现这个地址
volatile u32 Flash_ID_addr[3]={
0x1FFFF7E8 - FLASH_ID_OFFSET,
0x1FFFF7EC + FLASH_ID_OFFSET,
0x1FFFF7F0 - FLASH_ID_OFFSET
};
/**读取STM32 FLASH ID**/
void Flash_Read_ID(u32 *p)
{
u32 Addr;
//因为不想让程序在反汇编后直接找到这个地址,所以这个地址是运算出来
//的,跟STM_ID_addr反运算,当然也可以用其他高级算法,不能让编译器
//优化这个地址
Addr = Flash_ID_addr[0] + FLASH_ID_OFFSET;
p[0] = *(u32*)(Addr);
Addr = Flash_ID_addr[1] - FLASH_ID_OFFSET;
p[1] = *(u32*)(Addr);
Addr = Flash_ID_addr[2] + FLASH_ID_OFFSET;
p[2] = *(u32*)(Addr);
}
/*加密ID并保存*/
void Encrypted_ID(void)
{
u32 FlashID[3],data;
Flash_Read_ID(FlashID);
//这里可以用其他一些高级算法,但减和加要一样
data=(FlashID[0]|FlashID[1]|FlashID[2])&(~FlashID[1])|(~FlashID[2]);
FLASH_Unlock();
FLASH_ErasePage(FLSAH_EN_ID_START_ADDR);
FLASH_ProgramWord(FLSAH_EN_ID_START_ADDR,dat);//保存这个数
FLASH_Lock();
}
/*比较加密ID,正确返回0 不正确返回1*/
u32 CMP_Encrypted_ID(void)
{
u32 FlashID[3],data1,dat2;
Flash_Read_ID(FlashID);
//这里可以用其他高级算法,但减和加要一样
data1=(FlashID[0]|FlashID[1]|FlashID[2])&(~FlashID[1])|(~FlashID[2]);
data2 = *(u32*)(FLSAH_EN_ID_START_ADDR);
if(data1==data2) //相同
return 0;
else //不同
return 1;
}
//ID加密控制
if(CMP_Encrypted_ID())
{
//生产时给一些条件,条件满足就对ID加密,加密完后,也可以让它自宫
if(****)
{
Encrypted_ID();
.....
自宫
}
}
//校验ID是否正确
if(CMP_Encrypted_ID())
{
程序来到这里当然不正确了,不要让程序死在这里。一个系统肯定有
一些参数才能运行的,你可以改变一些参数,可以让系统有时正常有
时不正常。
}
STM32的FLASH ID加密的更多相关文章
- 关于STM32的FLASH操作【转载】
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置.芯片ID.自举程序等等.当然, FLASH还可以用来装数据. FLASH分 ...
- php利用32进制实现对id加密解密
前言 最近在项目中遇到一个问题,当前用户分享一个邀请码给好友,好友根据邀请码注册成为新用户之后,则成为当前用户的下级,特定条件下,可以得到下级用户的一系列返利.这里要实现的就是根据当前用户的id,生成 ...
- flash stm32的flash编写
定义一个全局变量数组:const u8 TEXT_Buffer[]={"STM32F103 FLASH TEST"}; //u8和char* 写入到内存里会有什么区别???? ...
- STM32全球唯一ID读取方法
产品唯一的身份标识非常适合:● 用来作为序列号(例如USB字符序列号或者其他的终端应用)● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性.● 用来激 ...
- STM32唯一的ID
请看如下程序: /*------------------------------------------------------------------------------------------ ...
- USB Mass Storage学习笔记-STM32+FLASH实现U盘
一.内容概述 采用STM32内部自带USB控制器外加大页NAND FLASH K9F1G08U0A实现一个128M的U盘. 1.STM32的USB控制器 STM32F103的MCU自带USB从控制器 ...
- STM32内部flash存储小数——别样的C语言技巧
今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...
- STM32的Flash
STM32中存储区分为:随机存取存储器RAM和只读存储器ROM. 其中: RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失. ROM为常说的硬 ...
- stm32的flash操作注意事项
从STM32编程手册中,可以知道:在进行写或擦除操作时,不能进行代码或数据的读取操作. 比如:你在写Flash期间有接收串口数据,很有可能会丢串口数据. 因为比较耗时,所以,在写数据时,CPU不会执行 ...
随机推荐
- CSS border-radius边框圆角
在CSS3中提供了对边框进行圆角设定的支持,可对边框1~4个角进行圆角样式设置. 目录 1. 介绍 2. value值的格式和类型 3. border-radius 1~4个参数说明 4. 在线示例 ...
- python对缩进的严格要求
一般的编辑器都会默认Tab键为四格缩进,但是在python脚本中,Tab与直接4个tablespace空格是有区别的. 一般表现为报错信息如下: IndentationError: unindent ...
- sqoop往远程hdfs写入数据时出现Permission denied 的问题
猜测出现该问题的原因是sqoop工具用的是执行sqoop工具所用的本地用户名. 如果远程hdfs用的用户是hdfs,那么我本地还需要建一个名为hdfs的用户? 其实不需要,只要为用户增加一个环境变量就 ...
- C++/JAVA/C#子类调用父类函数情况[留存]
时间久了就容易记不清了,特留存备用查看 c++ 1.构造函数调用 常用初始化列表 或者显示调用 1.1同一个类中构造函数调用构造函数 尽量不要这样做,因为结果不确定!避免麻烦(C++11增加 ...
- DX9 空间坐标变换示例代码
// @time 2012.3.25 // @author jadeshu #include <Windows.h> #include <d3d9.h> #include &l ...
- python base64加密文本内容(2)
上面一篇简单进行了base64加密 但安全系数非常低,只需要用网上的在线base64解码就能破解 这里我们可以自己修改一下base64加密后的字符串,在解码的时候只需要先提前将修改的内容还原就可以了 ...
- Python datetime获取详细时间
说明:datetime是date和time的结合体,包含了date和time的所有信息 datetime常见用法: 1.datetime.datetime.now()返回一个UTC时间的datetim ...
- django的母板和继承
Django模板中只需要记两种特殊符号: {{ }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 母板 <!DOCTYPE html> & ...
- 20165305 苏振龙《Java程序设计》第七周学习总结
第十一章 JDBC技术在数据库开发中占有很重要的地位,JDBC操作不同的数据库仅仅是连接方式上的差异而已,使用JDBC的应用程序一旦和数据库建立连接,就可以使用JDBC提供的API操作数据库. 当查询 ...
- Qt浅谈之一:内存泄露(总结)
一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Q ...