0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CRYP加密處理器簡(jiǎn)介、主要特性及功能說(shuō)明

中科芯MCU ? 來(lái)源:中科芯MCU ? 2023-09-22 09:29 ? 次閱讀

CRYP簡(jiǎn)介

MCU加/解密可分為對(duì)稱加/解密、非對(duì)稱加/解密、以及HASH算法,以上加/解密算法均可通過(guò)CAVP FIPS認(rèn)證,用于各類安全相關(guān)應(yīng)用。其中,包含DES、三重DES(TDES)或AES(128、192或256)等算法的加密處理器(CRYP)即為對(duì)稱加/解密算法。通過(guò)CRYP,可實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行加密或解密,且該加密處理器完全兼容下列標(biāo)準(zhǔn):

·聯(lián)邦信息處理標(biāo)準(zhǔn)出版物“FIPS PUB 46-3,1999年10月25日”規(guī)定的數(shù)據(jù)加密標(biāo)準(zhǔn)(DES和TDES)。它遵循美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)X9.52標(biāo)準(zhǔn)。

·聯(lián)邦信息處理標(biāo)準(zhǔn)出版物(FIPS PUB 197,2001年11月26日)規(guī)定的高級(jí)加密標(biāo)準(zhǔn)(AES)。

CRYP處理器可在電子密碼本(ECB)模式或加密分組鏈接(CBC)模式下使用DES和TDES算法執(zhí)行數(shù)據(jù)加密和解密。

CRYP外設(shè)為32位AHB2外設(shè)。它支持傳入數(shù)據(jù)和已處理數(shù)據(jù)的DMA傳輸,并具有輸入和輸出FIFO(分別為8個(gè)字深),本次例程采用DES128 ECB算法進(jìn)行驗(yàn)證,文章將著重講解該部分,其余算法詳見(jiàn)參考手冊(cè)。

CRYP 主要特性

·適用于AES、DES和TDES加密和解密操作

·DES

-直接執(zhí)行簡(jiǎn)單DES算法(使用單一密鑰K1)

-支持ECB和CBC鏈接算法

-支持64位、128位和192位密鑰(包括奇偶校驗(yàn))

-支持在CBC模式下使用的2×32位初始化向量(IV)

-使用DES處理一個(gè)64位塊需要16個(gè)HCLK周期

CRYP功能說(shuō)明

加密處理器可實(shí)現(xiàn)TDES(同樣支持DES)內(nèi)核和AES加密內(nèi)核。

由于TDES和AES算法使用塊密碼,因此,加密前需對(duì)不完整的輸入數(shù)據(jù)塊進(jìn)行填充(應(yīng)將額外的位附加到數(shù)據(jù)串的尾端),解密后需要丟棄填充項(xiàng)。硬件不處理填充操作,需要通過(guò)軟件進(jìn)行處理。圖1顯示了加密處理器的框圖。

24895c82-587b-11ee-939d-92fbcf53809c.png

圖1加密處理器框圖

1.DES加密內(nèi)核

--DES加密內(nèi)核由三部分組成

·DES算法(DEA)

·初始化向量(在CBC模式中使用)

·DES模式:密鑰=[K1]

--DES和TDES電子密碼本(DES/TDES-ECB)模式

·DES-ECB模式加密

DES電子密碼本(DES/TDES-ECB)模式中的加密是通過(guò)64位明文數(shù)據(jù)塊(P)經(jīng)過(guò)位/字節(jié)/半字交換(請(qǐng)參見(jiàn)1.3.2節(jié):數(shù)據(jù)類型的表1)后作為輸入塊(I)。輸入塊通過(guò)DEA在加密狀態(tài)下使用K1進(jìn)行加密處理。

若是TDES,則會(huì)將上述處理過(guò)程的輸出會(huì)直接反饋到DEA的輸入,在解密狀態(tài)下使用K2執(zhí)行DES,然后重復(fù)將上一步處理的輸出反饋到DEA的輸入,在加密狀態(tài)下使用K3執(zhí)行DES,最后生成的64位輸出塊(O)在執(zhí)行位/字節(jié)/半字交換之后,以密文(C)形式推入OUT FIFO,加密流程如圖2所示。

249cd9a6-587b-11ee-939d-92fbcf53809c.png

圖2DES-ECB模式加密

