[N32G45x] 【N32G457】AES加密解密测试

[复制链接]
 楼主| aple0807 发表于 2022-2-13 10:39 | 显示全部楼层 |阅读模式
本帖最后由 aple0807 于 2022-2-13 10:42 编辑

之前看国民系列MCU支持硬件加密解码模块,可惜本开发板MCU没有该功能,测下软件加密解密速度及用法。
下面主要测试 AES 和 DES。

AES加密模式比较多,代码如下:
  1. void aes_demo(void)
  2. {
  3.         uu32 clk_start;
  4.         uu8 *src, *enc, *dec, *iv;
  5.         mbedtls_aes_context *aes_enc, *aes_dec;
  6.         size_t offset;

  7.         // 内存请求
  8.         src = calloc(1, 1024);
  9.         enc = calloc(1, 1024);
  10.         dec = calloc(1, 1024);
  11.         iv = calloc(1, 80);
  12.         aes_enc = malloc(sizeof(mbedtls_aes_context));
  13.         aes_dec = malloc(sizeof(mbedtls_aes_context));

  14.         dbg_puts("\n===========================================================\n");
  15.         dbg_print("AES 128 encode test: <128 bits> \n");

  16.         // 初始化
  17.         dat_buff_init();

  18.         // 初始化结构
  19.         mbedtls_aes_init(aes_enc);
  20.         mbedtls_aes_init(aes_dec);

  21.         // 生成 KEY
  22.         clk_start = bsp_cpu_clks_get();
  23.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  24.         mbedtls_aes_setkey_dec(aes_dec, (void *)ase_key_src, 128);
  25.         dbg_print("key make time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  26.         /*------------------------------------------------------------------------*/
  27.         // 加密 + 解密         ECB                        电子密码本模式
  28.         clk_start = bsp_cpu_clks_get();
  29.         mbedtls_aes_crypt_ecb(aes_enc, MBEDTLS_AES_ENCRYPT, src, enc);
  30.         mbedtls_aes_crypt_ecb(aes_dec, MBEDTLS_AES_DECRYPT, enc, dec);
  31.         dbg_print("AES ecb : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  32.         // 显示
  33.         //dbg_u8_print("src: ", src, 16, 20);
  34.         dbg_u8_print("enc: ", enc, 16, 20);
  35.         dbg_u8_print("dec: ", dec, 16, 20);

  36.         /*------------------------------------------------------------------------*/
  37.         // 加密 + 解密         CBC                        密码分组连接模式        - 内部分组 IO长度相同
  38.         // 加密解密需要相同的初始向量, 向量长度16B
  39.         dat_buff_init();
  40.         clk_start = bsp_cpu_clks_get();

  41.         memset(iv, 0xFF, 16);
  42.         mbedtls_aes_crypt_cbc(aes_enc, MBEDTLS_AES_ENCRYPT, 512, iv, src, enc);

  43.         memset(iv, 0xFF, 16);
  44.         mbedtls_aes_crypt_cbc(aes_dec, MBEDTLS_AES_DECRYPT, 512, iv, enc, dec);

  45.         dbg_print("\nAES CBC 512 : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  46.         // 显示
  47.         //dbg_u8_print("src: \n", src, 64, 32);
  48.         dbg_u8_print("enc: \n", enc, 128, 32);
  49.         dbg_u8_print("dec: \n", dec, 128, 32);

  50.         /*------------------------------------------------------------------------*/
  51.         // 加密 + 解密         CFB8                密文反馈模式                - 内部分组 IO长度相同
  52.         // 加密解密需要相同的初始向量, 向量长度16B,加密解密都使用加密器
  53.         dat_buff_init();
  54.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  55.         clk_start = bsp_cpu_clks_get();
  56.         memset(iv, 0xFF, 16);
  57.         mbedtls_aes_crypt_cfb8(aes_enc, MBEDTLS_AES_ENCRYPT, 60, iv, src, enc);
  58.         memset(iv, 0xFF, 16);
  59.         mbedtls_aes_crypt_cfb8(aes_enc, MBEDTLS_AES_DECRYPT, 60, iv, enc, dec);
  60.         dbg_print("\nAES CFB8 60 : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  61.         // 显示
  62.         //dbg_u8_print("src: \n", src, 64, 32);
  63.         dbg_u8_print("enc: \n", enc, 64, 32);
  64.         dbg_u8_print("dec: \n", dec, 64, 32);

  65.         /*------------------------------------------------------------------------*/
  66.         // 加密 + 解密         CFB128                密文反馈模式                - 内部分组 IO长度相同
  67.         // 加密解密需要相同的初始向量, 向量长度16B,加密解密都使用加密器
  68.         dat_buff_init();
  69.         offset = 8; // 0~15
  70.         clk_start = bsp_cpu_clks_get();

  71.         memset(iv, 0xFF, 16);
  72.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  73.         mbedtls_aes_crypt_cfb128(aes_enc, MBEDTLS_AES_ENCRYPT, 512, &offset, iv, src, enc);

  74.         memset(iv, 0xFF, 16);
  75.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  76.         mbedtls_aes_crypt_cfb128(aes_enc, MBEDTLS_AES_DECRYPT, 512, &offset, iv, enc, dec);

  77.         dbg_print("\nAES CFB128 512 : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  78.         // 显示
  79.         //dbg_u8_print("src: \n", src, 64, 32);
  80.         dbg_u8_print("enc: \n", enc, 64, 32);
  81.         dbg_u8_print("dec: \n", dec, 64, 32);

  82.         /*------------------------------------------------------------------------*/
  83.         // 加密 + 解密         OFB                输出反馈模式
  84.         // 加密解密需要相同的初始向量, 向量长度16B,加密解密都使用加密器
  85.         dat_buff_init();
  86.         offset = 8; // 0~15
  87.         clk_start = bsp_cpu_clks_get();

  88.         memset(iv, 0xFF, 16);
  89.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  90.         mbedtls_aes_crypt_ofb(aes_enc, 512, &offset, iv, src, enc);

  91.         memset(iv, 0xFF, 16);
  92.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  93.         mbedtls_aes_crypt_ofb(aes_enc, 512, &offset, iv, enc, dec);

  94.         dbg_print("\nAES OFB 512 : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  95.         // 显示
  96.         //dbg_u8_print("src: \n", src, 64, 32);
  97.         dbg_u8_print("enc: \n", enc, 64, 32);
  98.         dbg_u8_print("dec: \n", dec, 64, 32);

  99.         // 释放,用于清除内存中的密匙,属于安全性代码
  100.         mbedtls_aes_free(aes_enc);
  101.         mbedtls_aes_free(aes_dec);

  102.         // 释放内存
  103.         free(src);
  104.         free(enc);
  105.         free(dec);
  106.         free(iv);
  107.         free(aes_enc);
  108.         free(aes_dec);
  109. }


DES测试:
  1. void des_demo(void)
  2. {
  3.         uu32 clk_start;

  4.         uu8 *src, *enc, *dec;
  5.         mbedtls_des_context *mbed_des_enc;
  6.         mbedtls_des_context *mbed_des_dec;

  7.         // 内存请求
  8.         src = calloc(1, 80);
  9.         enc = calloc(1, 80);
  10.         dec = calloc(1, 80);
  11.         mbed_des_enc = calloc(1, sizeof(mbedtls_des_context));
  12.         mbed_des_dec = calloc(1, sizeof(mbedtls_des_context));

  13.         dbg_puts("\n===========================================================\n");
  14.         dbg_print("mbed DES 64 test :\n");
  15.         memcpy(src, led_code, 8);
  16.         //memset(ptr, 0x53, 8);

  17.         mbedtls_des_init(mbed_des_enc);
  18.         mbedtls_des_init(mbed_des_dec);

  19.         // mbed des key creat
  20.         clk_start = bsp_cpu_clks_get();
  21.         mbedtls_des_setkey_enc(mbed_des_enc, (void *)"12345678");
  22.         mbedtls_des_setkey_dec(mbed_des_dec, (void *)"12345678");
  23.         dbg_print("key make time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  24.         // enc dec
  25.         clk_start = bsp_cpu_clks_get();
  26.         mbedtls_des_crypt_ecb(mbed_des_enc, src, enc);
  27.         mbedtls_des_crypt_ecb(mbed_des_dec, enc, dec);
  28.         dbg_print("enc and dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  29.         // displsy
  30.         dbg_u8_print("src: ", src, 8, 12);
  31.         dbg_u8_print("enc: ", enc, 8, 12);
  32.         dbg_u8_print("dec: ", dec, 8, 12);

  33.         // 清除内存关键数据
  34.         mbedtls_des_free(mbed_des_enc);
  35.         mbedtls_des_free(mbed_des_dec);

  36.         // 释放内存
  37.         free(src);
  38.         free(enc);
  39.         free(dec);
  40.         free(mbed_des_enc);
  41.         free(mbed_des_dec);
  42. }

测试结果
  1. AES 128 encode test: <128 bits>
  2. key make time: 454 us
  3. AES ecb : enc + dec time: 22 us
  4. enc: 39 5B AB C7 F2 72 0A AA F6 12 15 58 39 86 95 FF
  5. dec: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

  6. AES CBC 512 : enc + dec time: 807 us
  7. enc:
  8. 22 F6 8C 6E 7B B0 B5 53 AA 2C 24 36 58 E8 C6 DB 0D B2 B7 A7 11 D6 C9 65 F9 96 2B 40 14 A0 86 6A  =>line#1
  9. D2 6C 10 6E 07 B0 B2 50 C8 36 0B 56 3F A8 CE 33 D5 CC E4 60 4A 63 EE 52 9C 4A 14 33 82 D4 45 28  =>line#2
  10. C5 28 05 5D 4D B7 72 B1 6F 8A F1 C8 5C 9B B9 6C 95 9F 76 40 88 EF D5 D9 53 1F 9B 98 BE EA 3B 54  =>line#3
  11. 8C 5A 9C 12 E6 F9 DA FF 57 40 A7 46 D4 89 AD 72 44 AA 10 CB FF 12 52 56 37 B8 CA 42 57 54 6D CC  =>line#4
  12. dec:
  13. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  =>line#1
  14. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F  =>line#2
  15. 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F  =>line#3
  16. 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F  =>line#4

  17. AES CFB8 60 : enc + dec time: 1391 us
  18. enc:
  19. 83 EE 6E 28 BB 81 0A AC C6 50 74 E8 D7 F9 5D 88 9D 7B 71 31 35 00 43 6B 43 7F 1D 6D CE BD 7B B2  =>line#1
  20. 0E E6 4C 56 0A 06 59 2B D0 5B 8C 1C 04 15 55 A8 08 1E 97 91 81 D2 1E 55 27 93 DF F0 00 00 00 00  =>line#2
  21. dec:
  22. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  =>line#1
  23. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 00 00 00 00  =>line#2

  24. AES CFB128 512 : enc + dec time: 901 us
  25. enc:
  26. FF FE FD FC FB FA F9 F8 30 86 76 38 13 31 D3 CA C1 E2 A1 D4 C5 A9 64 5E D3 7E 48 C7 92 D4 47 3D  =>line#1
  27. 93 3E 3E 95 21 27 BC 8F 74 FD 9A 70 74 2A 94 74 44 4A E8 79 4A EF A2 8D 91 DC CB C9 4A 5E 6D 3A  =>line#2
  28. dec:
  29. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  =>line#1
  30. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F  =>line#2

  31. AES OFB 512 : enc + dec time: 863 us
  32. enc:
  33. FF FE FD FC FB FA F9 F8 8B CA FF BB 07 FC 73 5A A0 A5 53 25 65 7D D8 9A 64 9B 3E 77 AD F0 99 C4  =>line#1
  34. 9A 36 0B 7F 5F 27 D3 57 B5 31 E2 EF FF E1 C0 13 C3 A3 A7 13 77 22 07 E5 9D 9F FB 63 27 45 90 80  =>line#2
  35. dec:
  36. 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  =>line#1
  37. 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F  =>line#2

  38. ===========================================================
  39. mbed DES 64 test :
  40. key make time: 70 us
  41. enc and dec time: 27 us
  42. src: 3F 06 5B 4F 66 6D 7D 07
  43. enc: 27 94 E5 83 D9 76 42 6F
  44. dec: 3F 06 5B 4F 66 6D 7D 07
需要注意的是AES加密需要的堆栈比较大,建议任务堆栈分配3KB以上。
测试结果比预想的要好的多,AES加解密速度大约700KB/s.

另外,初始化代码默认开启了指令cache加速,关闭该功能进行测试,速度相差30%左右。

下面附上测试KEIL工程:
software.rar (3.48 MB, 下载次数: 20)
chenjun89 发表于 2022-2-14 08:16 来自手机 | 显示全部楼层
还没用过加解密
内政奇才 发表于 2022-2-14 10:12 来自手机 | 显示全部楼层
感谢楼主分享
gouguoccc 发表于 2022-2-15 19:10 来自手机 | 显示全部楼层
计算速度快嘛
 楼主| aple0807 发表于 2022-2-16 11:42 | 显示全部楼层

还可以,ECB模式,加密+解密一包数据22us,换算约700KB/s
海滨消消 发表于 2022-2-16 15:26 来自手机 | 显示全部楼层
这计算速度还是可以的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部