Encrypted bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。
在上一个博客随笔,我介绍了为PIC16,PIC18, PIC24/dsPIC, PIC32的学习板或最小系统板做的Xmodem bootloader。今天给大家介绍在我的Xmodem bootloader 的基础上开发的Encrypted bootloader。今年的国庆节,我哪都没去,就宅在家里把Encrypted bootloader完成。虽然我叫它Encrypted bootloader, 实际上加密(encrypted)的是应用程序BIN文件,加密过的BIN文件传送给单片机,单片机的boot程序先(decrypting)解密然后烧写数据到单片机ROM的对应的地址上。所以整个Encrypted bootloader工程分为两部分,一部分是PC端的工程,完成将Hex文件转换为BIN文件, 然后将BIN文件加密生成.ecd文件(采用XTEA的加密方式),最后作为Xmodem的发送端将.ecd文件按照XMODEM协议发送到单片机;另一部分是单片机端的工程(Encrypted boot),做为Xmodem接收端接收从PC端发送过来加密过的数据,解密并完成烧写。
XTEA
XTEA (Extended Tiny Encryption Algorihtm)是TEA的一个变种版本。XTEA采用对称加密,将明文分成多个等长的组,并用相同的密码算法和密钥对每组分别进行加密和解密。密钥长度为128位,加密块为64位。XTEA算法是David Wheeler and Roger Needham于1997年发布的,并附带有C语言的实现源代码。
#include <stdint.h>
/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */
void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
for (i=0; i < num_rounds; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
}
v[0]=v0; v[1]=v1;
}
void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
unsigned int i;
uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
for (i=0; i < num_rounds; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
}
v[0]=v0; v[1]=v1;
}
在我的Encrypted bootloader工程里面,XTEA是用C#通过扩展.NET SymmetricAlgorithm Class实现的,有用户交互界面,并支持一键式随机生成加密密钥(不过要记住哦,因为解密需要同样的密钥)。下面贴上图片介绍下加密过程。
加密过程
1. 用MPLAB X v3.30生成的PIC hex文件。

2. 用C#写的工具将Hex转换为Bin,

转换成BIN后再打开是如下。

没错,Bin直接打开,是乱码的,就像我们打开.exe文件那样。Bin文件虽然不可视,但是如果直接把Bin文件发给代工厂家,或协作商,还是不安全的。它是可以通过其他工具解读出里面的内容的,并可以直接使用。所以需要加密。下面是用C#写的加密工具界面。

这样,应用程序的BIN文件加密后,就很安全了,你可以发给供应商也可以发给客户了,没有密钥,是很难解密出里面的内容的,没有解密,是不能直接使用的。
Bin文件加密后,通过XMODEM SEND发送给单片机,单片机需要预装带XTEA decrypting(解密)功能的Xmodem bootloader.
Encrypted Boot
Encrypted Boot是运行在单片机的小程序,首先它是XMODEM的接收端,接收加密过的数据,然后如同上面所贴代码中decipher()那样解密数据,所用密钥必须是加密时所用的密钥。最后将解密后的数据烧写到单片机的ROM指定的位置中去。这样就实现了可靠又安全地应用程序在线升级。如果有兴趣进一步了解和讨论我的Encrypted bootloader, 欢迎发送短消息或email给我,我的Q扣:1273623966。
Encrypted bootloader (程序BIN文件加密及在线升级)的更多相关文章
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- Android apk在线升级
APK 在线升级 APK 在线升级几乎是所有程序必备的功能. 在线升级功能能解决已有的问题并提供更丰富的新功能. 基本的流程是: 检测到新版本信息 弹出升级提示窗口 点击 No 不进行升级,完毕! 点 ...
- ubuntu15.10跑裸机程序跑.bin文件
1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...
- 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)
留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...
- Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密
Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...
- PIC32MZ 通过USB在线升级 -- USB CDC bootloader
了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...
- C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...
- WebConfig配置 文件加密处理
webconfig 文件加密处理 前几日正好遇到配置文件加密解密的问题,简单记录下流程. 1.首先运行cmd然后打开Framework.cd C:\Windows\Microsoft.NET\Fr ...
- 合并BIN文件的两种方法(转)
源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...
随机推荐
- *Amazon problem: 234. Palindrome Linked List (reverse the linked list with n time)
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- 在Hibernate单向一对多关联关系中的org.hibernate.StaleStateException 异常。
具体异常如下: Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count fro ...
- auto create statistic script
--生成用户创建的statistic脚本 select object_name(stout.object_id), stout.name, 'CREATE STATISTICS '+ stout.na ...
- App版本号定义与说明基础知识
版本控制比较普遍的三种命名格式 GNU 风格的版本号命名格式 主版本号 . 次版本号 [. 修正版本号 [. 编译版本号 ]] 示例 : 1.2.1, 2.0, 5.0.0 build-13124 W ...
- GetClassLoader和GetCallerClass的使用
GetClassLoader是JAVA中用来得到ClassLoader的 JAVA中有以下几种ClassLoader. 1. Bootstrap ClassLoader - GetClassLoad ...
- Python-利用flask模块创建web接口
一.创建一个实现登录的接口 import flask from flask import request #获取参数 # import json #post请求传入json对象时,通过json获取参数 ...
- 【luogu P2023 [AHOI2009]维护序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P2023 把P3373改一改直接粘过来就A #include <iostream> #include ...
- 02_Linux 终端命令格式
01. 终端命令格式 command [-options] [parameter] 说明: command:命令名,相应功能的英文单词或单词的缩写 [-options]:选项,可用来对命令进行控制,也 ...
- MVC5 模型 生成EF
在看本篇之前请先去了解一下EF以及如何利用模型生成数据库 https://i.cnblogs.com/posts?categoryid=1107227 看Code First就可以了. 等你了解了E ...
- Flask—03-bootstrap与表单
bootstrap与表单 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端 ...