①K:密鑰;C:密文;I:輸入塊;O:輸出塊;P:明文。

·DES/TDES-ECB模式解密

圖3介紹了DES-ECB解密流程,64位密文(C)經(jīng)過(guò)位/字節(jié)/半字交換后,作為輸入塊(I),而該密鑰序列將使用與加密過(guò)程相反的密鑰序列來(lái)實(shí)現(xiàn)。輸入塊通過(guò)DEA在解密狀態(tài)下使用K3進(jìn)行解密處理,然后,將上述處理過(guò)程的輸出會(huì)直接反饋到DEA的輸入,在加密狀態(tài)下使用K2執(zhí)行DES,使得新結(jié)果會(huì)直接反饋到DEA的輸入,在解密狀態(tài)下使用K1執(zhí)行DES,最后,將生成的64位輸出塊(O)再進(jìn)行位/字節(jié)/半字交換后,產(chǎn)生明文(P),以上便是解密過(guò)程。

24a90ff0-587b-11ee-939d-92fbcf53809c.png

圖3DES-ECB 模式解密

①K:密鑰;C:密文;I:輸入塊;O:輸出塊;P:明文

2.數(shù)據(jù)類型

將數(shù)據(jù)寫入CRYP_DIN寄存器時(shí),會(huì)一次性向CRYP處理器輸入32位(字)數(shù)據(jù)。由于DES的原則是每隔64位對(duì)數(shù)據(jù)流進(jìn)行處理,因此,針對(duì)每個(gè)64位塊,DES都會(huì)對(duì)其進(jìn)行M1到M64的對(duì)位編號(hào),其中M1為塊最左側(cè)的位,M64為塊最右側(cè)的位。

系統(tǒng)存儲(chǔ)器結(jié)構(gòu)采用小端模式:即無(wú)論使用何種數(shù)據(jù)類型(位、字節(jié)、16位半字、32位字),最低有效數(shù)據(jù)均占用最低地址位置。因此,對(duì)于從IN FIFO中讀取的數(shù)據(jù),在其進(jìn)入CRYP處理器之前,必須對(duì)這些數(shù)據(jù)執(zhí)行位、字節(jié)或半字交換操作(取決于要加密的數(shù)據(jù)類型)。在CRYP數(shù)據(jù)寫入OUT FIFO之前,需要對(duì)其執(zhí)行同樣的交換操作。例如,對(duì)ASCII文本流執(zhí)行字節(jié)交換操作。要處理的數(shù)據(jù)類型通過(guò)CRYP控制寄存器(CRYP_CR)中的DATATYPE位字段進(jìn)行配置。

24b7ad3a-587b-11ee-939d-92fbcf53809c.jpg

表1數(shù)據(jù)類型

圖4展示了根據(jù)不同的DATATYPE值,CRYP處理器是如何將IN FIFO中彈出的兩個(gè)連續(xù)32位字構(gòu)建成64位數(shù)據(jù)塊M1...64的過(guò)程。同理,也可用該方法擴(kuò)展構(gòu)建用于AES加密算法的128位數(shù)據(jù)塊(對(duì)于AES,塊長(zhǎng)度為四個(gè)32位字,但由于交換僅發(fā)生在字級(jí)別,因此它與此處描述的TDES的交換過(guò)程相同),本文不再贅述。

注意:IN FIFO和CRYP數(shù)據(jù)塊之間,以及CRYP數(shù)據(jù)塊和OUT FIFO之間執(zhí)行相同的交換操作。

24d1c53a-587b-11ee-939d-92fbcf53809c.png

圖4根據(jù)DATATYPE構(gòu)建64位塊

3.初始化向量——CRYP_IV0...1(L/R)

初始化向量可視為兩個(gè)64位數(shù)據(jù)項(xiàng),因此,初始化向量在系統(tǒng)存儲(chǔ)器中的數(shù)據(jù)格式和表示形式均不同于明文或密碼數(shù)據(jù),而且它們不受DATATYPE值的影響。初始化向量采用兩個(gè)連續(xù)的32位字進(jìn)行定義,即CRYP_IVL(左部分,記為位IV1...32)和CRYP_IVR(右部分,記為位IV33...64)。

