网站域名解析长沙做网站多少钱
web/
2025/10/3 12:29:36/
文章来源:
网站域名解析,长沙做网站多少钱,珠宝设计师网,商品定制首页nRF52832——唯一 ID 与加密解密 唯一 ID 概念唯一 ID 作用读取唯一 ID 唯一 ID 用于加密TEA 加密算法唯一 ID 的加密和解密 唯一 ID 概念
唯一 ID 作用
nRF52xx 微控制器提供一组 64 位的唯一 ID 号#xff0c;这个唯一身份标识所提供的 ID 值对任意一个 nRF52xx 微控制器这个唯一身份标识所提供的 ID 值对任意一个 nRF52xx 微控制器在任何情况下都是唯一的。用户在何种情况下都不能修改这个身份标识。按照用户不同的用法可以以字节(8 位)为单位读取也可以以半字(16 位)或者全字(32 位)读取。对应唯一ID 号常见的应用场合如下面几种
用来作为序列号用来作为密码在编写闪存时将此唯一标识与软件加解密算法结合使用提高代码在闪 存存储器内的安全性用来激活带安全机制的自举过程
读取唯一 ID
设备唯一 ID 保存存在寄存器 FICR 中工厂信息配置寄存器(FICR)是在工厂预先编程的用户不能删除。这些寄存器包含特定于芯片的信息和配置。
寄存器名称偏移地址描述DEVICE ID[0]0x060设备 identifierDEVICE ID[1]0x064设备 identitier
因此识别芯片中的唯一 ID 的方式就是读取寄存器 DEVICEID 内的值因为这个参数值是不能修改的出厂的时候由厂家固化的。因此寄存器 DEVICEID 为只读寄存器我们在串口例子基础上就行修改因此工程结构不就行修改。读取了唯一 ID 的寄存器值后通过串口打印输出来进行演示。编写程序如下所示 #include stdbool.h
#include stdint.h
#include stdio.h
#include app_uart.h
#include app_error.h
#include nrf_delay.h
#include nrf.h
#include bsp.h
#if defined (UART_PRESENT)
#include nrf_uart.h
#endif
#if defined (UARTE_PRESENT)
#include nrf_uarte.h
#endif//#define ENABLE_LOOPBACK_TEST /** if defined, then this example will be a loopback test, which means that TX should be connected to RX to get data loopback. */#define MAX_TEST_DATA_BYTES (15U) /** max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256 /** UART TX buffer size. */
#define UART_RX_BUF_SIZE 256 /** UART RX buffer size. */void uart_error_handle(app_uart_evt_t * p_event)
{if (p_event-evt_type APP_UART_COMMUNICATION_ERROR){APP_ERROR_HANDLER(p_event-data.error_communication);}else if (p_event-evt_type APP_UART_FIFO_ERROR){APP_ERROR_HANDLER(p_event-data.error_code);}
}#define UART_HWFC APP_UART_FLOW_CONTROL_DISABLED/*** brief Function for main application entry.*/
int main(void)
{uint32_t err_code;uint32_t id1,id2;id1NRF_FICR-DEVICEID[0]; //读取id低31位id2NRF_FICR-DEVICEID[1];//读取id高31位const app_uart_comm_params_t comm_params {RX_PIN_NUMBER,TX_PIN_NUMBER,RTS_PIN_NUMBER,CTS_PIN_NUMBER,UART_HWFC,false,
#if defined (UART_PRESENT)NRF_UART_BAUDRATE_115200
#elseNRF_UARTE_BAUDRATE_115200
#endif};APP_UART_FIFO_INIT(comm_params,UART_RX_BUF_SIZE,UART_TX_BUF_SIZE,uart_error_handle,APP_IRQ_PRIORITY_LOWEST,err_code);APP_ERROR_CHECK(err_code);while (1){printf(打印id%lx%lx\r\n,id1,id2);nrf_delay_ms(1000);}}唯一 ID 用于加密
TEA 加密算法
唯一 ID 常用的场合就是加密我们可以采用一个简单的加密算法对 ID 号进行加密。那么如果要正确运行程序就需要对唯一 ID 进行正确解密。
常用的代码加密方案一般有两种。
通过某种硬件手段防止单片机 FLASH 中的代码被读出比如禁止读取、或者关闭下载接口就算代码能被读出来把它烧到另一个芯片中也无法正常运行与特定芯片紧紧绑定。
以目前的技术水平来说不论如何禁止似乎都有人可以把程序从芯片内部读取出来。那么就算被窃取者读取了程序的二进制文件烧到另一个同型号的处理器芯片里也必须无法运行。要实现这一目的首先要有一个与单片机唯一绑定的东西那么这就需要唯一 ID 号了每一片芯片 ID 都不相同并且全世界保存唯一。
研发者由唯一 ID 号通过加密算法计算得到检验码然后向使用者下发。使用者可将此码通过专用编写的上位机把效验码烧写器写入到芯片的 EEPROM 中。 在代码中可以在多个位置对 EEPROM 中的校验码进行比对一致则正常运行否则宕机。 比如在程序有最前面一开始就进行鉴权如果失败则向用户显示“无权限”等信息停止程序运行或是在程序中比较关键的条件分支中这样如果程序被人破译比如反汇编通过修改一些条件判断强行使其正常运行。因为程序中鉴权的地方越多这势必让破解者费一些周折但是也不能过多的地方出现检验码避免被统计识别。 对于唯一 ID 的加密原理如下图 本节讲采用在安全学领域中常见的 TEA 加密算法进行加密和解密。所谓的 TEATiny Encryption Algorithm是一种分组加密算法它的实现非常简单通常只需要很精短的几行代码就可以实现因此非常适合用单片机的加密中。
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计 的。TEA 算法使用 64 位的明文分组和 128 位的密钥它使用 Feistel 分组加密框架需要进行 64 轮 迭代。该算法使用了一个神秘常数δ作为倍数它来源于黄金比率以保证每一轮加密都不相同。但 δ的精确值似乎并不重要这里 TEA 把它定义为 δ「(√5 - 1)231」也就是程序中的 0×9E3779B9。
Tea 算法秘钥为 16 字节每次分块处理的数据是 8 个字节两个 32 位数据。加密过程中加法运算和减法运算用作可逆的操作算法轮流使用异或运算提供非线性特性双移位操作使秘钥和数据的所有比特重复地混合最多 16 轮循环就能使数据或密钥的单个比特的变化扩展到接近 32 比特. 因此 ,当循环轮数达到 16 轮以上时 ,该算法具有很强的抗差分攻击能力 ,128 比特密钥长度可以抗击穷举搜索攻击该算法设计者推荐算法迭代次数为 32 轮。
唯一 ID 的加密和解密
下面简单的演示如何对唯一 ID 进行加密搭建加密工程如下图
tea.c 代码如下
#include tea.hvoid encrypt (uint32_t* v, uint32_t* k)
{uint32_t v0v[0], v1v[1], sum0, i; /* set up */uint32_t delta0x9e3779b9; /* a key schedule constant */uint32_t k0k[0], k1k[1], k2k[2], k3k[3]; /* cache key */for (i0; i 32; i) { /* basic cycle start */sum delta;v0 ((v14) k0) ^ (v1 sum) ^ ((v15) k1);v1 ((v04) k2) ^ (v0 sum) ^ ((v05) k3); } /* end cycle */v[0]v0; v[1]v1;
}void decrypt (uint32_t* v, uint32_t* k)
{uint32_t v0v[0], v1v[1], sum0xC6EF3720, i; /* set up */uint32_t delta0x9e3779b9; /* a key schedule constant */uint32_t k0k[0], k1k[1], k2k[2], k3k[3]; /* cache key */for (i0; i32; i) { /* basic cycle start */v1 - ((v04) k2) ^ (v0 sum) ^ ((v05) k3);v0 - ((v14) k0) ^ (v1 sum) ^ ((v15) k1);sum - delta; } /* end cycle */v[0]v0; v[1]v1;
}
主函数中设置一组加密密码 key本例简单的设置为 0x1234 作为密码。然后读取设备的唯一 ID 号对唯一 ID 号进行 tea 加密。加密完成后的 ID 号可以作为程序加密的效验码。为了验证加密是否成功再对加密后的唯一 ID 号进行解密。对比读取的唯一 ID 号和解密后的唯一 ID 号如果两者相同则证明加密算法正确。具体代码如下所示 #include stdbool.h
#include stdint.h
#include stdio.h
#include app_uart.h
#include app_error.h
#include nrf_delay.h
#include nrf.h
#include bsp.h
#if defined (UART_PRESENT)
#include nrf_uart.h
#endif
#if defined (UARTE_PRESENT)
#include nrf_uarte.h
#endif
#include tea.h//#define ENABLE_LOOPBACK_TEST /** if defined, then this example will be a loopback test, which means that TX should be connected to RX to get data loopback. */#define MAX_TEST_DATA_BYTES (15U) /** max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256 /** UART TX buffer size. */
#define UART_RX_BUF_SIZE 256 /** UART RX buffer size. */void uart_error_handle(app_uart_evt_t * p_event)
{if (p_event-evt_type APP_UART_COMMUNICATION_ERROR){APP_ERROR_HANDLER(p_event-data.error_communication);}else if (p_event-evt_type APP_UART_FIFO_ERROR){APP_ERROR_HANDLER(p_event-data.error_code);}
}#define UART_HWFC APP_UART_FLOW_CONTROL_DISABLED/*** brief Function for main application entry.*/
int main(void)
{uint32_t err_code;uint32_t id[2];uint32_t key[]{0x1234,0x1234,0x1234,0x1234}; //密码id[0]NRF_FICR-DEVICEID[0]; //读取id低31位id[1]NRF_FICR-DEVICEID[1];//读取id高31位const app_uart_comm_params_t comm_params {RX_PIN_NUMBER,TX_PIN_NUMBER,RTS_PIN_NUMBER,CTS_PIN_NUMBER,UART_HWFC,false,
#if defined (UART_PRESENT)NRF_UART_BAUDRATE_115200
#elseNRF_UARTE_BAUDRATE_115200
#endif};APP_UART_FIFO_INIT(comm_params,UART_RX_BUF_SIZE,UART_TX_BUF_SIZE,uart_error_handle,APP_IRQ_PRIORITY_LOWEST,err_code);APP_ERROR_CHECK(err_code);while (1){printf(打印id%lx%lx\r\n,id[0],id[1]);encrypt(id,key);//加密工程的验证码printf(加密id%lx%lx\r\n,id[0],id[1]);decrypt(id,key);//解密printf(解密id%lx%lx\r\n,id[0],id[1]);printf(-------------------\r\n);nrf_delay_ms(1000); }}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86216.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!