keil调用python脚本实现对成的bin文件进行AES加密
起因
由于有些产品主控制器需要升级程序,升级程序的时候需要对bin文件进行加密,防止传输过程中消息被窃听。加密方式选择了AES。之前用QT写了加密程序和升级程序,
所以每次要先用keil生产bin文件,在对bin文件进行加密,然后在通过boot软件下载到单片机中,十分繁琐。所以为了解决这个不人性的繁琐的过程,写个脚本在编译后自动对bin
文件进行加密省去很繁琐的加密步骤。
过程
想法是挺好的,然鹅过程是崎岖的,python没用过所以属于现学现卖,AES加密过程有一堆例程这里不献丑了。核心思想就是运行脚本,查找当前文件夹下是否有bin文件,如果有则
载入bin文件,读取.ini中保存的配置文件中的aes key (这里面有个坑 )然后对程序进行加密,然后另存为一个新的加密文件。之后如果需要升级可以将加密后的文件发送个用户自行升级即
可。
问题
然后现实就是在你以为so easy嘛 ,实际是啪个耳光打来,问题就出现了,如下图所示。
将python脚本和bin文件放到一个文件夹下,aes.py为脚本。按照正常的套路keil编译完成后调用第一脚本生成bin文件,然后在调用第二个脚本生成加密文件。运行aes.bat没问题生成了加密
文件。如图所示。
这就尴尬了,没有找到bin文件,直接手动运行明明没有问题的,反复尝试多次多少这个结果,冷静下来开始一顿分析。
- python 脚本权限不够 手动点权限够 通过keil调用权限不够
- 系统对脚本有权限有限制
- 路径有问题
问题1
通过提高keil权限 执行脚本然而并没有什么用,还是找不到文件
问题2
通过将python脚本打包成exe文件 测试 结果还是手动运行没有问题,通过keil调用还是找不文件
问题3
因为python程序中使用的是相对路径,怀疑是这个问题,将读取的文件路径改成绝对路径,再次编译,奇迹出现了,没有报NO BIN FILE!然后在脚本目录中并没有出现加密后的文件
反复测试后还是没有报错,既然没有报错那就说明文件生产了,但是生成的目录有问题,所以使用了 Everything 小工具全局查找该文件。如下图所示。
居然找到了,生产的加密文件被保存到了工程目录下。
所以结论有了:
keil在调用脚本时,是把脚本加载到工程目录,然后在工厂目录中运行,而python程序中使用的是相对地址,工程目录下没有bin文件
所以导致了找不到bin文件错误。把bin文件的目录改成绝对地址后,生成的加密文件被保存到了工程目录下也印证了我的猜想。
重点:所以keil调用脚本都是以工程所在目录为参考目录
解决
问题知道了就好解决了,修改python程序,运行python程序时传入两个参数,一个是bin文件的相对目录,一个是生成的加密文件的相对目录,这样问题就完美解决了!