以DES CBC算法為例,加密期間,CRYP_IV0(L/R)位會(huì)與一個(gè)64位數(shù)據(jù)塊(即,數(shù)據(jù)塊的M1...64位)進(jìn)行異或運(yùn)算,這里的64位數(shù)據(jù)塊是根據(jù)DATATYPE值交換后從IN FIFO彈出的。當(dāng)DEA3塊的輸出可用時(shí),該輸出值會(huì)復(fù)制到CRYP_IV0(L/R)向量,之后,這個(gè)新值與IN FIFO彈出的下一個(gè)64位數(shù)據(jù)塊進(jìn)行異或運(yùn)算,以此類推。

在DES CBC解密期間,CRYP_IV0(L/R)位首先會(huì)與TDEA1塊輸出的64位數(shù)據(jù)塊(即,M1...64位)進(jìn)行異或運(yùn)算,然后異或運(yùn)算后的結(jié)果根據(jù)DATATYPE值進(jìn)行交換并壓入OUT FIFO。異或運(yùn)算后的結(jié)果進(jìn)行交換并壓入OUT FIFO后,IN FIFO的輸出會(huì)取代CRYP_IV0(L/R)值,然后IN FIFO執(zhí)行彈出操作,隨后可對(duì)新的64位數(shù)據(jù)塊進(jìn)行處理。
當(dāng)CRYP_SR寄存器的BUSY位=1b時(shí),針對(duì)CRYP_IV0...1(L/R)寄存器的任何寫操作都會(huì)被忽略(CRYP_IV0...1(L/R)寄存器內(nèi)容不會(huì)被修改),因此,在修改初始化向量之前,必須檢查BUSY位是否等于0b。

4.CRYP忙碌狀態(tài)

當(dāng)輸入FIFO中有充足的數(shù)據(jù)(至少有2個(gè)字可用于DES算法模式時(shí))、輸出FIFO中有充足的自由空間(至少有2個(gè)(DES/TDES)字位置),以及CRYP_CR寄存器中的位CRYPEN=1時(shí),加密處理器會(huì)自動(dòng)開(kāi)始加密或解密過(guò)程(根據(jù)CRYP_CR寄存器中ALGODIR位的值)。
在此過(guò)程中,執(zhí)行簡(jiǎn)易DES算法需16個(gè)AHB2時(shí)鐘周期。在整個(gè)過(guò)程中,CRYP_SR寄存器的BUSY位始終置“1”。完成此過(guò)程后,CRYP內(nèi)核會(huì)將兩個(gè)(DES)字寫入輸出FIFO,并將BUSY位清零。在CBC、CTR模式下,還會(huì)更新初始化向量CRYP_IVx(L/R)R(x=0..3)。

當(dāng)加密處理器繁忙時(shí)(CRYP_SR寄存器中的位BUSY=1b),會(huì)忽略針對(duì)密鑰寄存器(CRYP_Kx(L/R)R,x=0..3)、初始化寄存器(CRYP_IVx(L/R)R,x=0..3)或CRYP_CR寄存器的位[9:2]的寫操作,且不會(huì)修改這些寄存器,因此,不能在加密處理器處理數(shù)據(jù)塊時(shí)修改其配置。不過(guò),可以在BUSY=1時(shí)將CRYPEN位清零,這種情況下,只有完成正在進(jìn)行的DES處理過(guò)程并將兩個(gè)字的結(jié)果寫入輸出FIFO后才能將BUSY位清零。

注意:在DES模式下處理某個(gè)塊時(shí),如果輸出FIFO已滿并且輸入FIFO至少含一個(gè)新塊,則輸入FIFO會(huì)彈出新塊且BUSY位保持置1,直到有足夠的空間可將這個(gè)新塊存儲(chǔ)到輸出FIFO。

5.加密或解密執(zhí)行步驟

--初始化

1)初始化外設(shè)(在準(zhǔn)備密鑰之前必須輸入密鑰大小和密鑰值,準(zhǔn)備好密鑰后,必須立即配置相應(yīng)算法):

①將對(duì)稱密鑰寫入CRYP_KxL/R寄存器(需寫入2到8個(gè)寄存器,具體取決于算法);

②使用CRYP_CR寄存器中的DATATYPE位配置數(shù)據(jù)類型(1位、8位、16位或32位);

③使用CRYP_CR寄存器中的ALGOMODE位配置算法和鏈接(在ECB/CBC中為DES);

④使用CRYP_CR寄存器中的ALGODIR位配置方向(加密/解密);

