了解更多关于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文件加密及在线升级)的更多相关文章

  1. Encrypting bootloader (程序BIN文件加密及在线升级)

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...

  2. Android apk在线升级

    APK 在线升级 APK 在线升级几乎是所有程序必备的功能. 在线升级功能能解决已有的问题并提供更丰富的新功能. 基本的流程是: 检测到新版本信息 弹出升级提示窗口 点击 No 不进行升级,完毕! 点 ...

  3. ubuntu15.10跑裸机程序跑.bin文件

    1:安装tftp:#apt-get update#apt-get install tftp-hpa tftpd-hpa xinetd2:#cd /srv#mkdir tftp#chmod 777 tf ...

  4. 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)

    留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...

  5. Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密

    Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...

  6. PIC32MZ 通过USB在线升级 -- USB CDC bootloader

    了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...

  7. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  8. WebConfig配置 文件加密处理

    webconfig 文件加密处理   前几日正好遇到配置文件加密解密的问题,简单记录下流程. 1.首先运行cmd然后打开Framework.cd C:\Windows\Microsoft.NET\Fr ...

  9. 合并BIN文件的两种方法(转)

    源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...

随机推荐

  1. SAP Fiori里两种锁机制(lock)的实现

    方法1: ETAG机制 SAP CRM Fiori采用了这种机制. 看一个具体的例子来理解.假设我用用户名Jerry选中了这个ID为3456的Opportunity,点击Edit按钮之后: 会触发一个 ...

  2. ubuntu16.4安装最新版wine3.0

    1.主体大致过程 $ wget https://dl.winehq.org/wine/source/3.0/wine-3.0.tar.xz $ tar -xvf wine-3.0.tar.xz $ c ...

  3. oracle spatial下对wkt字符串操作遇到srid的解决方案

    <span style="font-size:18px;">select fid from vgnss where SDO_WITHIN_DISTANCE(geom,  ...

  4. linux自动备份文件 并上传到远程服务器 脚本实现

    (1)在服务器上创建备份目录,并赋予权限       mkdir -p /backup/bakdata  #新建数据备份目录(2)完成备份脚本操作新建脚本文件      vi bakdata.sh添加 ...

  5. bzoj 1597 斜率DP

    1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5115  Solved: 1897[Submit] ...

  6. 大整数乘法(POJ2389)

    题目链接:http://poj.org/problem?id=2389 #include <stdio.h> #include <string.h> #define Max 1 ...

  7. 2018.11.19 Struts2中Action类的书写方式

    方式1: 方式2: 方式3

  8. linnx 修改ip地址

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 [编辑网卡的配置文件] 输入上述命令后回车,打开配置文件,使用方向键移动光标到最后一行,按字母键“i”,进入编 ...

  9. JavaEE权限管理系统的搭建(四)--------使用拦截器实现登录认证和apache shiro密码加密

    RBAC 基于角色的权限访问控制(Role-Based Access Control)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理.在一个 ...

  10. 复制D:\\day05目录下的所有文件到D:\\copy,并将.txt文件改为.java文件。

    **解题思路: 1.首先定义一个静态的refile方法,参数传入两个文件路径 2.要复制目录下的所有文件,首先查询File类的方法,可以使用listFiles方法得到目录下的文件 3.想到这问题基本就 ...