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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版