2)向CRYP_CR寄存器中的FFLUSH位寫入1,刷新IN和OUT FIFO。

--DMA用于存儲(chǔ)器數(shù)據(jù)傳入和傳出時(shí)的處理過(guò)程

1)將DMA控制器配置為傳輸存儲(chǔ)器中的輸入數(shù)據(jù),傳輸長(zhǎng)度為消息的長(zhǎng)度。當(dāng)消息填充并非由外設(shè)進(jìn)行管理時(shí),消息長(zhǎng)度必須為整個(gè)數(shù)量的數(shù)據(jù)塊,數(shù)據(jù)傳輸均在突發(fā)模式下進(jìn)行。DES中的突發(fā)長(zhǎng)度為2個(gè)字,應(yīng)將DMA配置為在完成輸出數(shù)據(jù)傳輸時(shí)設(shè)置一個(gè)中斷,以指示處理過(guò)程已結(jié)束;

2)通過(guò)向CRYPEN位寫入1來(lái)使能加密處理器,將CRYP_DMACR寄存器中的DIEN和DOEN位置1,以使能DMA請(qǐng)求;

3)所有傳輸和處理過(guò)程均由DMA和加密處理器管理,DMA中斷表示處理過(guò)程已完成,兩個(gè)FIFO通常均為空,且BUSY=0;

--在中斷期間通過(guò)CPU傳輸數(shù)據(jù)的處理過(guò)程

1)將CRYP_IMSCR寄存器中的INIM和OUTIM位置1,以使能中斷;

2)將CRYP_CR寄存器中的CRYPEN位置1,以使能加密處理器;

3)在中斷中管理輸入數(shù)據(jù):將輸入消息加載到IN FIFO,一次性可加載2個(gè)字或4個(gè)字,或者加載數(shù)據(jù)直到FIFO已滿。當(dāng)消息的最后一個(gè)字進(jìn)入FIFO時(shí),可通過(guò)將INIM位清零來(lái)禁止中斷;

4)在中斷中管理輸出數(shù)據(jù):讀取OUT FIFO中的輸出消息。一次可讀取1個(gè)塊(2個(gè)字或4個(gè)字),或者讀取數(shù)據(jù)直到FIFO為空。讀取最后一個(gè)字后,INIM=0、BUSY=0且兩個(gè)FIFO均為空(IFEM=1且OFNE=0)。將OUTIM位清零可禁止中斷,而將CRYPEN位清零可禁止外設(shè)。

--不使用DMA也不使用中斷時(shí)的處理過(guò)程

1)將CRYP_CR寄存器中的CRYPEN位置1,以使能加密處理器;

2)將首個(gè)塊寫入輸入FIFO(2到8個(gè)字);

3)重復(fù)以下步驟,直到處理完整個(gè)信息:

①等待OFNE=1,然后讀取輸出FIFO(讀取1個(gè)塊,或FIFO為空為止);

