芯片 UID 加密方案
时间:2017-10-26 09:37来源:ZLG致远电子
摘要:嵌入式系统产品的加密和解密永远是一对矛盾的统一体。为了保护产品研发人员的技术成果,研究新型加密技术是非常有必要的。这里我们聊聊使用芯片UID加密的方案。
嵌入式系统产品的加密和解密永远是一对矛盾的统一体。为了保护产品研发人员的技术成果,研究新型加密技术是非常有必要的。这里我们聊聊使用芯片 UID 加密的方案。
首先需要明确的是,没有一种加密是“绝对”可靠的,但是加密手段可以增加非法使用者的解密成本,借此来防止技术被“轻易”盗取。本次以 LPC1000 的 UID 加密方案为例进行介绍。
一、LPC1000 系列的加密方案
通过分析得出,基于 CortexM0 或 CortexM3 内核的 LPC1000 系列 MCU 通过软件加密的方法有两种:
1、使用代码读保护机制,限制用户访问片内 Flash;
2、通过芯片 UID 并添加加密算法使每片 MCU 内的程序具有唯一性。
代码读保护机制是通过使能系统中的不同安全级别,以便限制访问片内 Flash,本次不做重点介绍。
二、UID 加密
UID 是唯一标识符(unique identifier),在 LPC1000 系列微控制器的每一颗芯片都具有全球唯一的标识符,该标识符为128位二进制序列。因此我们可以利用芯片 UID 的唯一性对程序进行加密,使每一个产品中的程序也具有唯一性,即使非法使用者获取了 MCU 中的程序复制到其他芯片中也是不能正常运行的,从而达到保护开发者的知识产权不被侵犯和盗用的目的。
三、LPC1000 的 UID 加密方案
基本思路是使用上位机软件通过编程器读取芯片的 UID,经加密算法运算后生成密钥,下载程序的同时向 MCU 的 Flash 中某个地址写入密钥;MCU 上电后,首先读取芯片的 UID,再通过与上位机相同的加密算法运算后计算出密钥,并与之前写入 Flash 中的密钥比较,若相同则继续执行用户程序,否则跳入死循环或执行程序开发者指定的代码。
实现此方案需要准备的资源如下。
硬件资源:
♦ LPC1766FBD100 芯片;
♦ SmartPRO 5000U-PLUS 编程器;
♦ QFP100-NXP 适配座;
♦ SmartCortex M3-1700 开发板(测试用,非必需)。
软件资源:
♦ SmartPRO 2008 2.0.56.exe 上位机软件;
♦ Programmer.rar 编程器上位机 UID 加密补丁;
♦ Uid.rar 编程器上位机 UID 加密算法;
♦ LPC1766 在 Keil4 下的工程模板;
♦ Keil4 开发环境;
♦ Microsoft Visual C++ 6.0。
1、下位机
下位机(即 LPC1766 芯片)上电并初始化后,首先读取芯片的 UID,解析密钥并与 Flash 中的密钥比较判断后,再继续执行用户代码。这里我们举例采用的加密算法是将 UID 的补码作为密钥,加密方法比较简单,用户可自行对加密算法进行修改,写出复杂的加密算法。
读取芯片 UID 的方法是通过调用芯片内部的 IAP 函数实现,如图所示。
在下位机 LPC1766 的程序编写完成并生成 hex 或 bin 文件后,按照以下步骤对 MCU 进行加密:
首先,在 Microsoft Visual C++ 6.0 下编写加密算法,这里我们已经编写完成,仅需解压 uid.rar 并打开其中的 VC 工程。用户需要在 uid.cpp 中的 UidAlgorithm 函数中添加自定义算法,如图。
加密算法编写完成后,编译将生成一个名为 uid.dll 的算法文件。
第二步,安装 SmartPRO 2008 软件,我们默认安装在 C:\Program Files 路径下;
第三步,安装 SmartPRO 2800 加密补丁,方法是将 Programmer.rar 解压到 C:\Programd Files\SmartPRO 2008\Programmer 路径下,覆盖原来的文件;
第四步,将加密算法生成的 uid.dll 文件复制到 C:\Programd Files\SmartPRO 2008\Programmer下,SmartPRO 2008 启动后将会自动调用 uid.dll;
第五步,连接硬件,将 LPC1766 芯片放入适配座 ZY503D 中,连接 USB 通信电缆和电源;
第六步,烧写文件,启动 SmartPRO 2008 软件,选择芯片“LPC1766@LQFP100”,打开烧录文件(在 Keil 编写下位机程序时生成的 hex 或 bin 文件 )。此时会出现一个如图4的特殊提示,这是因为 Keil 编译器在编译时没有将 Flash 中前8个字单元的内容进行代码有效校验和的填充而产生该警告,点击“确定”即可,编译器在下载过程中会调用校验算法自动添加校验。关于代码有效校验和填充的相关内容请参考 LPC1766 用户手册中“Flash 编程”一章的相关内容。
成功编程后,如果重新读取 Flash,打开缓冲区,定位到 0x00002000 处,可以看到已经写入的密钥。如图5所示,与此前设计的加密算法和加密预期效果一致。
首先需要明确的是,没有一种加密是“绝对”可靠的,但是加密手段可以增加非法使用者的解密成本,借此来防止技术被“轻易”盗取。本次以 LPC1000 的 UID 加密方案为例进行介绍。
一、LPC1000 系列的加密方案
通过分析得出,基于 CortexM0 或 CortexM3 内核的 LPC1000 系列 MCU 通过软件加密的方法有两种:
1、使用代码读保护机制,限制用户访问片内 Flash;
2、通过芯片 UID 并添加加密算法使每片 MCU 内的程序具有唯一性。
代码读保护机制是通过使能系统中的不同安全级别,以便限制访问片内 Flash,本次不做重点介绍。
二、UID 加密
UID 是唯一标识符(unique identifier),在 LPC1000 系列微控制器的每一颗芯片都具有全球唯一的标识符,该标识符为128位二进制序列。因此我们可以利用芯片 UID 的唯一性对程序进行加密,使每一个产品中的程序也具有唯一性,即使非法使用者获取了 MCU 中的程序复制到其他芯片中也是不能正常运行的,从而达到保护开发者的知识产权不被侵犯和盗用的目的。
三、LPC1000 的 UID 加密方案
基本思路是使用上位机软件通过编程器读取芯片的 UID,经加密算法运算后生成密钥,下载程序的同时向 MCU 的 Flash 中某个地址写入密钥;MCU 上电后,首先读取芯片的 UID,再通过与上位机相同的加密算法运算后计算出密钥,并与之前写入 Flash 中的密钥比较,若相同则继续执行用户程序,否则跳入死循环或执行程序开发者指定的代码。
图1 LPC1000 UID 加密方案流程图
实现此方案需要准备的资源如下。
硬件资源:
♦ LPC1766FBD100 芯片;
♦ SmartPRO 5000U-PLUS 编程器;
♦ QFP100-NXP 适配座;
♦ SmartCortex M3-1700 开发板(测试用,非必需)。
软件资源:
♦ SmartPRO 2008 2.0.56.exe 上位机软件;
♦ Programmer.rar 编程器上位机 UID 加密补丁;
♦ Uid.rar 编程器上位机 UID 加密算法;
♦ LPC1766 在 Keil4 下的工程模板;
♦ Keil4 开发环境;
♦ Microsoft Visual C++ 6.0。
1、下位机
下位机(即 LPC1766 芯片)上电并初始化后,首先读取芯片的 UID,解析密钥并与 Flash 中的密钥比较判断后,再继续执行用户代码。这里我们举例采用的加密算法是将 UID 的补码作为密钥,加密方法比较简单,用户可自行对加密算法进行修改,写出复杂的加密算法。
读取芯片 UID 的方法是通过调用芯片内部的 IAP 函数实现,如图所示。
图2 读取 UID
2、上位机在下位机 LPC1766 的程序编写完成并生成 hex 或 bin 文件后,按照以下步骤对 MCU 进行加密:
首先,在 Microsoft Visual C++ 6.0 下编写加密算法,这里我们已经编写完成,仅需解压 uid.rar 并打开其中的 VC 工程。用户需要在 uid.cpp 中的 UidAlgorithm 函数中添加自定义算法,如图。
图3 加密算法工程
加密算法编写完成后,编译将生成一个名为 uid.dll 的算法文件。
第二步,安装 SmartPRO 2008 软件,我们默认安装在 C:\Program Files 路径下;
第三步,安装 SmartPRO 2800 加密补丁,方法是将 Programmer.rar 解压到 C:\Programd Files\SmartPRO 2008\Programmer 路径下,覆盖原来的文件;
第四步,将加密算法生成的 uid.dll 文件复制到 C:\Programd Files\SmartPRO 2008\Programmer下,SmartPRO 2008 启动后将会自动调用 uid.dll;
第五步,连接硬件,将 LPC1766 芯片放入适配座 ZY503D 中,连接 USB 通信电缆和电源;
第六步,烧写文件,启动 SmartPRO 2008 软件,选择芯片“LPC1766@LQFP100”,打开烧录文件(在 Keil 编写下位机程序时生成的 hex 或 bin 文件 )。此时会出现一个如图4的特殊提示,这是因为 Keil 编译器在编译时没有将 Flash 中前8个字单元的内容进行代码有效校验和的填充而产生该警告,点击“确定”即可,编译器在下载过程中会调用校验算法自动添加校验。关于代码有效校验和填充的相关内容请参考 LPC1766 用户手册中“Flash 编程”一章的相关内容。
图4 用户代码无效提示
第七步,开始下载,点击“组合”即可,默认执行的是擦除、编程、校验三个步骤的结合。成功编程后,如果重新读取 Flash,打开缓冲区,定位到 0x00002000 处,可以看到已经写入的密钥。如图5所示,与此前设计的加密算法和加密预期效果一致。
图5 缓冲区查看密钥
验证方法:取下适配座中的芯片,焊接到 TinyARMT17 核心板上,查到 SmartCortex M3-1700 开发板底板上,连接 P0.11 到 BEEP 插针,如所示。开发板上电后即可听到蜂鸣器的鸣叫。以此验证芯片计算出的密钥与 Flash 中写入的密钥校验一致,芯片程序正常运行。图6 开发板验证
经此方法向芯片下载程序后,若有产品盗版者试图将程序读出然后复制到其他芯片上使用,程序将停留在判断密钥是否匹配语句,导致程序不再向下执行,从而防止软件程序被非法使用者盗用。
免责声明:本文若是转载新闻稿,转载此文目的是在于传递更多的信息,版权归原作者所有。文章所用文字、图片、视频等素材如涉及作品版权问题,请联系本网编辑予以删除。
我要投稿
近期活动
- 安森美汽车&能源基础设施白皮书下载活动时间:2024年04月01日 - 2024年10月31日[立即参与]
- 2023年安森美(onsemi)在线答题活动时间:2023年09月01日 - 2023年09月30日[查看回顾]
- 2023年安森美(onsemi)在线答题活动时间:2023年08月01日 - 2023年08月31日[查看回顾]
- 【在线答题活动】PI 智能家居热门产品,带您领略科技智慧家庭时间:2023年06月15日 - 2023年07月15日[查看回顾]
- 2023年安森美(onsemi)在线答题活动时间:2023年06月01日 - 2023年06月30日[查看回顾]
分类排行榜
- 汽车电子电源行业可靠性要求,你了解多少?
- 内置可编程模拟功能的新型 Renesas Synergy™ 低功耗 S1JA 微控制器
- Vishay 推出高集成度且符合 IrDA® 标准的红外收发器模块
- ROHM 发布全新车载升降压电源芯片组
- 艾迈斯半导体推出行业超薄的接近/颜色传感器模块,助力实现无边框智能手机设计
- 艾迈斯半导体与 Qualcomm Technologies 集中工程优势开发适用于手机 3D 应用的主动式立体视觉解决方案
- 维谛技术(Vertiv)同时亮相南北两大高端峰会,精彩亮点不容错过
- 缤特力推出全新商务系列耳机 助力解决开放式办公的噪音难题
- CISSOID 和泰科天润(GPT)达成战略合作协议,携手推动碳化硅功率器件的广泛应用
- 瑞萨电子推出 R-Car E3 SoC,为汽车大显示屏仪表盘带来高端3D 图形处理性能
编辑推荐
小型化和稳定性如何兼得?ROHM 推出超小型高输出线性 LED 驱动器 IC,为插座型 LED 驱动 IC 装上一颗强有力的 “心脏”
众所周知,LED的驱动IC担负着在输入电压不稳定的情况下,为LED提供恒定的电流,并控制恒定(可调)亮度的作用。无论是室内照明,还是车载应用,都肩负着极为重要的使命。
- 关于反激电源效率的一个疑问
时间:2022-07-12 浏览量:10169
- 面对热拔插阐述的瞬间大电流怎么解决
时间:2022-07-11 浏览量:8928
- PFC电路对N线进行电压采样的目的是什么
时间:2022-07-08 浏览量:9568
- RCD中的C对反激稳定性有何影响
时间:2022-07-07 浏览量:7187
- 36W单反激 传导7~10M 热机5分钟后超标 不知道哪里出了问题
时间:2022-07-07 浏览量:5962
- PFC电感计算
时间:2022-07-06 浏览量:4174
- 多相同步BUCK
时间:2010-10-03 浏览量:37863
- 大家来讨论 系列之二:开机浪涌电流究竟多大?
时间:2016-01-12 浏览量:43158
- 目前世界超NB的65W适配器
时间:2016-09-28 浏览量:60022
- 精讲双管正激电源
时间:2016-11-25 浏览量:128096
- 利用ANSYS Maxwell深入探究软磁体之----电感变压器
时间:2016-09-20 浏览量:107553
- 【文原创】认真的写了一篇基于SG3525的推挽,附有详细..
时间:2015-08-27 浏览量:100283