靈動(dòng)微MM32位MCU加密方法
在MM32系列MCU產(chǎn)品中有多種加密手段保護(hù)用戶程序,在這里給大家簡(jiǎn)單介紹幾種加密手段,至于其他更高階加密手段歡迎咨詢靈動(dòng)技術(shù)人員。我們這里程序加密的目的是防止板子中的程序被他人讀出使用,現(xiàn)主要介紹的加密方法有:
1、 讀保護(hù)
2、 唯一UID
3、 SWD 復(fù)用功能重映射4、 時(shí)鐘來(lái)源判斷是否自毀
1、 讀保護(hù)
所有MM32的芯片都提供對(duì)Flash的保護(hù),防止對(duì)Flash的非法訪問(wèn)——寫(xiě)保護(hù)和讀保護(hù)。一旦設(shè)置了Flash的讀保護(hù),內(nèi)置的Flash存儲(chǔ)區(qū)就只能通過(guò)程序的正常執(zhí)行才能讀出,而不能通過(guò)這兩種方式中的任何一種方式讀出:通過(guò)調(diào)試器(JTAG或SWD)和從RAM中啟動(dòng)并執(zhí)行的程序。所以我們需要對(duì)程序進(jìn)行保護(hù),一種比較簡(jiǎn)單可靠的方法就是把Flash設(shè)置成讀保護(hù)。
讀保護(hù)操作方法:
FLASH_Unlock();//解鎖
FLASH_ReadOutProtection(ENABLE);//讀保護(hù)使能
FLASH_EnableWriteProtection(FLASH_Pages); //寫(xiě)保護(hù)使能
FLASH_Lock();//上鎖
解除讀保護(hù)操作方法:
FLASH_Unlock();//解鎖
FLASH_ReadOutProtection(DISABLE);//讀保護(hù)失能
FLASH_Lock();//上鎖
2、 UID加密
96 位的產(chǎn)品唯一身份標(biāo)識(shí)所提供的參考號(hào)碼對(duì)任意一個(gè) MM32L0系列微控制器,在任何情況下都是唯一的。用戶在任何情況下,都不能修改這個(gè)身份標(biāo)識(shí)。
產(chǎn)品唯一的身份標(biāo)識(shí)可用做如下功能:
用來(lái)作為序列號(hào)(例如 USB 字符序列號(hào)或者其他的終端應(yīng)用)
用來(lái)作為密碼,在編寫(xiě)閃存時(shí),將此唯一標(biāo)識(shí)與軟件加解密算法結(jié)合使用,提高代碼在閃存存儲(chǔ)器的安全性
用來(lái)激活帶安全機(jī)制的自舉過(guò)程
這個(gè) 96 位的產(chǎn)品唯一身份標(biāo)識(shí),按照用戶不同的用法,可以以字節(jié)(8 位)為單位讀取,也可以以半字(16 位)或者全字(32 位)讀取,基地址: 0x1FFF F7E8。
UID加密原理:
if(芯片UID=數(shù)組)
{
執(zhí)行正常的程序;
}
else
{
執(zhí)行偽程序;
}
讀取UID樣例程序:
for(i=0;i<12;i++)
{
Sys_ID[i]=*(u8*)(0x1FFFF7E8+i);
printf(" %0.2X",Sys_ID[i]);
}
UID匹配判斷:
if(Sys_ID[0]==0x37 && Sys_ID[1]==0x20 && Sys_ID[2]==0x00 &&
Sys_ID[3]==0x11 && Sys_ID[4]==0x55 && Sys_ID[5]==0xAA &&
Sys_ID[6]==0xFF && Sys_ID[7]==0xFF && Sys_ID[8]==0x00 &&
Sys_ID[9]==0x32 && Sys_ID[10]==0x4D && Sys_ID[11]==0x4D)
{
printf("\r\n成功\r\n");
}
else
{
printf("\r\n失敗\r\n");
while(1);
}
①為了避免破解者利用反匯編,根據(jù)芯片UID數(shù)據(jù)在二進(jìn)制文件中查找對(duì)應(yīng)相同數(shù)據(jù)的位置從而破解,可以將UID拆散成不同的組合,并且寫(xiě)到不同且不連續(xù)的地方。更進(jìn)一步,可在程序中檢測(cè)多份這樣的分散UID,以增加反匯編的難度;蛘邔PU ID進(jìn)行加密,F(xiàn)lash中存儲(chǔ)加密后的結(jié)果。
②將芯片的UID讀取之后,經(jīng)用戶自己的復(fù)雜的加密算法對(duì)程序區(qū)的UID號(hào)加密運(yùn)算后生成一個(gè)新的數(shù)組---用戶自加密ID號(hào),寫(xiě)入MM32 Flash中某一個(gè)固定地址存儲(chǔ)空間。
在用戶程序區(qū)多處讀程序區(qū)的UID號(hào)和用戶自加密UID號(hào)比較(經(jīng)用戶自己的復(fù)雜的解密算法解密后),如不對(duì)應(yīng),則200次開(kāi)機(jī)后隨機(jī)異常。
另外,在程序區(qū)的多個(gè)地方判斷用戶自己的程序是否被修改,如被修改,則200次開(kāi)機(jī)后隨機(jī)異常,將不用的用戶程序區(qū)用所謂的有效程序全部填滿。
操作方法:
#define MM32_ID_D 65535
#define MM32_ID _ADDR 0x0800 00800
volatile u32 MM32_ID_addr[3]={0x1ffff7e8 - MM32_ID_D,0x1ffff7ec + MM32_ID_D,0x1ffff7f0 - MM32_ID_D};
/********************************************************************
函數(shù)功能:讀取芯片UID
入口參數(shù):p
返 回:無(wú)
備 注:
********************************************************************/
volatile void MM32_Read_ID(volatile u32 *p)
{
volatile u32 Addr;
Addr = MM32_ID_addr[0] + MM32_ID_D;
p[0] = *(vu32*)(Addr);
Addr = MM32_ID_addr[1] - MM32_ID_D;
p[1] = *(vu32*)(Addr);
Addr = MM32_ID_addr[2] + MM32_ID_D;
p[2] = *(vu32*)(Addr);
}
/********************************************************************
函數(shù)功能:加密并保存UID
入口參數(shù):無(wú)
返 回:無(wú)
備 注:
********************************************************************/
void MM32_Encrypted_ID(void)
{
u32 MM32ID[4],dat;
MM32_Read_ID(MM32ID);
MM32ID[3] = MM32_ID_D;
dat = MM32ID[0] + MM32ID[1] - (MM32ID[2]/MM32ID[3]);
FLASH_Unlock();
FLASH_ErasePage (MM32_ID _ADDR);
FLASH_ProgramWord(MM32_ID _ADDR,dat);
FLASH_Lock();
}
/********************************************************************
函數(shù)功能:比較加密ID,正確返回0
入口參數(shù):
返 回:1:不正確,0:正確
備 注:
********************************************************************/
u32 MM32_CMP_Encrypted_ID(void)
{
u32 MM32ID[4],dat,dat2;
MM32_Read_ID(MM32ID);
MM32ID[3] = MM32_ID_D;
dat = MM32ID[0] + MM32ID[1] - (MM32ID[2]/MM32ID[3]);
dat2 = *(u32*)( MM32_ID _ADDR);
if(dat == dat2)
{
return 0;//相同
}
else
{
return 1;//不同
}
用戶可以自定義UID加密算法及存儲(chǔ)加密后的UID的地址,防止其他人獲取到該信息,用戶可以在多個(gè)區(qū)域根據(jù)比較加密函數(shù)返回值做出相對(duì)應(yīng)的操作,如:程序全擦除或者開(kāi)機(jī)多長(zhǎng)時(shí)間后進(jìn)入異常狀態(tài)。
3、SWD 復(fù)用功能重映射
MCU的程序下載方式有多種:SWD和ISP等方式,為了增加程序被讀出的難度,所以在程序中可以將SWD下載口PA13\PA14復(fù)用成其他的功能,這樣就可以防止其他人通過(guò)SWD方式讀取MCU的程序。
操作方法:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//開(kāi)啟復(fù)用時(shí)鐘
GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_7); //PA13復(fù)用其他功能
GPIO_PinAFConfig(GPIOA, GPIO_PinSource14, GPIO_AF_7); //PA14復(fù)用其他功能
4、時(shí)鐘來(lái)源判斷是否自毀
如果用戶在硬件電路上有使用外部晶振,在程序一啟動(dòng)在配置時(shí)鐘源時(shí)就判斷外部高速時(shí)鐘就緒標(biāo)注,如果外部高速時(shí)鐘就緒標(biāo)志為1,就默認(rèn)執(zhí)行正常的應(yīng)用程序,如果為0,跳轉(zhuǎn)HSI,就執(zhí)行偽程序或者實(shí)現(xiàn)自毀功能,并且在應(yīng)用程序中也可以多次判斷該位是否為1,該加密方案的前提是確保外部晶振工作正常,防止有其他人取下芯片做其他的操作。
以上是本次介紹的加密手段,如果MM32用戶想更多了解MM32的加密手段請(qǐng)聯(lián)系靈動(dòng)微核心代理商-穎特新科技。
關(guān)于靈動(dòng)微電子
靈動(dòng)微電子股份有限公司(股票代碼:833448,股票簡(jiǎn)稱:靈動(dòng)微電)是國(guó)內(nèi)專注于MCU產(chǎn)品與MCU應(yīng)用方案的領(lǐng)先供應(yīng)商,是中國(guó)工業(yè)及信息化部和上海市信息化辦公室認(rèn)定的集成電路設(shè)計(jì)企業(yè),同時(shí)也是上海市認(rèn)定的高新技術(shù)企業(yè)。自2011年3月成立至今,靈動(dòng)微電子已經(jīng)成功完成數(shù)百余MCU產(chǎn)品的設(shè)計(jì)及推廣,靈動(dòng)微電子目前已批量供貨的基于ARMCortex-M0及Cortex-M3 內(nèi)核的MCU產(chǎn)品包括:針對(duì)通用高性能市場(chǎng)的MM32F系列,針對(duì)超低功耗及安全應(yīng)用的MM32L系列,具有多種無(wú)線連接功能的MM32W系列,電機(jī)驅(qū)動(dòng)及控制專用的MM32SPIN系列,以及針對(duì)超小尺寸及超高集成度的MM32P系列等,以滿足客戶及市場(chǎng)多領(lǐng)域、多層次的豐富應(yīng)用場(chǎng)景需求。
靈動(dòng)微電子立足本土,洞悉市場(chǎng),貼近客戶,以為客戶提供“保姆式”的全方位支持為特色,堅(jiān)持“專業(yè)、可靠、便捷、高效”的服務(wù)理念,貫徹差異最大化,成本最優(yōu)化的經(jīng)營(yíng)策略,不斷強(qiáng)化自身生態(tài)價(jià)值,維護(hù)良好產(chǎn)品品牌。公司在銷售初期就與客戶充分接觸,為客戶提供產(chǎn)品整體解決方案,從產(chǎn)品功能定義、市場(chǎng)競(jìng)爭(zhēng)力分析到算法整合、軟件驅(qū)動(dòng)、應(yīng)用例程等都深入?yún)⑴c,為客戶提供精準(zhǔn)的市場(chǎng)分析和全面的應(yīng)用方案,幫助客戶把握好成功的每一個(gè)重要環(huán)節(jié)。
如需要了解更多靈動(dòng)微MCU產(chǎn)品,請(qǐng)聯(lián)系靈動(dòng)微核心代理商-穎特新科技
編輯:ls 最后修改時(shí)間:2022-06-06