②等待IFNF=1,然后寫入INFIFO(寫入1個(gè)塊,或FIFO已滿為止;

處理過(guò)程結(jié)束時(shí),BUSY=0且兩個(gè)FIFO均為空(IFEM=1且OFNE=0),將CRYPEN位清零可禁止外設(shè)。

CRYP中斷

CRYP可產(chǎn)生兩個(gè)可單獨(dú)屏蔽的中斷源。這兩個(gè)中斷源共用同一個(gè)中斷信號(hào),且該中斷信號(hào)是CRYP發(fā)出的唯一中斷信號(hào),用于驅(qū)動(dòng)NVIC(嵌套向量中斷控制器)。這一組合中斷是兩個(gè)單獨(dú)屏蔽的中斷源的或運(yùn)算結(jié)果,如果下面列出的各個(gè)中斷中的任何一個(gè)中斷產(chǎn)生,則此組合中斷即會(huì)產(chǎn)生。

通過(guò)更改CRYP_IMSCR寄存器中的屏蔽位,可單獨(dú)使能或禁止各個(gè)中斷源,將相應(yīng)的屏蔽位置“1”以使能中斷。

關(guān)于各個(gè)中斷源的狀態(tài),通過(guò)CRYP_RISR寄存器可以讀取原始中斷狀態(tài),通過(guò)CRYP_MISR寄存器可以讀取屏蔽中斷狀態(tài)。

--輸出FIFO服務(wù)中斷–OUTMIS

當(dāng)輸出FIFO中存在一個(gè)或多個(gè)(32位字)數(shù)據(jù)項(xiàng)時(shí),即會(huì)產(chǎn)生輸出FIFO服務(wù)中斷。通過(guò)讀取輸出FIFO的數(shù)據(jù),直到讀完所有有效(32位)字,即可將此中斷清除(即該中斷的狀態(tài)與OFNE(輸出FIFO非空)標(biāo)志一致)。

輸出FIFO服務(wù)中斷OUTMIS不是通過(guò)CRYP使能位使能,因此,如果輸出FIFO非空,即使禁止CRYP之后也不會(huì)強(qiáng)制OUTMIS信號(hào)為低電平。


--輸入FIFO服務(wù)中斷–INMIS

當(dāng)輸入FIFO中少于四個(gè)字時(shí),會(huì)產(chǎn)生輸入FIFO服務(wù)中斷,對(duì)輸入FIFO執(zhí)行寫操作直到其中所含字不小于四字,這樣即可將此中斷清除。

輸入FIFO服務(wù)中斷INMIS通過(guò)CRYP使能位使能,因此,禁止CRYP之后,即使輸入FIFO為空,INMIS信號(hào)也為低(無(wú)效)。

24f0ea6e-587b-11ee-939d-92fbcf53809c.png

圖5CRYP中斷映射圖表

CRYP DMA接口

加密處理器可使用一個(gè)接口連接DMA控制器。DMA操作通過(guò)CRYP DMA控制寄存器CRYP_DMACR進(jìn)行控制。

突發(fā)傳輸請(qǐng)求信號(hào)和單次傳輸請(qǐng)求信號(hào)并不相互排斥。這兩種信號(hào)可同時(shí)產(chǎn)生。例如,當(dāng)OUTFIFO中存在6個(gè)字時(shí),會(huì)產(chǎn)生突發(fā)傳輸請(qǐng)求和單次傳輸請(qǐng)求。突發(fā)傳輸4個(gè)字之后,將只產(chǎn)生單次傳輸請(qǐng)求來(lái)傳輸余下的2個(gè)字。當(dāng)數(shù)據(jù)流中待接收的剩余字?jǐn)?shù)少于突發(fā)傳輸字?jǐn)?shù)時(shí),這一特性就非常有用。

在產(chǎn)生相關(guān)的DMA清除信號(hào)之前,仍會(huì)產(chǎn)生各個(gè)請(qǐng)求信號(hào)。禁止請(qǐng)求信號(hào)清除之后,可再次激活某個(gè)請(qǐng)求信號(hào),具體取決于上述條件。如果已禁止CRYP外設(shè)并且已將DMA使能位清零(CRYP_DMACR寄存器中的DIEN位用于IN FIFO,DOEN位用于OUT FIFO),則會(huì)禁止所有請(qǐng)求信號(hào)。
注意:DMA控制器必須配置為執(zhí)行不多余4字的突發(fā)傳輸。否則可能會(huì)丟失一些數(shù)據(jù)。為了在裝滿IN FIFO之前讓DMA控制器清空OUT FIFO,OUT DMA通道的優(yōu)先級(jí)應(yīng)高于INDMA通道。

CRYP原理部分介紹到此,下面介紹具體使用情況。

CRYP應(yīng)用實(shí)例

本節(jié),我們將針對(duì)CRYP部分與DMA部分共同完成一個(gè)實(shí)驗(yàn),首先需要在工程目錄下新建一個(gè)CRYP文件夾。CRYP為加密處理器,本節(jié)例程通過(guò)DES128EBC算法進(jìn)行驗(yàn)證,再使用軟件Debug的方式查看加密與解密數(shù)據(jù)的正確與否。

打開(kāi)本節(jié)實(shí)驗(yàn)工程可發(fā)現(xiàn),相較其他工程,新增了幾項(xiàng)相關(guān)文件:

①cks32f4xx_cryp.c

②cks32f4xx_cryp.h

③cks32f4xx_cryp_des.c

④cks32f4xx_cryp_tdes.c

⑤cks32f4xx_cryp_aes.c

