chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

【N32L40XCL-STB 開(kāi)發(fā)板評(píng)測(cè)】安全加密算法評(píng)測(cè)

冬至子 ? 來(lái)源:iotgeek ? 作者:iotgeek ? 2023-08-10 16:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 本章內(nèi)容
本章主要以AES和SHA算法為例,介紹算法使用,同時(shí)對(duì)比基于硬件加速引擎和純軟件算法運(yùn)算速度的差異。

2 測(cè)試環(huán)境
開(kāi)發(fā)板:N32L40XCL-STB V1.0
開(kāi)發(fā)環(huán)境:Keil 5
RT-Thread版本:5.0.0

3 模塊介紹
3.1 SAC模塊簡(jiǎn)介
MCU具有密碼算法硬件加速引擎(SAC),支持多種國(guó)際算法及國(guó)家密碼對(duì)稱密碼算法和雜湊密碼算法加速,相較于純軟件算法而言能極大的提高加解密速度。

3.2 硬件支持的算法如下:
支持 DES對(duì)稱算法
? 支持 DES和 3DES加解密運(yùn)算
? TDES支持 2KEY和 3KEY模式
? 支持 CBC和 ECB模式

支持 AES對(duì)稱算法
? 支持 128bit/192bit/ 256bit密鑰長(zhǎng)度
? 支持 CBC、 ECB、 CTR模式

支持 SHA摘要算法
? 支持 SHA1/SHA224/SHA256

支持 MD5摘要算法
? 支持 MD5摘要算法

支持 國(guó)密算法
? 支持對(duì)稱式國(guó)密 SM1、 SM4、 SM7算法以及 SM3雜湊算法
注:
國(guó)民技術(shù)SAC模塊寄存器目前暫未開(kāi)發(fā),原廠僅提供基于加速引擎的靜態(tài)庫(kù),通過(guò)查看API目前已開(kāi)放下載的最新版本靜態(tài)庫(kù)僅支持AES、DES、TDES、SHA1/224/256、SM3和隨機(jī)數(shù)。
目前已開(kāi)放下載的最新版本靜態(tài)庫(kù)還不支持SM1、SM4和SM7,另外SM1和SM7國(guó)密局僅提供IP授權(quán),算法并不開(kāi)源,暫無(wú)有效驗(yàn)證工具。
TinyCrypt組件為RT-Thead官方移植庫(kù),API接口簡(jiǎn)潔明了,使用非常方便。該庫(kù)目前最新版本暫不支持DES算法,故本例程選擇國(guó)民技術(shù)原廠和TinyCrypt都支持的AES和SHA為例對(duì)比硬件加速和純軟件算法的差異。

4 創(chuàng)建工程
由于官方只提供*.lib靜態(tài)庫(kù),故采用ENV構(gòu)建Keil工程項(xiàng)目。
在RT-Thread源碼BSP目錄中找到N32

拷貝n32l40xcl-stb,重命名為n32l40xcl-stb_algo_test
使用ENV工具,添加以下TinyCrypt組件,由于n32l40x芯片內(nèi)存較?。?0KB),而加解密運(yùn)算需要較大的緩沖區(qū)來(lái)做測(cè)試,故需將無(wú)關(guān)的功能配置組件等全部關(guān)閉。如外設(shè),僅保留GPIO和UART,其他系統(tǒng)外設(shè)全部關(guān)閉。

1.jpg

1.jpg

保存配置,適用pkgs和 scons命令構(gòu)建工程。

添加algo_test.c

1.jpg

手動(dòng)添加國(guó)民技術(shù)基于SAC模塊的算法驅(qū)動(dòng)庫(kù)。

1.jpg

5 編寫(xiě)測(cè)試程序程序
HASH運(yùn)算測(cè)試方法
1.記錄系統(tǒng)tick值
2.讀n32 flash 16Byte
3.計(jì)算HASH值
4.循環(huán)2-3步驟,直到128KB全部計(jì)算完成。
5.查詢當(dāng)前系統(tǒng)tick值,計(jì)算程序運(yùn)行時(shí)間。

