首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32 的加密实现方法(2)

STM32 的加密实现方法(2)

//判断加密
bool JudgeEncrypt(void)* T6 ~  h& G9 R. _
{       1 L: ?( ?( y+ t6 G9 Q7 d
    uint32_t CpuID[4];      
    //获取CPU唯一的ID% S; d+ D* e' Q/ N; k1 n9 y: |0 w
    CpuID[0]=*(vu32*)(UID_BASE);- r3 v" y* e' U1 q
    CpuID[1]=*(vu32*)(UID_BASE+4);' x) W# s9 E* O; R% I
    CpuID[2]=*(vu32*)(UID_BASE+8);   
    //加密算法,很简单的加密算法; E  L0 \5 ]6 w" c% d2 Y4 F" T
    CpuID[3]=(CpuID[0]>>3)+(CpuID[1]>>1)+(CpuID[2]>>2);   / U! [3 r( Q9 ?& y, c5 s9 F# B
    //检查Flash中的UID是否合法 " n9 _' [& d, d; r% z
    return (CPUIDEncrypt == CpuID[3]);' a3 g) V' `) B
}
! e6 K& M2 ^' H/ o1 [! a
1、将写入加密数据和判断加密两个功能分开。写入加密在PrsCtrlTask开始的地方;而判断加密分布到程序的各个角落。  e3 V/ f  D2 v5 X) s# i8 V8 T0 t- t, |

2、非常重要的是CPUID加密值的定义一定要加“volatile”类型:
volatile const static uint32 CPUIDEncrypt = 0xFFFFFFFF;
否则按速度优化编译,在判断加密值,不会重新读取加密值,导致判断出错。
2 d5 g: a& @1 G" W' P& O. \9 E# t3 m  W/ P
" _% z' x  V0 L! _0 E2 Z
3、在工程选项Options->Debugger->Download中选择: use flash loader  d9 ^+ q( ?: Y+ T* k% n
否则主程序中对Flash编程将不成功。
继承事业,薪火相传
返回列表