由于例程是通過(guò)CRYP加密處理器中的DES算法對(duì)數(shù)據(jù)進(jìn)行加密/解密,且選用電子密碼本(ECB)模式執(zhí)行,因此,在例程中僅添加上述①②③三項(xiàng)即可,加密/解密流程詳解見(jiàn)1.3.1小節(jié),接下來(lái)介紹軟件層面的應(yīng)用。

代碼中將實(shí)現(xiàn)數(shù)據(jù)加密/解密功能,取下列功能為例:

1)軟件復(fù)位

2)DES128 ECB

為縮短篇幅,不一一贅述所有算法形式,其余算法的使用方式可查閱相關(guān)參考手冊(cè)與庫(kù)文件,下面正式進(jìn)入軟件代碼部分講解。

1)軟件復(fù)位功能

首先設(shè)置CRYP各個(gè)寄存器的軟件復(fù)位值與偏移地址,如下所示,具體寄存器功能如手冊(cè)所述。

uint32_t TABLE_RESETREG[][2] =
{
  {0x0000, 0x00000000},
  {0x0004, 0x00000003},
  {0x0008, 0x00000000},
  {0x000C, 0x00000000},
  {0x0010, 0x00000000},
  {0x0014, 0x00000000},
  {0x0018, 0x00000001},
  {0x001C, 0x00000000},
  {0x0020, 0x00000000},
  {0x0024, 0x00000000},
  {0x0028, 0x00000000},   
  {0x002C, 0x00000000},   
  {0x0030, 0x00000000},   
  {0x0034, 0x00000000},   
  {0x0038, 0x00000000},
  {0x003C, 0x00000000},
  {0x0040, 0x00000000},
  {0x0048, 0x00000000},  
  {0x004C, 0x00000000},   
};
TestStatus Test1()
{
  int i;
  for (i=0; i
  {
    if(readl((uint8_t *)CRYP + TABLE_RESETREG[i][0]) != TABLE_RESETREG[i][1])
    {
      return FAILED;
    }
  }
  return PASSED;
}

通過(guò)代碼判定基地址+偏移地址是否為CRYP相應(yīng)地址,一致則正確,不一致則錯(cuò)誤。

1)DES128 ECB

根據(jù)手冊(cè),首先設(shè)置以下向量組

①設(shè)置密鑰;

②設(shè)置初始向量組;

③設(shè)置明文文本;

④設(shè)置密文文本;

下面進(jìn)行代碼講解:

由上可知,實(shí)驗(yàn)開(kāi)始前需要先設(shè)定DES-KEY密鑰、初始向量IV_1、明文Plaintext等一系列數(shù)組。

由于我們添加了cks32f4xx_cryp_des.c,因此可直接調(diào)用明文加密函數(shù),并發(fā)送加密后的密文。