AES加解密測(cè)試方法
1.記錄系統(tǒng)tick值
2.讀n32 flash 16Byte
3.AES128_ECB 加密16Byte, ECB解密,解密后與明文比較
4.循環(huán)2-3步驟,直到128KB全部解密。
5.查詢當(dāng)前系統(tǒng)tick值,計(jì)算程序運(yùn)行時(shí)間。

注:官方提供的AES API適用并不友好,參考TinyCrypt中AES API做了二次封裝。

SHA1代碼:
/**

@brief SHA1 algorithm test code
@param none
@return none
@note HASH operation test method

1. Record the system tick value
2. Read n32 flash R_FLASH_LEN Byte
3. Calculate the HASH value
4. Cycle steps 2-3 until the 128KB calculation is complete.
5. Query the current system tick value and calculate the program running time.

/
void sha1(void)
{
rt_tick_t tick ,tick_1,tick_2;
tiny_sha1_context ctx;
HASH_CTX n32sac_ctx;
uint8_t output[20];
uint32_t pos = 0;
uint32_t num = N32_FLASH_SIZE/R_FLASH_LEN ;
rt_kprintf("nTinyCrypt SHA1 Testn");
tick_1 = rt_tick_get();
tiny_sha1_starts(&ctx );
pos = 0;
for (int var = 0; var < num; ++var)
{
if (n32_flash_read(N32_FLASH_START_ADRESS+pos, databuf, R_FLASH_LEN) < 0)
{
rt_kprintf("read flash error !!! n");
return;
}
else
{
tiny_sha1_update(&ctx, databuf, R_FLASH_LEN);
pos += R_FLASH_LEN ;
}
}
tiny_sha1_finish(&ctx, output);
tick_2 = rt_tick_get();
memset(&ctx, 0, sizeof(tiny_sha1_context));
tick = tick_2 - tick_1 ;
rt_kprintf("start systick:%dms n", tick_1);
rt_kprintf("finish systick:%dms n", tick_2);
rt_kprintf("data len :%dByte,time:%dms n", N32_FLASH_SIZE,tick);
rt_kprintf("SHA1 HASH:%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02Xn",
output[0],output[1],output[2],output[3],output[4],output[5],output[6],output[7],
output[8],output[9],output[10],output[11],output[12],output[13],output[14],output[15],
output[16],output[17],output[18],output[19]);
n32sac_ctx.hashAlg = HASH_ALG_SHA1;
n32sac_ctx.sequence = HASH_SEQUENCE_FALSE;
rt_kprintf("nN32L4_SAC SHA1 Testn");
tick_1 = rt_tick_get();
if (HASH_Init_OK != HASH_Init(&n32sac_ctx))
{
rt_kprintf("N32L4_SAC HASH_Init failed.n");
return;
}
if (HASH_Start_OK != HASH_Start(&n32sac_ctx))
{
rt_kprintf("N32L4_SAC HASH_Start failed.n");
return;
}
pos = 0;
for (int var = 0; var < num; ++var)
{
if (n32_flash_read(N32_FLASH_START_ADRESS+pos, databuf, R_FLASH_LEN) < 0)
{
rt_kprintf("read flash error !!! n");
return;
}
else
{
if (HASH_Update_OK != HASH_Update(&n32sac_ctx, (uint8_t
)databuf, R_FLASH_LEN))
{
rt_kprintf("N32L4_SAC HASH_Update failed.n");
return;
}
else
{
pos += R_FLASH_LEN ;
}
}
}
if (HASH_Complete_OK != HASH_Complete(&n32sac_ctx, output))
{
rt_kprintf("N32L4_SAC HASH_Complete failed.n");
return;
}
tick_2 = rt_tick_get();
memset(&n32sac_ctx, 0, sizeof(HASH_CTX));
tick = tick_2 - tick_1 ;
rt_kprintf("start systick:%dms n", tick_1);
rt_kprintf("finish systick:%dms n", tick_2);
rt_kprintf("data len :%dByte,time:%dms n", N32_FLASH_SIZE,tick);
rt_kprintf("SHA1 HASH:%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02Xn",
output[0],output[1],output[2],output[3],output[4],output[5],output[6],output[7],
output[8],output[9],output[10],output[11],output[12],output[13],output[14],output[15],
output[16],output[17],output[18],output[19]);
}
AES代碼:
/**

  • @brief AES algorithm test code
    @param none
    @return none
    @note AES Encryption and decryption test method
1. Record the tick value of the system
2. Read n32 flash 16Byte
3. AES128_ECB encrypts 16Byte, decrypts ECB, and compares with plaintext after decryption
4. Repeat steps 2-3 until all 128KB is decrypted.
5. Query the tick value of the current system and calculate the program running time.

/
void aes(void)
{
rt_tick_t tick ,tick_1,tick_2;
tiny_aes_context ctx;
AES_PARM AES_Parm;
uint8_t key[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//uint8_t iv[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uint8_t plain[16]={0};//
uint8_t cipher[16]={0};//
uint8_t plainOut[16]={0};//
#if DBG_AES
uint32_t num = 4 ;
#else
uint32_t num = N32_FLASH_SIZE/16 ;
#endif
uint32_t pos = 0;
rt_kprintf("nTinyCrypt AES128_ECB Testn");
tick_1 = rt_tick_get();
pos = 0;
for (int var = 0; var < num; ++var)
{
if (n32_flash_read(N32_FLASH_START_ADRESS+pos, plain, 16) < 0)
{
rt_kprintf("read flash error !!! n");
return;
}
else
{
tiny_aes_setkey_enc(&ctx, key, 128);
tiny_aes_crypt_ecb(&ctx,AES_ENCRYPT,plain, cipher);
tiny_aes_setkey_dec(&ctx, key, 128);
tiny_aes_crypt_ecb(&ctx,AES_DECRYPT,cipher, plainOut);
#if DBG_AES
rt_kprintf("key = ");
DumpBytes(key, sizeof(key));
rt_kprintf("n");
rt_kprintf("plain = ");
DumpBytes(plain, sizeof(plain));
rt_kprintf("n");
rt_kprintf("cipher = ");
DumpBytes(cipher, sizeof(cipher));
rt_kprintf("n");
rt_kprintf("decrypt out = ");
DumpBytes(plainOut, sizeof(plainOut));
rt_kprintf("n");
#endif
if(memcmp(plain,plainOut,16)==0)
{
pos += 16 ;
}
else
{
rt_kprintf("tiny aes crypt error !!! n");
return;
}
}
}
if (memcmp(plain, plainOut, sizeof(plain)) != 0)
{
rt_kprintf("AES decrypt result do not equal plain data.n");
return;
}
tick_2 = rt_tick_get();
tick = tick_2 - tick_1 ;
rt_kprintf("start systick:%dms n", tick_1);
rt_kprintf("finish systick:%dms n", tick_2);
rt_kprintf("data len :%dByte,time:%dms n", N32_FLASH_SIZE,tick);
rt_kprintf("nN32L4_SAC AES128_ECB Testn");
tick_1 = rt_tick_get();
pos = 0;
for (int var = 0; var < num; ++var)
{
if (n32_flash_read(N32_FLASH_START_ADRESS+pos, plain, 16) < 0)
{
rt_kprintf("read flash error !!! n");
return;
}
else
{
AES_SetKey_Enc(&AES_Parm, key, 128);
AES_Crypt_ECB(&AES_Parm,AES_ENCRYPT,plain, cipher);
AES_SetKey_Dec(&AES_Parm, key, 128);
AES_Crypt_ECB(&AES_Parm,AES_DECRYPT,cipher, plainOut);
#if DBG_AES
rt_kprintf("key = ");
DumpBytes(key, sizeof(key));
rt_kprintf("n");
rt_kprintf("plain = ");
DumpBytes(plain, sizeof(plain));
rt_kprintf("n");
rt_kprintf("cipher = ");
DumpBytes(cipher, sizeof(cipher));
rt_kprintf("n");
rt_kprintf("decrypt out = ");
DumpBytes(plainOut, sizeof(plainOut));
rt_kprintf("n");
#endif
if(memcmp(plain,plainOut,16)==0)
{
pos += 16 ;
}
else
{
rt_kprintf("tiny aes crypt error !!! n");
return;
}
}
}
tick_2 = rt_tick_get();
tick = tick_2 - tick_1 ;
rt_kprintf("start systick:%dms n", tick_1);
rt_kprintf("finish systick:%dms n", tick_2);
rt_kprintf("data len :%dByte,time:%dms n", N32_FLASH_SIZE,tick);
}
AES 重新封裝代碼:
/**

@brief AES key schedule (encryption)
@param[in] parm pointer to AES context and the detail please refer to struct AES_PARM in n32l40x_aes.h
@param[in] key encryption key
@param[in] keysize must be 128, 192 or 256
@return none
/
void AES_SetKey_Enc(AES_PARM parm, unsigned char key, int keysize)
{
parm->key = (uint32_t
)key;
parm->iv = NULL; // IV is not needed in ECB mode
switch (keysize)
{
case 128:
parm->keyWordLen = 4;
break;
case 192:
parm->keyWordLen = 6;
break;
case 256:
parm->keyWordLen = 8;
break;
default:
return;
}
parm->Mode = AES_ECB;
parm->En_De = AES_ENC;
}
/

@brief AES key schedule (decryption)
@param[in] parm pointer to AES context and the detail please refer to struct AES_PARM in n32l40x_aes.h
@param[in] key encryption key
@param[in] keysize must be 128, 192 or 256
@return none
/
void AES_SetKey_Dec(AES_PARM parm, uint8_t key, uint32_t keysize)
{
parm->key = (uint32_t
)key;
parm->iv = NULL; // IV is not needed in ECB mode
switch (keysize)
{
case 128:
parm->keyWordLen = 4;
break;
case 192:
parm->keyWordLen = 6;
break;
case 256:
parm->keyWordLen = 8;
break;
default:
return;
}
parm->Mode = AES_ECB;
parm->En_De = AES_DEC;
}
/

@brief AES-ECB block encryption/decryption
@param[in] parm pointer to AES context and the detail please refer to struct AES_PARM in n32l40x_aes.h
@param[in] mode AES_ENCRYPT or AES_DECRYPT
@param[in] input 16-byte input block
@param[out] output 16-byte output block
@return none
/
void AES_Crypt_ECB(AES_PARM parm, uint32_t mode, uint8_t input[16], uint8_t output[16])
{
parm->inWordLen = 4;
parm->in = (uint32_t
)input;
parm->out = (uint32_t
)output;
if (AES_Init_OK != AES_Init(parm))
{
rt_kprintf("N32L4_SAC AES_Init failed.n");
return;
}
if (AES_Crypto_OK != AES_Crypto(parm))
{
rt_kprintf("N32L4_SAC AES_Crypto failedn");
return;
}
}

6 測(cè)試數(shù)據(jù)

1.jpg

7 章節(jié)總結(jié)

從測(cè)試數(shù)據(jù)上對(duì)比,執(zhí)行相同的密碼運(yùn)算基于硬件加速引擎速度遠(yuǎn)遠(yuǎn)大于純軟件算法。尤其是進(jìn)行大量數(shù)據(jù)加解密運(yùn)算時(shí)差異較大。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1313

    瀏覽量

    55724
  • AES算法
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    8023
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    16307
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1540

    瀏覽量

    44274
  • Flash存儲(chǔ)
    +關(guān)注

    關(guān)注

    0

    文章

    40

    瀏覽量

    8541
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    N32L40XCL-STB 開(kāi)發(fā)板評(píng)測(cè)】SPI接口評(píng)測(cè)

    N32L40XCL片內(nèi)集成2個(gè)SPI接口,SPI允許芯片與外部設(shè)備以半/全雙工、同步、串行方式通信。此接口可以被配置成主模式,并為外部從設(shè)備提供通信時(shí)鐘(SCK)。
    發(fā)表于 08-11 14:31 ?1401次閱讀
    【<b class='flag-5'>N32L40XCL-STB</b> <b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>評(píng)測(cè)</b>】SPI接口<b class='flag-5'>評(píng)測(cè)</b>

    N32L43XCL-STB開(kāi)發(fā)板硬件使用手冊(cè)

    N32L43XCL-STB開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司高性能32位N32L43XCL系列芯片的樣片開(kāi)發(fā)。本文檔詳細(xì)描述了N32L43XCL-STB
    發(fā)表于 11-02 08:10

    N32L40XCL-STB開(kāi)發(fā)板硬件使用手冊(cè)

    N32L40XCL-STB開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司高性能32位N32L40XCL系列芯片的樣片開(kāi)發(fā)。本文檔詳細(xì)描述了N32L40XCL-STB
    發(fā)表于 11-02 06:35

    國(guó)民技術(shù)N32G43XCL-STB開(kāi)發(fā)板資料

    國(guó)民技術(shù)N32G43XCL-STB開(kāi)發(fā)板資料
    發(fā)表于 11-07 15:30 ?17次下載

    N32G45XCL-STB (LQFP48)開(kāi)發(fā)板

    N32G45XCL-STB (LQFP48)開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?0次下載
    <b class='flag-5'>N32G45XCL-STB</b> (LQFP48)<b class='flag-5'>開(kāi)發(fā)板</b>

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?1次下載
    <b class='flag-5'>N32G43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32L43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?4次下載
    <b class='flag-5'>N32L43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L40XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32L40XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?3次下載
    <b class='flag-5'>N32L40XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板

    N32G43XCL-STB (LQFP48) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?1次下載
    <b class='flag-5'>N32G43XCL-STB</b> (LQFP48) <b class='flag-5'>開(kāi)發(fā)板</b>

    N32L40XCL-STB 開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)大挑戰(zhàn)

    評(píng)測(cè)任務(wù)挑戰(zhàn)活動(dòng),讓開(kāi)發(fā)者小伙伴們互相協(xié)作,對(duì)開(kāi)發(fā)板的每個(gè)模塊功能進(jìn)行評(píng)測(cè)(可以自己外接外設(shè),方式不限),以及編寫(xiě)所需的模塊驅(qū)動(dòng)(已有驅(qū)動(dòng)則無(wú)需再寫(xiě)),
    的頭像 發(fā)表于 03-28 03:25 ?1415次閱讀

    N32L40XCL-STB開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)大挑戰(zhàn)之UART

    本文主要對(duì)通過(guò)RT-Thread Studio對(duì)國(guó)民技術(shù)開(kāi)發(fā)板N32L40XCL-STB 進(jìn)行UART外設(shè)配置,實(shí)現(xiàn)開(kāi)發(fā)板串口功能。
    的頭像 發(fā)表于 08-09 15:25 ?1513次閱讀
    <b class='flag-5'>N32L40XCL-STB</b><b class='flag-5'>開(kāi)發(fā)板</b>模塊<b class='flag-5'>評(píng)測(cè)</b>任務(wù)大挑戰(zhàn)之UART

    N32L40XCL-STB開(kāi)發(fā)板評(píng)測(cè)】I2C接口測(cè)試

    32L40XCL集成了2個(gè)獨(dú)立的I2C總線接口,它提供多主機(jī)功能,控制所有I2C總線特定的時(shí)序
    發(fā)表于 08-11 14:37 ?1048次閱讀
    【<b class='flag-5'>N32L40XCL-STB</b><b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>評(píng)測(cè)</b>】I2C接口測(cè)試

    N32L40XCL-STB開(kāi)發(fā)板模塊評(píng)測(cè)任務(wù)大挑戰(zhàn)-測(cè)試CAN

    選擇下載了N32L40XXX_V2.1.0.zip資料包后,解壓得到官方Demo,數(shù)據(jù)手冊(cè),評(píng)估,軟件開(kāi)發(fā)套件,應(yīng)用筆記,測(cè)試資料等等。
    的頭像 發(fā)表于 08-16 16:15 ?1996次閱讀
    <b class='flag-5'>N32L40XCL-STB</b><b class='flag-5'>開(kāi)發(fā)板</b>模塊<b class='flag-5'>評(píng)測(cè)</b>任務(wù)大挑戰(zhàn)-測(cè)試CAN

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)_開(kāi)發(fā)板

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)_開(kāi)發(fā)板
    發(fā)表于 10-18 16:13 ?0次下載

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)開(kāi)發(fā)板

    國(guó)民技術(shù)N32G45XCL-STB_(LQFP48)開(kāi)發(fā)板
    發(fā)表于 10-18 16:13 ?2次下載