你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STMF1加密后的FLASH代码怎么运行?

[复制链接]
s40742360 提问时间:2015-8-25 13:14 /
代码加密后写入FLASH,CPU从FLASH读出的代码都是加密的,怎么运行呢?
收藏 评论17 发布时间:2015-8-25 13:14

举报

17个回答
adlu 回答时间:2015-8-27 09:55:30
ROP是Read Out Protection的缩写,字面意思就是读保护,属于我说的硬件加密方式。
我不知道你是怎么理解软件ID加密的。
我所说的ID加密方式,不是对FLASH中的指令代码进行加密,没有解密过程,只有验证ID的过程。
程序基本流程和不加密的程序相同,只是在上电后先调用一个自定义的验证ID的函数,假设名为checkID( )。
实现的方法是这样的:
1.将FALSH中某个地址,假设是0xABCD,作为ID校验密码的存放地址;
2.读取ID、读取0xABCD中的校验码;
3.将这两个参数作为checkID( )的输入参数,经过自己的加密算法计算后,如果两个参数匹配,则程序继续往下运行,否则,擦除FLASH的部分或全部内容,销毁程序。

当然需要由一个通用的ID校验码,假设为0x12345,当checkID( )检测到输入的校验码是0x1234,就使用芯片ID进行计算生成与ID匹配的校验码,再写到地址0xABCD中。在批量烧录的代码中,使用的是通用ID校验码,程序第一次运行时,会根据自己的ID更新校验码。这样,别人即使读到FLASH中的代码,也是不能在其他不同ID的芯片上运行的。

可在程序中间多个地方调用checkID( ),以防止反汇编轻易跳过加密代码。

理论上是没有一种加密方法是绝对不可破解的,只是增加破解难度。
同时使用硬件加密和软件加密可以使代码更加安全。

为了保护广大程序猿的劳动成果,以上方法欢迎转发,求扩散!!!
s40742360 回答时间:2015-8-27 15:42:57
本帖最后由 s40742360 于 2015-8-27 15:45 编辑
adlu 发表于 2015-8-27 09:55
ROP是Read Out Protection的缩写,字面意思就是读保护,属于我说的硬件加密方式。
我不知道你是怎么理解软 ...

你说的也是一个办法。
其实,软件加密的本质就是个函数:密文=f(明文, 密钥),或者密文=f(明文)。密文肯定是公开的,如果明文也是公开的,手头如果有足够的分析样本,那被破解的可能性就有了。如果代码还可以被跟踪,那基本就可以被完全破解了。这就成了软件加密的软肋,更关键的是破解成本不大。所以,软件加密还是暴露的信息越少越安全。

硬件解密的话,成本就高了,打磨芯片、拍照、分析可不是随便谁能做到的。
s40742360 回答时间:2015-8-26 18:10:47
本帖最后由 s40742360 于 2015-8-26 18:28 编辑
adlu 发表于 2015-8-26 17:47
加密的目的是不让别人获取程序代码,或者获取了也不能使用。
很少像你说的,把代码加密后存入FLASH,然后C ...

这种加密方法是我最近研究的一个产品里用的方法,它的FLASH内容可以读,只是读出来的是加密的代码,不能写到其它序列号的STM32中。也算是一个加密的方法吧。这个方法类似你说的软件ID加密。
你说的这个软件ID加密方法在解密时怎么办?如果不把代码放在RAM里,CPU取指的时候得知道这是加密的代码,还要负责解密。STM32好像不支持这个。

个人感觉STM32还是ROP更安全些。


JackieLaura 回答时间:2015-8-25 16:25:39
没加密过,等大拿来分享经验。。。
stmcu.org.png
心中月古 回答时间:2015-8-25 16:27:53
所谓代码加密后写入flah是怎么一个原理?
党国特派员 回答时间:2015-8-26 08:16:59
首先要有一段没有加密的解密程序来读取flash,解密后再运行。
党国特派员 回答时间:2015-8-26 08:21:49
你为什么不用stm32本身的加密功能,要自己去加密代码呢? null.png null1.png null2.png null3.png null4.png
你好我好大家好! 回答时间:2015-8-26 08:59:04
顶顶                              
s40742360 回答时间:2015-8-26 11:23:33
党国特派员 发表于 2015-8-26 08:21
你为什么不用stm32本身的加密功能,要自己去加密代码呢?

1. STM32本身的加密流程是怎样的?
我主要关心的是代码加密后写入FLASH,不是RDP那些。

2. 还有,你说的“解密后再运行”怎么实现?是把解密后的代码拷贝到RAM运行么?
这样的话,加密代码在链接的时候应该定位到RAM,对吗?
如果是的话,RAM只有64KB,如果解密的代码本身已很大,RAM不光要存放解密后的代码,还要负责堆、栈、变量,RAM很可能出现不够用的情况。

谢谢关注
党国特派员 回答时间:2015-8-26 12:51:40
针对你说的定位问题,在你编译的时候就已经定位。
比如 我的程序编译的时候就定位在在RAM里0x20001000处。解密的时候把解密后的程序直接放在RAM 的0x20001000处就可以了,因此也不存在定位问题。
RAM太小,你就加大RAM...
s40742360 回答时间:2015-8-26 13:05:37
党国特派员 发表于 2015-8-26 12:51
针对你说的定位问题,在你编译的时候就已经定位。
比如 我的程序编译的时候就定位在在RAM里0x20001000处。 ...

明白,感谢。

再问一下STM32本身的加密是怎样实现的?
比如有没有这样的方式:系统存储器的BootLoader在写FLASH的时候就使用硬件加密了,然后在取指后,硬件解密后CPU再执行?
adlu 回答时间:2015-8-26 17:47:31
代码加密后写入FLASH,CPU从FLASH读出的代码都是加密的,怎么运行呢?

加密的目的是不让别人获取程序代码,或者获取了也不能使用。
很少像你说的,把代码加密后存入FLASH,然后CPU读取FLASH解密再放到RAM中运行。

加密的基本方式又两种,一是硬件加密,二是软件加密。
硬件加密:一般是烧断熔丝,或者锁死FLASH(TI的FLASH型DSP用这种),目的都是防止别人读取程序代码。
软件加密:一般是ID加密,或者使用专用芯片加密。软件加密的程序,别人即使读到了FLASH中的代码,复制到其他板子上,也是不能正常工作的。
党国特派员 回答时间:2015-8-27 09:54:20
s40742360 发表于 2015-8-26 18:10
这种加密方法是我最近研究的一个产品里用的方法,它的FLASH内容可以读,只是读出来的是加密的代码,不能写 ...

肯定还有一部分解密的代码你没有读出来。
关键是要读出那段解密代码,解密代码是不会加密的。有可能是bootloader之类的东西。
s40742360 回答时间:2015-8-27 15:11:37
党国特派员 发表于 2015-8-27 09:54
肯定还有一部分解密的代码你没有读出来。
关键是要读出那段解密代码,解密代码是不会加密的。有可能是boo ...

看到那部分Boot代码了,8K代码量,正在头疼。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版