uart2_fputc(3, DESkey, 8);
uart2_fputc(3, IV_1, 16);
uart2_fputc(3, Plaintext, AES_TEXT_SIZE);
for (j=0; j<4; j++)
{
    DataType = 0x40 * j;    
  /* Encrypt the plaintext message*/
  if(MYCRYP_DES_ECB(MODE_ENCRYPT, DESkey, Plaintext, AES_TEXT_SIZE, Encryptedtext, DataType) != SUCCESS)
    {
      return FAILED;
    }
    uart2_fputc(3, Encryptedtext, AES_TEXT_SIZE);
    /* Decrypt the plaintext message  */
    if(MYCRYP_DES_ECB(MODE_DECRYPT,DESkey, Encryptedtext,AES_TEXT_SIZE,Decryptedtext, DataType) != SUCCESS)
    {
      return FAILED;
    }
        for (i=0; i
    {
     if (Decryptedtext[i] != Plaintext[i])
     {
        return FAILED;
      }
    }

上述代碼中的MYCRYP_DES_ECB()不僅可作為加密入口函數(shù),同樣可作為解密算法的入口函數(shù),參數(shù)如下所示:

ErrorStatus MYCRYP_DES_ECB
(uint8_t Mode, uint8_t Key[8], uint8_t *Input,
uint32_t Ilength, uint8_t *Output, uint16_t DataType)

對(duì)于各個(gè)參數(shù),可根據(jù)需求配置:

① Mode:根據(jù)需求選擇加密(MODE_ENCRYPT)、解密(MODE_DECRYPT)

② Key[8]:本例成為DES128 ECB算法,所以選擇DESkey

③*Input:輸入,根據(jù)功能設(shè)定,當(dāng)功能為加密時(shí),輸入為明文;當(dāng)輸入為解密時(shí),輸入為密文

④ Ilength:輸入的buffer長(zhǎng)度,規(guī)定必須為8的倍數(shù)

⑤*Output:輸出,與第③條相反

⑥ DataType:默認(rèn)值

由于加密后的數(shù)據(jù)可通過(guò)DMA的突發(fā)模式進(jìn)行傳輸,因此也對(duì)DMA功能作簡(jiǎn)要介紹,如下所示,DMA配置與常規(guī)無(wú)異,僅在一句函數(shù)上需注意,入口函數(shù)如下所示:

void DES_Encrypt_DMA
(uint32_t AlgoMode, uint8_t InitVectors[16], uint8_t *Key, uint8_t *Input, uint32_t Ilength, uint8_t *Output, uint16_t DataType, DMA_InitTypeDef *DMA_In_InitStructure, DMA_InitTypeDef *DMA_Out_InitStructure)

該函數(shù)用于CRYP加密處理器加密/解密的DMA傳輸,函數(shù)的各個(gè)參數(shù)根據(jù)使用需求決定:

① AlgoMode:根據(jù)選定的模式設(shè)置,由于例程是DES128 ECB算法,因此,該參數(shù)設(shè)定為CRYP_AlgoMode_DES_ECB

② InitVectors[16]:初始向量設(shè)定

③*Key:秘鑰方式,上文中已講解,本次例程為DESkey

④*Input:輸入,上文已講解

⑤ Ilength:輸入的buffer長(zhǎng)度

⑥*Output:輸出

⑦ DataType:默認(rèn)值

與加密函數(shù)類似,本節(jié)的DMA函數(shù)同樣分為加密和解密兩個(gè)過(guò)程,函數(shù)相應(yīng)更改*Input和*Output參數(shù)即可。

接下來(lái)講解main.c函數(shù),該函數(shù)相對(duì)不難。

在main.c中設(shè)定以下數(shù)組(具體數(shù)據(jù)如工程文件所示)

① DES密鑰;

②初始向量;

③明文/解密后的明文;

④加密計(jì)算后的密文;

Main.c函數(shù)如下所示:

int main(void)
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  uart_init(115200);     
  NVIC_Config();
  while(1)
  {
CRYP_DeInit();                            
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, DISABLE);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);
if(func[(0)]() == PASSED)
{
 uart2_fputc(0, 0, 0);
}
else
{
 uart2_fputc(0, 0, 0);
}
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);
if(func[(1)]() == PASSED)
{
    uart2_fputc(0, 0, 0);
}
else
{
  CKS_EVAL_LEDToggle(LED1);
CKS_EVAL_LEDToggle(LED2);
}
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);
if(func[(2)]() == PASSED)
{
uart2_fputc(0, 0, 0);
}
else
{
CKS_EVAL_LEDToggle(LED1);
CKS_EVAL_LEDToggle(LED2);
}

需注意的是,在驗(yàn)證CRYP功能時(shí),需要開(kāi)啟相應(yīng)的總線時(shí)鐘。具體的代碼可詳見(jiàn)工程。

RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE);

以上即為CRYP加密處理器模塊代碼的大致講解,具體代碼詳見(jiàn)相關(guān)工程。將代碼下載到相應(yīng)電路板后,通過(guò)軟件Debug的方式進(jìn)行驗(yàn)證,驗(yàn)證成功則跳轉(zhuǎn)到相關(guān)的功能PASS位置。最后可得到明文數(shù)據(jù)(Plaintext),并將其與解密后的數(shù)據(jù)(Decrytedtext)相比對(duì),比對(duì)正確則成功,實(shí)驗(yàn)結(jié)果如下圖所示:

252d1f2a-587b-11ee-939d-92fbcf53809c.png

(a)明文數(shù)據(jù)

2536e38e-587b-11ee-939d-92fbcf53809c.png

(b)解密后的數(shù)據(jù)

到此,CRYP加密處理器講解完成,其他算法的使用詳見(jiàn)參考手冊(cè)與庫(kù)文件。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19286

    瀏覽量

    229811
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17148

    瀏覽量

    351182
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    388

    瀏覽量

    43677
  • CRYP
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    2482

原文標(biāo)題:MCU微課堂|CRYP加密處理器

文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)隨機(jī)數(shù)發(fā)生主要特性功能以及如何操作?

    隨機(jī)數(shù)發(fā)生簡(jiǎn)介隨機(jī)數(shù)發(fā)生主要特性隨機(jī)數(shù)發(fā)生功能說(shuō)明
    發(fā)表于 11-13 07:51

    IWDG主要特性及框圖

    00. 目錄文章目錄00. 目錄01. IWDG簡(jiǎn)介02. IWDG主要特性03. IWDG功能說(shuō)明04. IWDG框圖05. IWDG寄存
    發(fā)表于 07-30 07:03

    窗口看門狗主要特性功能

    00. 目錄文章目錄00. 目錄01. WWDG簡(jiǎn)介02. WWDG主要特性03. WWDG功能說(shuō)明04. 設(shè)置看門狗超時(shí)05. WWDG寄存
    發(fā)表于 07-30 06:41

    DAC主要特性功能說(shuō)明

    00. 目錄文章目錄00. 目錄01. DAC簡(jiǎn)介02. DAC主要特性03. DAC功能說(shuō)明04. DAC雙通道轉(zhuǎn)換05. DAC寄存5
    發(fā)表于 08-09 08:04

    USART主要特性

    00. 目錄文章目錄00. 目錄01. USART簡(jiǎn)介02. USART主要特性03. USART功能說(shuō)明04. USART字符說(shuō)明05.
    發(fā)表于 08-12 08:05

    ADC主要特性功能

    00. 目錄文章目錄00. 目錄01. ADC簡(jiǎn)介02. ADC主要特性03. ADC功能說(shuō)明04. ADC開(kāi)關(guān)控制05. ADC時(shí)鐘06. 通道選擇07. 轉(zhuǎn)換模式08. 時(shí)序圖09
    發(fā)表于 08-18 06:31

    PCF8594存儲(chǔ)引腳功能說(shuō)明

    PCF8594存儲(chǔ)引腳功能說(shuō)明
    發(fā)表于 01-10 23:42 ?1324次閱讀
    PCF8594存儲(chǔ)<b class='flag-5'>器</b>引腳<b class='flag-5'>功能說(shuō)明</b>

    Q83652(5D01機(jī)芯)微處理器引腳功能說(shuō)明

    Q83652(5D01機(jī)芯)微處理器引腳功能說(shuō)明
    發(fā)表于 01-10 23:46 ?640次閱讀
    Q83652(5D01機(jī)芯)微<b class='flag-5'>處理器</b>引腳<b class='flag-5'>功能說(shuō)明</b>

    iPVD的功能說(shuō)明及介紹

    iPVD的功能說(shuō)明及介紹 iPVD的功能   普通電視用戶將可以采用基
    發(fā)表于 10-27 08:41 ?2038次閱讀

    74HC573功能說(shuō)明

    74HC573功能說(shuō)明。
    發(fā)表于 03-23 17:05 ?0次下載

    煙霧報(bào)警功能說(shuō)明

    煙霧報(bào)警功能說(shuō)明,詳細(xì)介紹了煙霧報(bào)警的細(xì)節(jié)操作,還有修改意見(jiàn)。
    發(fā)表于 05-18 14:26 ?0次下載

    fluke-p-dx-1數(shù)字多用表特性功能說(shuō)明

    fluke-p-dx-1數(shù)字多用表特性功能說(shuō)明
    發(fā)表于 03-22 09:34 ?0次下載

    六碼流水遙控功能說(shuō)明

    六碼流水遙控功能說(shuō)明
    發(fā)表于 03-07 15:21 ?0次下載

    ZSC31050功能說(shuō)明

    ZSC31050功能說(shuō)明
    發(fā)表于 07-04 18:31 ?1次下載
    ZSC31050<b class='flag-5'>功能說(shuō)明</b>

    簡(jiǎn)單認(rèn)識(shí)安全加密處理器

    安全加密處理器 (Secure Cryptoprocessor) 是一種本身不產(chǎn)生加密數(shù)據(jù)或程序指令,但產(chǎn)生密鑰(Key)的處理器,其應(yīng)用產(chǎn)品有智能卡、ATM、電視機(jī)機(jī)頂盒、軍事系統(tǒng)等
    的頭像 發(fā)表于 12-06 09:19 ?1253次閱讀